XElement 和 XDocument 有啥区别?

Posted

技术标签:

【中文标题】XElement 和 XDocument 有啥区别?【英文标题】:What's the difference between XElement and XDocument?XElement 和 XDocument 有什么区别? 【发布时间】:2011-04-22 05:55:35 【问题描述】:

XElementXDocument 之间有什么区别,您什么时候使用它们?

【问题讨论】:

This MSDN link 让我们清楚地了解查询 XDocument 与查询 XElement。 【参考方案1】:

XDocument 代表整个 XML 文档。它通常由许多元素组成。

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

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

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

【讨论】:

XElement 没有加载方法:似乎不正确,请参阅Load(String) 和other overloading Load methods。【参考方案2】:

来自MSDN:

请注意,您只需创建 XDocument 对象,如果您需要 提供的特定功能 XDocument 类。在许多 情况下,可以直接工作 与 XElement。直接合作 XElement 是一个更简单的编程 型号。

XDocument 派生自 XContainer。 因此,它可以包含子节点。 但是,XDocument 对象可以有 只有一个子 XElement 节点。这 反映了那里的 XML 标准 只能是 XML 中的一个根元素 文件。

【讨论】:

【参考方案3】:

这是来自msdn 的一个实际示例,它说明了这一点。假设你在 test.xml 文件中有这个:

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

    使用 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 = XElementXDocument.Root.Elements() = XElement.Elements()。两者都源自XContainer。另一个小的区别是XElement 实现了IXmlSerializable,我认为这并不重要。 XElement 对于您只想查询子节点的绝大多数情况就足够了。不过这个名字让我很困惑,所以我更喜欢使用XDocument

【讨论】:

【参考方案4】:

根据 MSDN 文章 LINQ to XML vs. DOM,在子标题“直接使用 XML 元素”下:

使用 LINQ to XML 时,仅当您想在文档的根级别添加注释或处理指令时才使用 XDocument 类。

【讨论】:

以上是关于XElement 和 XDocument 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

XElement 和 XDocument 到底有什么区别?

使用 C# 和 XDocument/XElement 解析 Soap 响应

如何将 XElement 转换为 XDocument

将 XElement 合并到 XDocument 并解析命名空间

XDocument 在一行中写入特定的 XElement

VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement