【问题标题】:What is the difference XElement Nodes() vs Elements()?XElement Nodes() 与 Elements() 有什么区别?
【发布时间】:2016-06-10 09:19:51
【问题描述】:

文档说:


XContainer.Nodes 方法 () 按文档顺序返回此元素或文档的子节点的集合。

备注 请注意,内容不包括属性。在 LINQ to XML 中,属性不被视为树的节点。它们是与元素关联的名称/值对。

XContainer.Elements 方法 () 按文档顺序返回此元素或文档的子元素的集合。


所以看起来 Nodes() 有一个限制,但是为什么它存在呢?使用 Nodes() 有什么可能的原因或优势吗?

【问题讨论】:

  • 文本节点不是元素。评论不是元素。处理指令不是元素。您需要Nodes() 才能访问它们。

标签: c# .net xelement


【解决方案1】:

原因很简单:XNode 是所有 xml “部分”的基础(抽象)类,XElement 只是其中一个部分(所以XElementXNode 的子类)。考虑这段代码:

XDocument doc = XDocument.Parse("<root><el1 />some text<!-- comment --></root>");
foreach (var node in doc.Root.Nodes()) {
      Console.WriteLine(node);
}
foreach (var element in doc.Root.Elements()) {
      Console.WriteLine(element);
}

第二个循环(超过Elements())将只返回一项:&lt;el /&gt;

然而,第一个循环也将返回文本节点 (some text) 和评论节点 (&lt;!-- comment --&gt;),因此您会看到不同之处。

您可以在XNode类的documentaiton中看到XNode的其他后代。

【讨论】:

    【解决方案2】:

    节点并不是“有限制”的。节点是构建大多数其他事物(包括元素)的基本构建块。

    XML 文档表示为层次结构(树),节点用于表示层次结构的基本结构。

    如果我们考虑以下 XML 文档:

    <root>
      <element>
        <child>
         Text
        </child>
      </element>
      <!-- comment -->
      <element>
        <child>
          Text
        <child>
      </element>
    </root>
    

    显然,整个文档不能表示为元素,因为“子”元素中的注释和文本不是元素。相反,它表示为节点的层次结构。

    在本文档中,有 5 个元素(根元素、两个“元素”元素和两个“子”元素)。所有这些都是节点,但还有其他 3 个节点:“子”元素中的文本和评论。

    说节点有“限制”是一种误导,因为它们没有属性。只有元素有属性,元素节点!但是还有其他节点(例如评论)不能有属性。所以不是所有类型的节点都有属性。

    在编码方面,Node 是构建更高级别类型(如 Element)的基类。如果您想枚举文档中的元素,那么使用 XContainer.Elements() 是一个不错的捷径 - 但您可以也可以使用 XContainer.Nodes() 并获得 all节点,包括元素和其他东西。 (您可以检查节点的类型以查看是否有元素节点、文本节点或其他;如果是元素,则可以向上转换它)。

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2013-03-14
      • 2018-09-14
      • 2014-01-03
      • 2021-12-22
      相关资源
      最近更新 更多