XmlReader.ReadSubTree() 总是返回 NONE

本文关键字:返回 NONE ReadSubTree XmlReader | 更新日期: 2023-09-27 18:31:01

我有下面的代码,用于处理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);
}

而是函数阅读器。ReadSubTree() 始终以 NONE 而不是子树的形式返回。

这里可能出了什么问题?

XmlReader.ReadSubTree() 总是返回 NONE

根据 MSDN,ReadSubTree 将返回

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

这就是为什么您的新阅读器仍然在初始位置的原因。下一个 Read() 调用将把它放在父读取器所在的操作中。

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

请参阅此 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