C# 哪个XML读取对象适合于递归XML调查?

C# 哪个XML读取对象适合于递归XML调查?,c#,.net,xml,xmldocument,xmlreader,C#,.net,Xml,Xmldocument,Xmlreader,递归地研究XML的建议方法是什么? XMLReader/XMLDocument/XMLTextReader/其他选项 我有点困惑,为什么我们有这么多的方法来读取XML 重要提示:我有一个约束,即Xml读取对象应该能够从给定的流引用对象创建自己。我一直偏爱自己。您可能希望使用或其重载之一从流中读取数据。XDocument和XmlDocument都支持对文档的随机访问,因此支持双向遍历节点层次结构。因此,对于递归方法来说,这两种方法都是很好的选择 XDocument设计用于使用LINQ,而XmlDo

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

我有点困惑,为什么我们有这么多的方法来读取XML


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

我一直偏爱自己。您可能希望使用或其重载之一从流中读取数据。

XDocument和XmlDocument都支持对文档的随机访问,因此支持双向遍历节点层次结构。因此,对于递归方法来说,这两种方法都是很好的选择

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

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

XMLReader是XMLTextReader的抽象基类,因此不能直接使用

更新

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

或使用XDocument:


不清楚您要做什么,但使用xml最方便的方法是LINQ到xml。您可以从流中加载XDocument。@lazyberezovsky:我现在愿意避免LINQ查询,因为我需要更多的时间来学习如何正确使用它,所以现在我需要最合适的方法来对分层xml进行递归。我的递归结束条件应该基于当前元素是否没有子元素,然后我将从这个级别获取一些信息并返回。否则,我想深入研究当前元素的递归,开始检查他自己的孩子。您可以将XPathSelectElement与XDocumentWell一起使用,只是要提到,XMLReader可以直接使用,甚至可以创建,这有点奇怪,因为它是抽象的。看:@lazyberezovsky是的,这真的不难。我想我应该说它更常用于XPath,而不是说它更方便。无论如何,回到主题,大家都同意使用Xdocument和XPathSelectElement将是最简单和最适合我的评论吗lazyberezovsky@JavaSa好Create返回一个新对象,该对象的类型是从基本XMLReader类派生的。它显然不会创建XMLReader对象,因为它是一个抽象类,所以没有这样的东西。
XmlNodeList leafElements = doc.SelectNodes("//*[not(node())]");
IEnumerable<XElement> leafElements = doc.XPathSelectNodes("//*[not(node())]");