递归调查 XML 的建议方法是什么?
XMLReader
///其他选项 XMLDocument
?XMLTextReader
我有点困惑,为什么我们有这么多读取 XML 的方法。
重要提示:我有一个约束,即 Xml 读取对象应该能够从给定的Stream
引用对象创建自己。
递归调查 XML 的建议方法是什么?
XMLReader
///其他选项 XMLDocument
?XMLTextReader
我有点困惑,为什么我们有这么多读取 XML 的方法。
重要提示:我有一个约束,即 Xml 读取对象应该能够从给定的Stream
引用对象创建自己。
两者都XDocument
支持XmlDocument
文档的随机访问,因此支持节点层次结构的双向遍历。因此,对于递归方法,其中任何一个都是不错的选择。
XDocument
专为使用 LINQ 而设计,而XmlDocument
在使用 XPath 查询文档时更方便。这真的是一个偏好问题和你当时需要的东西。两者都是同样有效的选项,并提供非常相似的功能。
XMLTextReader
效率更高,因为它只是一次从流中读取一个节点,而不验证整个文档图。但是,它是仅向前的,因此您无法遍历节点树以返回父节点,因此它可能不是您正在做的事情的好选择。
XMLReader
是XMLTextReader
(以及其他)的抽象基类,因此不能直接使用。
更新
由于您在上面的评论中提到,您真正想做的就是找到所有叶元素,因此您根本不需要使用递归。您可以利用 LINQ 或 XPath 为您完成所有工作。既然你说你不想使用 LINQ,下面是如何通过 XPath 来做到这一点XmlDocument
:
XmlNodeList leafElements = doc.SelectNodes("//*[not(node())]");
或与XDocument
:
IEnumerable<XElement> leafElements = doc.XPathSelectNodes("//*[not(node())]");
我自己一直偏爱XDocument。您想使用XDocument.Load(Stream)(或其重载之一)从流中读取数据。