文档显示:
XContainer.Nodes() 方法 () 返回此元素或文档的子节点集合,按照文档顺序。
备注 请注意,内容不包括属性。在LINQ to XML中,属性不被视为树的节点。它们是与元素相关联的名称/值对。
XContainer.Elements() 方法 () 返回此元素或文档的子元素集合,按照文档顺序。
因此,看起来 Nodes() 有一定的限制,但为什么还要存在呢?是否有可能使用 Nodes() 的原因或优势呢?
文档显示:
XContainer.Nodes() 方法 () 返回此元素或文档的子节点集合,按照文档顺序。
备注 请注意,内容不包括属性。在LINQ to XML中,属性不被视为树的节点。它们是与元素相关联的名称/值对。
XContainer.Elements() 方法 () 返回此元素或文档的子元素集合,按照文档顺序。
因此,看起来 Nodes() 有一定的限制,但为什么还要存在呢?是否有可能使用 Nodes() 的原因或优势呢?
原因很简单:XNode
是所有XML "部分"的基础(抽象)类,而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);
}
第二个循环(使用Elements()
)仅返回一个项目:<el />
然而,第一个循环还将返回文本节点(some text
)和注释节点(<!-- comment -->
),所以你会看到差异。
您可以在XNode
的文档中了解其他后代。
节点“有限制”这种说法是不正确的。节点是大多数其他元素(包括元素)构建的基本组件。
XML文档被表示为层次结构(树),而节点用于表示层次结构的基本结构。
如果我们考虑以下XML文档:
<root>
<element>
<child>
Text
</child>
</element>
<!-- comment -->
<element>
<child>
Text
<child>
</element>
</root>
很明显,整个文档无法表示为元素,因为“子”元素中的注释和文本不是元素。相反,它被表示为节点层次结构。
在此文档中,有5个元素(根元素、两个“元素”元素和两个“子”元素)。所有这些都是节点,但也有另外3个节点:在“子”元素中的文本和注释。
说节点有“限制”是具有误导性的,因为它们没有属性。只有元素有属性,而元素是节点!但是还有其他节点(例如注释)不能具有属性。因此,并非所有类型的节点都具有属性。
从编码角度来看,Node是构建更高级别类型(如Element)的基类。如果要枚举文档中的元素,则使用XContainer.Elements()
是一个很好的快捷方式,但您也可以使用XContainer.Nodes()
获取所有节点,包括元素和其他内容。 (您可以检查节点的类型,以查看是否具有元素节点、文本节点或其他;如果是元素,则可以向上转型)。