XmlReader.ReadSubTree()始终返回NONE

时间:2014-11-20 02:31:31

标签: 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>
</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,而不是子树。

这里可能有什么问题?

1 个答案:

答案 0 :(得分:3)

根据MSDN,ReadSubTree将返回

  

设置为ReadState.Initial的新XML阅读器实例。打电话给读   方法将新阅读器定位在之前的当前节点上   对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