Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XElement Nodes()与Elements()有什么区别?_C#_.net_Xelement - Fatal编程技术网

C# XElement Nodes()与Elements()有什么区别?

C# XElement Nodes()与Elements()有什么区别?,c#,.net,xelement,C#,.net,Xelement,文件说: XContainer.Nodes方法() 按文档顺序返回此元素或文档的子节点的集合 评论 请注意,内容不包括属性。在LINQ to XML中,属性不被认为是树的节点。它们是与元素关联的名称/值对 XContainer.Elements方法() 按文档顺序返回此元素或文档的子元素的集合 看起来Nodes()有一个限制,但为什么它会存在呢?使用Nodes()有任何可能的原因或优点吗?原因很简单:XNode是所有xml“部分”的基本(抽象)类,XElement只是其中一个部分(因此XEl

文件说:


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);
}
XDocument doc=XDocument.Parse(“一些文本”);
foreach(doc.Root.Nodes()中的var节点){
控制台写入线(节点);
}
foreach(doc.Root.Elements()中的var元素){
控制台写入线(元素);
}
第二个循环(通过
元素()
)将只返回一项:

然而,第一个循环还将返回文本节点(
some text
)和注释节点(
),因此您可以看到区别


您可以查看XNode类的其他子类中有哪些子类。

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

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

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

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

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

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

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


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

文本节点不是元素。注释不是元素。处理指令不是元素。您需要
节点()
才能访问它们。