【问题标题】:XmlReader.ReadSubTree() always return NONEXmlReader.ReadSubTree() 总是返回 NONE
【发布时间】:2014-11-20 02:31:30
【问题描述】:

我有下面的代码用来处理XML文件,xml格式为:

<?xml version="1.0" encoding="UTF-8"?>
<Operation>
   <A>
      <First>F</First>
      <Second>S</Second>
   </A>
   <B>
      <Third>T</Third>
   </B>
</Operation>

读取子树的代码是:

XmlReader reader = XmlReader.Create(strReader, settings);
String name = reader.Name;
if (name.ToLower().Equals("operation"))
{
    XmlReader read = reader.ReadSubtree();  
    Console.WriteLine("Start is {0}", read.Name);
}

但函数 reader.ReadSubTree() 总是返回 NONE,而不是子树。

这里有什么问题?

【问题讨论】:

  • 您的意图到底是什么?你只需要特定的后代吗?
  • 是的,发布的 XML 只是一个示例,我的意图是从特定节点获取后代。

标签: c# xmlreader


【解决方案1】:

根据 MSDN,ReadSubTree 将返回

设置为 ReadState.Initial 的新 XML 阅读器实例。调用读取 方法将新阅读器定位在之前的当前节点上 调用 ReadSubtree 方法。

这就是您的新阅读器仍在初始位置的原因。下一次 Read() 调用会将其放置在父阅读器所在的 Operation 中。

如果您知道 xml 中的名称,则可以使用 ReadToFollowing(nameOfNode) 直接读取该节点。或者在子树阅读器上调用 Read 方法,直到到达所需的节点。请记住,如果保留的空格也是元素,那么它也会遍历这些元素。因此,一种选择是在创建阅读器时使用 XMLReaderSettings,并将 IgnoreWhiteSpace 属性设置为 true,这样它只会为您提供元素(xml 元素、声明、cmets 等)

查看此 MSDN 链接:

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree(v=vs.110).aspx

编辑:

如果你想以任何顺序遍历元素,你也可以使用 XElement,因为 XMLReader 是只向前的。

XElement operationReader = XElement.Load(strReader);

//You can use this collection to do your stuff. It will give you child of operation element
IEnumerable<XElement> foo = operationReader.Elements();

延伸阅读XElement on MSDN

【讨论】:

  • 感谢您的评论,关于 ReadToFollowing(Node) 功能,看起来 xmlreader 只能向前读取,不能返回,如果我需要读取特定节点名称或值怎么办,然后我需要返回并循环所有其他节点吗?
  • 是的,XMLReader 仅转发。您可以改为构建 XElement。这会给你很多选择,比如直接导航到一个节点。或者收集特定的后代。此外,它还支持 LINQ。阅读:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2015-12-21
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多