以递归方式研究XML的建议方法是什么?
XMLReader
/ XMLDocument
/ XMLTextReader
/其他选项?
我有点困惑为什么我们有这么多方法来阅读XML。
重要提示:我有一个约束,即Xml读取对象应该能够从给定的Stream
引用对象创建自己。
答案 0 :(得分:3)
XDocument
和XmlDocument
都支持文档的随机访问,因此支持节点层次结构的双向遍历。因此,其中任何一个都是递归方法的好选择。
XDocument
用于处理LINQ,而XmlDocument
在使用XPath查询文档时更方便。这真的是一个偏好问题,当时你需要什么。两者都是同样有效的选项,并提供非常相似的功能。
XMLTextReader
更有效,因为它只是从流中一次读取一个节点,而不验证整个文档图。但是,它是仅向前的,因此您不能遍历备份节点树以返回父节点,因此它可能不是您正在做的事情的好选择。
XMLReader
是XMLTextReader
(以及其他)的抽象基类,因此无法直接使用。
<强>更新强>
由于您在上面的注释中提到过,您真正想要做的就是查找所有叶元素,您根本不需要使用递归。您可以利用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)(或其中一个重载)来读取流中的数据。