我下面有用于处理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而不是子树。

这有什么问题吗?

最佳答案

根据MSDN,ReadSubTree将返回


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


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

如果您知道xml中的名称,则可以使用ReadToFollowing(nameOfNode)直接读取该节点。或在子树读取器上调用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

关于c# - XmlReader.ReadSubTree()始终返回NONE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27030710/

10-11 06:00