C# ReadSubTree()始终返回NONE
下面的代码用于处理XML文件,XML格式如下:C# ReadSubTree()始终返回NONE,c#,xmlreader,C#,Xmlreader,下面的代码用于处理XML文件,XML格式如下: <?xml version="1.0" encoding="UTF-8"?> <Operation> <A> <First>F</First> <Second>S</Second> </A> <B> <Third>T</Third> </B> &l
<?xml version="1.0" encoding="UTF-8"?>
<Operation>
<A>
<First>F</First>
<Second>S</Second>
</A>
<B>
<Third>T</Third>
</B>
</Operation>
但是函数reader.ReadSubTree()总是返回NONE,而不是subtree
这里可能有什么问题?根据MSDN,ReadSubTree将返回 新的XML读取器实例设置为ReadState.Initial。呼唤阅读 方法将新读卡器定位到以前的当前节点上 对ReadSubtree方法的调用 这就是为什么您的新阅读器仍处于初始位置。下一个Read()调用将把它放在父读取器所在的操作中 如果知道xml中的名称,可以使用ReadToFollow(nameOfNode)直接读取该节点。或者在子树读取器上调用Read方法,直到到达所需的节点。请记住,如果保留的话,空格也是元素,所以它也会遍历这些元素。因此,一种选择是在创建读取器时使用XMLReaderSettings,并将IgnoreWhiteSpace属性设置为true,以便它只提供元素(xml元素、声明、注释等) 请参阅此MSDN链接: 编辑: 如果希望以任意顺序遍历元素,也可以使用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 operationReader=XElement.Load(strReader);
//您可以使用此集合来完成您的工作。它将为您提供操作元素的子元素
IEnumerable foo=operationReader.Elements();
进一步阅读您在这里的具体意图是什么?您是否只需要特定的子体?是的,发布的XML只是一个示例,我的目的是从特定节点获取子体。感谢您对ReadToFollowing(node)函数的评论,看起来xmlreader只能向前读取,不能向后读取,如果我需要读取特定的节点名称或值,该怎么办,然后我需要返回并循环所有其他节点?是的,XMLReader仅向前。您可以构建一个XElement。这将为您提供许多选项,如直接导航到节点。或者收集特定的后代。此外,它还支持LINQ。请阅读以下内容:
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();