XElement Nodes() 与 Elements() 有什么区别?

What is the difference XElement Nodes() vs Elements()?

文档说:


XContainer.Nodes方法() Returns 此元素或文档的子节点集合,按文档顺序排列。

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

XContainer.Elements方法() Returns 此元素或文档的子元素的集合,按文档顺序排列。


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

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

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() 上)只会 return 一项:<el />

然而,第一个循环将 return 也是文本节点 (some text) 和注释节点 (<!-- comment -->),因此您会看到区别。

您可以在 XNode class.

documentaiton 中查看 XNode 的其他后代

节点"have a limitation"不是这样的。节点是构建大多数其他事物(包括元素)的基本构建块。

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

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

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

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

在此文档中,有 5 个元素(根元素、两个 "element" 元素和两个 "child" 元素)。所有这些 都是 节点,但还有 3 个其他节点:"child" 元素中的文本和注释。

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

在编码术语中,Node 是 class 构建更高级别类型(例如 Element)的基础。如果您想枚举文档中的元素,那么使用 XContainer.Elements() 是一个很好的快捷方式 - 但您 可以 也可以使用 XContainer.Nodes() 并获得 所有 节点,包括元素和其他东西。 (您可以检查节点的类型以查看您是否有元素节点、文本节点或其他任何内容;如果是元素,则可以将其向上转换)。