Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReadSubTree()始终返回NONE_C#_Xmlreader - Fatal编程技术网

C# ReadSubTree()始终返回NONE

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文件,XML格式如下:

<?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();