2010-10-07 98 views
25

XElementXDocument之間的區別是什麼,你什麼時候使用每一個?XElement和XDocument有什麼區別?

+2

[此MSDN鏈接](http://msdn.microsoft.com/zh-cn/library/bb675196.aspx)爲我們提供了有關查詢XDocument與查詢XElement的明確想法。 – CSharp 2013-03-06 07:23:24

回答

29

XDocument代表一個完整的XML文檔。它通常由一些元素組成。

​​代表一個XML元素(帶有屬性,子元素等)。它是更大文檔的一部分。

處理整個XML文檔時使用XDocument,使用XML元素時使用XElement。

例如 - XElement具有HasAttributes屬性指示是否在元件上存在的任何屬性,但一個XDocument沒有,因爲這樣的屬性是一個整體的XML文檔的上下文中無意義。

+1

_XElement has no load method_:似乎不正確,請參閱[Load(String)](http://msdn.microsoft.com/en-us/library/bb298435.aspx)和[其他重載'Load'方法](http: //msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx)。 – bluish 2011-03-24 08:34:02

+0

@bluish - 感謝您的糾正。答案已更新。 – Oded 2011-03-24 09:30:13

14

MSDN

請注意,您只需要創建 的XDocument對象,如果你需要得到 的XDocument類提供的 特定功能。在許多 的情況下,您可以直接使用XElement工作 。直接使用 XElement是一個更簡單的編程 模型。

XDocument派生自XContainer。 因此,它可以包含子節點。 但是,XDocument對象只能有 一個子XElement節點。此 反映了XML標準,其中 可能只是XML 文檔中的一個根元素。

16

下面是msdn的一個實例,它清楚地表明瞭這一點。假設你在測試中有這個。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; 
    
  2. 用的XElement如果你這樣做:

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

    你把它恢復:

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

    要在獲取值0點,你會做什麼:

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

總之,XElement忽略而XDocument犯規根節點。粗略地,XDocument.Root = XElementXDocument.Root.Elements() = XElement.Elements()。兩者都來自XContainer。另一個微小的區別是,XElement實施IXmlSerializable,我不認爲主要問題。 XElement對於絕大多數只想查詢子節點的情況就足夠了。這個名字讓我感到困惑,所以我更喜歡使用XDocument

0

根據MSDN文章LINQ to XML vs. DOM,副標題「與XML元素直接工作」:

當使用LINQ to XML,您使用的XDocument類唯一的,如果你想添加註釋或處理指令在文檔的根級別。