2010-03-09 78 views
1

我的XML是什麼樣子:爲什麼不這樣的XElement查詢我的XML工作

<nodes> 
<node name="somekey"> 
<item name="subject">blah</item> 
<item name="body">body</item> 
</node> 
</nodes> 

而且到目前爲止我的代碼是:

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~/files/{0}/text.xml", "en"))); 

if (doc != null) 
{ 
    XElement element = doc.Elements().Where(e => e.Elements().Any() && e.Attribute("name").Value == "someKey").First(); 
} 

我收到一個錯誤說:

Sequence contains no elements 

我查詢錯了嗎?

我通過代碼加強,並出現了錯誤上的XElement行..

+0

您的查詢*應該*做什麼? – kristian

+0

得到鑰匙= somekey的元素,然後我有其他代碼來獲得主題和正文的價值。 – Blankman

回答

2

你想是這樣的:

var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault(); 

編輯:編輯以抓住從第一個元素結果;

+0

確定它的工作,如果我刪除「節點」,因爲子節點被稱爲在根節點。 – Blankman

1

您還可以使用:

var element = doc.Elements() 
       .Elements() 
       .Where(e => (e.Elements().Any() 
           && e.Attribute("name").Value == "somekey")) 
       .First(); 

說明:

doc.Elements()抓住了根元素,這是nodes。然後.Elements()選擇那個子元素,它只是一個,node。然後在該節點集上執行.Where(),這正是你想要的。 lambda選擇那些具有子元素的元素,並且還具有值「somekey」的屬性「name」。

您的原始代碼沒有得到Child-of-Child-elements。因此原始結果集是空的。

你也可以用.Descendants()做到這一點,但對我來說,這感覺有點草率和寬鬆。