2016-06-10 60 views
3

文件說:XElement Nodes()vs Elements()有什麼區別?


XContainer.Nodes方法() 返回此元素或文檔的子節點的集合,按文檔順序。

備註 請注意,內容不包含屬性。在LINQ to XML中,屬性不被視爲樹的節點。它們是與元素關聯的名稱/值對。

XContainer.Elements方法() 按文檔順序返回此元素或文檔的子元素的集合。


所以它看起來像Nodes()有一個限制,但它爲什麼存在?使用節點()有任何可能的原因或優點嗎?

+3

文本節點不是元素。評論不是要素。處理指令不是元素。你需要'Nodes()'來訪問它們。 –

回答

8

理由很簡單:XNode爲所有XML「份」鹼(摘要)類,和XElement僅是一個這樣的部分(這樣XElementXNode子類)。考慮以下代碼:

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); 
} 

二回路(超過Elements())將只返回一個項目:<el />

第一循環但是也可以回到文本節點(some text)和註釋節點(<!-- comment -->),所以你看區別。

你可以看看XNode還有什麼其他後代documentaiton的XNode類。

0

節點「有限制」並非如此。節點是構建大多數其他事物(包括元素)的基本構建塊。

XML文檔表示爲層次結構(樹),並且節點用於表示層次結構的基本結構。

如果我們考慮下面的XML文檔:

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

顯然,整個文件不能被表示爲要素,從開始評論和「子」元素內的文本不是元素。相反,它表示爲節點的層次結構。

在本文檔中,有5個元素(根元素,兩個「元素」元素和兩個「子元素」)。所有這些都是節點,但也有3個其他節點:「子」元素內的文本和註釋。

這是誤導的說,節點有一個「限制」,因爲他們沒有屬性。只有元素具有屬性,並且元素節點!但是還有其他節點(例如註釋)不能擁有屬性。所以不是所有節點類型都有屬性。

在編碼方面,Node是構建諸如Element之類的高級類型的基類。如果你想搜索文檔中的元素,然後使用XContainer.Elements()是一個很好的快捷方式做到這一點 - 但你可以也使用XContainer.Nodes()並獲得所有的節點,包括元素和其他的東西。 (您可以檢查節點的類型以查看是否有元素節點,文本節點或其他任何元素;如果它是元素,則可以上傳它)。

相關問題