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
只是其中的一部分(所以 XElement
是 XNode
的子 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()
并获得 所有 节点,包括元素和其他东西。 (您可以检查节点的类型以查看您是否有元素节点、文本节点或其他任何内容;如果是元素,则可以将其向上转换)。
文档说:
XContainer.Nodes方法() Returns 此元素或文档的子节点集合,按文档顺序排列。
备注 请注意,内容不包括属性。在 LINQ to XML 中,属性不被视为树的节点。它们是与一个元素关联的 name/value 对。
XContainer.Elements方法() Returns 此元素或文档的子元素的集合,按文档顺序排列。
所以看起来 Nodes() 有一个限制,但为什么会存在呢?使用 Nodes() 有什么可能的原因或优势吗?
原因很简单:XNode
是所有xml"parts"的基础(抽象)class,而XElement
只是其中的一部分(所以 XElement
是 XNode
的子 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()
并获得 所有 节点,包括元素和其他东西。 (您可以检查节点的类型以查看您是否有元素节点、文本节点或其他任何内容;如果是元素,则可以将其向上转换)。