哪个XML读取对象适合递归xml调查?

时间:2012-12-22 13:09:01

标签: c# .net xml xmldocument xmlreader

以递归方式研究XML的建议方法是什么? XMLReader / XMLDocument / XMLTextReader /其他选项?

我有点困惑为什么我们有这么多方法来阅读XML。

重要提示:我有一个约束,即Xml读取对象应该能够从给定的Stream引用对象创建自己。

2 个答案:

答案 0 :(得分:3)

XDocumentXmlDocument都支持文档的随机访问,因此支持节点层次结构的双向遍历。因此,其中任何一个都是递归方法的好选择。

XDocument用于处理LINQ,而XmlDocument在使用XPath查询文档时更方便。这真的是一个偏好问题,当时你需要什么。两者都是同样有效的选项,并提供非常相似的功能。

XMLTextReader更有效,因为它只是从流中一次读取一个节点,而不验证整个文档图。但是,它是仅向前的,因此您不能遍历备份节点树以返回父节点,因此它可能不是您正在做的事情的好选择。

XMLReaderXMLTextReader(以及其他)的抽象基类,因此无法直接使用。

<强>更新

由于您在上面的注释中提到过,您真正想要做的就是查找所有叶元素,您根本不需要使用递归。您可以利用LINQ或XPath为您完成所有工作。既然你说你不想使用LINQ,那么这里是如何通过XmlDocument使用XPath来实现的:

XmlNodeList leafElements = doc.SelectNodes("//*[not(node())]");

XDocument

IEnumerable<XElement> leafElements = doc.XPathSelectNodes("//*[not(node())]");

答案 1 :(得分:1)

我自己一直偏爱XDocument。您希望使用XDocument.Load(Stream)(或其中一个重载)来读取流中的数据。