首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不向前移动的情况下从XmlReader读取?

如何在不向前移动的情况下从XmlReader读取?
EN

Stack Overflow用户
提问于 2010-06-01 06:48:10
回答 6查看 13.7K关注 0票数 13

我有这样的设想:

代码语言:javascript
运行
复制
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  
        }
    }
}

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

有些节点将是良好的XML,并将进入XElement,然而,有些节点则不会。

在这个过程中,我不仅要抓住标准的XmlException的东西.我还想获取当前Xml的摘录和字符串。

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

如何在不干扰其位置的情况下获得阅读器OuterXml内容的“快照”?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-18 22:40:10

实际上,ReadSubtree将返回一个“包装”原始阅读器的读取器。因此,阅读新的,最终也将推进原来的。您必须将XmlReader看作是一个前进的唯一读取器,它根本不能返回。至于您的场景,您可以向读者询问输入文件中的位置,而不是试图记住XML的一部分。只要把它转换到IXmlLineInfo接口,它就有了返回线和位置的方法。使用它,您可以记住一些起始位置(在所讨论的元素之前),然后记住错误的结束位置。然后将该部分从intput文件中读取为纯文本。

票数 11
EN

Stack Overflow用户

发布于 2015-07-17 16:56:54

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

代码语言:javascript
运行
复制
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();
}                  
票数 5
EN

Stack Overflow用户

发布于 2010-06-01 08:19:52

不要在阅读器上使用任何“读”操作--正如你已经发现的那样,这会使它提前。使用对属性(如reader.HasValuereader.Value )的调用来检查内容。在对象浏览器中查找'XmlReader‘,您可以读取很多属性。

编辑:我认为没有简单获取XML的简单方法,可能是因为当前节点本身可能不是有效的XML,例如XmlWhiteSpace、XmlText节点甚至XmlAttribute。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2947760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档