2010-11-06 177 views
1

這個查詢不工作,因爲我期待它。任何人都看到了問題?需要一些XElement查詢的幫助

我試圖通過它的名稱獲取元素,但它沒有返回任何東西。下面是函數的具體一部分,我需要一些幫助:

alt text


更新

的解決方案是使用的XName而不是字符串。像這樣:

var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name))); 

回答

3

試着改變你的線路:

elements.Where(e => e.Name.LocalName == name) 

LocalName部分是重要的組成部分,否則你是一個比較stringXName的平等。請記住,XML支持樣式「prefix:element-name」的名稱。在該例子中,「前綴」是與由e.Name.Namespace返回的命名空間相關聯的標識符,並且「元素名稱」是由e.Name.LocalName返回的標識符。

+0

有趣 - 我有一種感覺,它可能與名稱空間有關,我會進一步調查。謝謝。 – 2010-11-06 20:38:19

1

我認爲您需要將根名稱空間添加到元素的名稱。 您也可以嘗試使用XContainer.Descendants(XName)方法。

2

Kirk's answer是對的錢。我想指出你的代碼有幾個問題。

此行不必要計算的所有元素:

var hasMatch = matchingElements.Count() > 0; 

你可以用Any()更換一次找到一個元素時,將提前終止:

var hasMatch = matchingElements.Any(); 

接下來,在覈實hasMatchtrue您應該致電First()而不是FirstOrDefault(),因爲您知道它必須具有此時的價值。

說了這麼多,你實際上可以重寫代碼如下:

var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name); 
return (string)matchingElement; 

這裏強制轉換爲string將返回如果它被發現的元素的值,否則將返回null。演員陣容僅用於null,因爲如果沒有找到元素,您將無法使用matchingElement.Value,這將拋出NullReferenceException。如果您期望只有一個元素存在,您還應該考慮使用SingleOrDefault

+0

感謝您的評論!我不知道.Any函數的優點。我很感激你花時間教這些優化。 – 2010-11-06 21:05:21