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

ose*_*ert 9 .net c# xelement

文件说:


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

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

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


所以它看起来像Nodes()有一个限制,但那为什么它存在?使用节点()有任何可能的原因或优点吗?

Evk*_*Evk 16

原因很简单:XNode是所有xml"parts"的基类(抽象)类,并且XElement只是一个这样的部分(因此XElement是子类XNode).考虑以下代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

第二个循环(over Elements())只返回一个项目:<el />

然而,第一个循环还将返回text node(some text)和comment node(<!-- comment -->),因此您可以看到差异.

您可以XNode在XNode类的文档中看到其他后代.


Gar*_*ill 5

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

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

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

<root>
  <element>
    <child>
     Text
    </child>
  </element>
  <!-- comment -->
  <element>
    <child>
      Text
    <child>
  </element>
</root>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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