XElement 和 XDocument 有啥区别?
Posted
技术标签:
【中文标题】XElement 和 XDocument 有啥区别?【英文标题】:What's the difference between XElement and XDocument?XElement 和 XDocument 有什么区别? 【发布时间】:2011-04-22 05:55:35 【问题描述】:XElement
和 XDocument
之间有什么区别,您什么时候使用它们?
【问题讨论】:
This MSDN link 让我们清楚地了解查询 XDocument 与查询 XElement。 【参考方案1】:XDocument 代表整个 XML 文档。它通常由许多元素组成。
XElement 表示一个 XML 元素(带有属性、子元素等)。它是较大文档的一部分。
在处理整个 XML 文档时使用 XDocument,在处理 XML 元素时使用 XElement。
例如 - XElement
有一个 HasAttributes
属性指示元素上是否存在任何属性,但 XDocument
没有,因为这样的属性在整个 XML 文档的上下文中是没有意义的。
【讨论】:
XElement 没有加载方法:似乎不正确,请参阅Load(String) 和other overloadingLoad
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 = XElement
或XDocument.Root.Elements() = XElement.Elements()
。两者都源自XContainer
。另一个小的区别是XElement
实现了IXmlSerializable
,我认为这并不重要。 XElement
对于您只想查询子节点的绝大多数情况就足够了。不过这个名字让我很困惑,所以我更喜欢使用XDocument
。
【讨论】:
【参考方案4】:根据 MSDN 文章 LINQ to XML vs. DOM,在子标题“直接使用 XML 元素”下:
使用 LINQ to XML 时,仅当您想在文档的根级别添加注释或处理指令时才使用 XDocument 类。
【讨论】:
以上是关于XElement 和 XDocument 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 和 XDocument/XElement 解析 Soap 响应