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 而不是子树的形式返回。
这里可能出了什么问题?
根据 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