我有下面的代码用于处理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,而不是子树。
这里可能有什么问题?
答案 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