XElement Nodes()和Elements()的区别是什么?

12

文档显示:


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

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

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


因此,看起来 Nodes() 有一定的限制,但为什么还要存在呢?是否有可能使用 Nodes() 的原因或优势呢?


3
文本节点不是元素。注释不是元素。处理指令也不是元素。要访问它们需要使用“Nodes()”。 - Frédéric Hamidi
2个回答

20

原因很简单: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())仅返回一个项目:<el />

然而,第一个循环还将返回文本节点(some text)和注释节点(<!-- comment -->),所以你会看到差异。

您可以在XNode文档中了解其他后代。


5

节点“有限制”这种说法是不正确的。节点是大多数其他元素(包括元素)构建的基本组件。

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

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

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

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

在此文档中,有5个元素(根元素、两个“元素”元素和两个“子”元素)。所有这些都节点,但也有另外3个节点:在“子”元素中的文本和注释。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接