2010-02-02 106 views
2

這是我對代碼的看法(Linq查詢可以直接填充字典對象嗎?)。如何遍歷來自Linq查詢的XML元素結果集

XElement doc = XElement.Load(data.xml); 
string Element = "KeyNode"; 
string SearchString = "Dominion"; 
Dictionary<string, string> QueryData = new Dictionary<string, string>(); 

var query = from child in doc.Descendants(Element) 
      where SearchString == child.Value 
      select pn.Parent.Elements(); 


foreach(XElement x in query) 
{ 
    QueryData.Add(x.Name.ToString(),x.Value); 
} 

回答

1

我想這樣做是爲了創建字典:

var queryData = query.ToDictionary(x => x.Name.ToString(), x => x.Value); 

但是,如果你知道你的XML沒有任何重複的名稱,這只是安全的。如果它可能有重複的名稱,則可能希望在查詢中獲得明確的列表,或者調查ToLookup()作爲ToDictionary()的替代選項。

此外,您的代碼將標記名稱存儲爲字典鍵。如果這就是你需要的,那麼很好。但是如果你真的需要標籤屬性的值或類似的東西,那麼你需要改變你的代碼。

更新

我想我看到的問題是什麼。你從來沒有真正說明你在迭代結果中的困難是什麼,但我認爲這可能是:

Elements()方法返回一個IEnumerable<XElement>。這意味着您的query變量的類型實際上是IEnumerable<IEnumerable<XElement>>。如果你想把它壓扁到所有元素的單個列表,下面是如何:

var flattened = query.SelectMany(x => x); 
+0

謝謝你的字典部分,但嘗試它我需要迭代初始結果。 – Zion 2010-02-02 20:13:57

+0

就是這樣!叛軍在那裏,我相信天行者和他們在一起! 非常感謝,扁平化了訣竅。如果你能解釋爲什麼我的結果集產生了嵌套的枚舉數? – Zion 2010-02-02 20:31:41

+0

假裝你的select語句是'select child.Name.ToString()'。你會得到一個'IEnumerable '。你真正的選擇語句返回一系列元素(父母的所有孩子)。由於查詢的最終結果是每次調用select語句時產生的一系列值,並且每個select語句都返回一系列元素,所以最終會得到一系列元素序列。 – 2010-02-02 20:41:35