2012-07-09 84 views
0

我想從以下XMLLinq查詢選擇子節點

<root> 
    <parent> 
    <child>value 1</child> 
    <child>value 2</child> 
    </parent> 
    <parent> 
    <child>value 1</child> 
    <child>value 4</child> 
    </parent> 
</root> 

選擇童的所有不同值的多個元素我嘗試以下操作:

var vals = (from res in XmlResources.Elements("root").Elements("parent") select res) 
             .SelectMany(r => r.Elements("child")).Distinct().ToList(); 

,但不能得到的價值從它,給我的價值包裝在標籤,而不是Distinct

是否有可能顯示兩種方式來獲取它 - 查詢和鏈接aka lambda。

回答

1

是有可能左右逢源

var doc = new XDocument("your xml string"); 
var values = (from c in doc.Root.Descendants("child") select c.Value).Distinct(); 

//鏈接風格

var values = doc.Root.Descendants("child").Select(c=>c.Value).Distinct(); 
+0

真棒,謝謝!沒有意識到我可以直接去孩子,試圖通過元素(「根」)鏈接到它。元素(「父母」) – 2012-07-09 08:51:10

+0

爲什麼你只用'.Select(c => c .Value)'會更簡單嗎?另請注意它是'Select',而不是'select'。 – 2012-07-09 09:19:50

+0

(我編輯過'select'到'Select',並且修正了'Descendants'和字符串文字的名字...我假設你不介意。我已經把lambda表達式留在了尷尬的地方語法的時刻,以防萬一你真的想這樣。) – 2012-07-09 09:21:56

2

你選擇的元素,和元素是完全不同的。您需要獲取不同的。例如:

var values = XmlResources.Element("root") 
         .Elements("parent") 
         .Elements("child") 
         .Select(x => x.Value) 
         .Distinct(); 

在這裏使用查詢表達式確實沒有任何好處 - 它只會增加cruft。我只在查詢有多個方面時才使用查詢表達式(例如,其中是有意義的選擇或聯接)。對於只是一個選擇只是一個在哪裏這是非常沒有意義的。所以是的,你可以使用:

var values = (from x in XmlResources.Element("root") 
            .Elements("parent") 
            .Elements("child") 
       select x.Value).Distinct(); 

......但你爲什麼?這是一個不太明確的國際海事組織。

請注意,如果你沒有太在意根/父/子層級,並高興地只得到所有child後代,你可以使用:

var values = XmlResources.Descendants("child") 
         .Select(x => x.Value) 
         .Distinct(); 
+0

謝謝,會考慮到這一點,只想學習處事查詢的方式。 – 2012-07-09 09:00:18

+0

oooh ..當下一個是Jon Skeet時,我接受了我的答案:) – 2012-07-09 09:06:29

+1

@SergejPopov:學習如何爲上下文做適當的事情 - 不要強迫自己在沒有幫助時使用查詢表達式。這就像在你可以直接調用某些東西時強迫自己使用反射一樣...... – 2012-07-09 09:20:46