XElement和XDocument有什么区别?

39

XElementXDocument 的区别是什么,何时使用它们?


2
这个MSDN链接清楚地介绍了查询XDocument与查询XElement的区别。 - CSharp
4个回答

37

XDocument代表一个完整的XML文档,通常由多个元素组成。

XElement代表一个XML元素(带有属性、子元素等),它是一个更大文档的一部分。

当处理整个XML文档时,请使用XDocument;处理XML元素时,请使用XElement。

例如,XElement具有一个HasAttributes属性,指示元素上是否存在任何属性,但是XDocument没有该属性,因为在整个XML文档的上下文中,这样的属性是没有意义的。


1
_XElement没有load方法_:似乎不正确,请参见Load(String)其他重载的Load方法 - bluish

20

来自MSDN

请注意,只有在需要XDocument类提供的特定功能时才需要创建XDocument对象。在许多情况下,您可以直接使用XElement进行操作。直接使用XElement具有更简单的编程模型。

XDocument继承自XContainer。因此,它可以包含子节点。然而,XDocument对象只能拥有一个子XElement节点。这反映了XML标准中XML文档只能有一个根元素的规定。


18

以下是一个来自msdn的实际示例,它可以使事情更加清晰易懂。假设您有以下内容的test.xml文件:

<Root>
    <Child1>1</Child1>
    <Child2>2</Child2>
    <Child3>3</Child3>
</Root>
  1. 使用XDocument,如果您执行以下操作:

foreach (var element in XDocument.Load("test.xml").Elements())
    Console.WriteLine(element);

您会得到这个返回值:

<Root>
    <Child1>1</Child1>
    <Child2>2</Child2>
    <Child3>3</Child3>
</Root>

要获取Child1节点的值,您需要执行以下操作:

var child1 = XDocument.Load("test.xml").Element("Root").Element("Child1").Value;

或者

var child1 = XDocument.Load("test.xml").Root.Element("Child1").Value;
  • 使用XElement,如果你这样做:

    foreach (var element in XElement.Load("test.xml").Elements())
        Console.WriteLine(element);
    

    您会得到以下内容:

    <Child1>1</Child1>
    <Child2>2</Child2>
    <Child3>3</Child3>
    

    要获取Child1节点的值,您需要执行:

    var child1 = XElement.Load("test.xml").Element("Child1").Value;
    
    简而言之,XElement 忽略根节点而 XDocument 则不会。大致上讲,XDocument.Root = XElement 或者 XDocument.Root.Elements() = XElement.Elements()。两者都是从 XContainer 类派生的。另一个小差异是,XElement 实现了 IXmlSerializable 接口,但我认为这在大多数情况下并不重要。对于绝大多数只需查询子节点的情况,XElement 已足够使用。尽管名称有些令人困惑,但我更喜欢使用 XDocument

  • 1
    根据MSDN文章LINQ to XML vs. DOM,在“直接使用XML元素”子标题下所述:
    当使用LINQ to XML时,仅在您想要在文档的根级别添加注释或处理指令时才使用XDocument类。

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