如何从XmlReader中读取而不向前移动它

and*_*ndy 8 .net c# xml xmlreader xml-parsing

嘿伙计们,我有这个场景:

while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element && reader.Name == itemElementName)
    {
        XElement item = null;
        try
        {
            item = XElement.ReadFrom(reader) as XElement;
        }
        catch (XmlException ex)
        {
           //log line number and stuff from XmlException class  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的循环中,我将某个节点(itemElementName)转换为XElement.

一些节点将是良好的XML并将进入XElement,但有些节点不会.

在CATCH中,我不仅要捕获标准的XmlException内容......我还想捕获当前Xml和字符串的提取.

但是,如果我在将节点传递给XElement之前对节点执行任何类型的READ操作,它会向前移动读取器.

如何在不干扰其位置的情况下获取阅读器外部内容的"快照"?

Vit*_*SFT 10

实际上,ReadSubtree将返回一个"包装"原始阅读器的阅读器.因此,通过新的阅读将最终推进原始的.您必须将XmlReader视为仅向前阅读器,它根本无法返回.至于您的场景,您可以向读者询问输入文件中的位置,而不是尝试记住部分XML.只需将其强制转换为IXmlLineInfo接口,它就有返回行和位置的方法.使用它你可以记住一些起始位置(在有问题的元素之前),然后记住错误的结束位置.然后从intput文件中读取该部分作为纯文本.


小智 5

另一个想法:读取外部 XML(使阅读器前进),然后从这个 XML 创建一个新的阅读器,它允许您“返回”并处理当前节点的元素。

while (r.ReadToFollowing("ParentNode"))
{
    parentXml = r.ReadOuterXml();

    //since ReadOuterXml() advances the reader to the next parent node, create a new reader to read the remaining elements of the current parent
    XmlReader r2 = XmlReader.Create(new StringReader(parentXml));
    r2.ReadToFollowing("ChildNode");
    childValue = r2.ReadElementContentAsString();
    r2.Close();
}                  
Run Code Online (Sandbox Code Playgroud)