文件说:
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类的文档中看到其他后代.
节点并不是“有限制”。节点是构建大多数其他事物(包括元素)的基本构建块。
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()并获取所有节点,包括元素和其他内容。(您可以检查节点的类型以查看是否有元素节点、文本节点或其他节点;如果它是元素,则可以向上转换它)。