這個查詢不工作,因爲我期待它。任何人都看到了問題?需要一些XElement查詢的幫助
我試圖通過它的名稱獲取元素,但它沒有返回任何東西。下面是函數的具體一部分,我需要一些幫助:
更新
的解決方案是使用的XName而不是字符串。像這樣:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
這個查詢不工作,因爲我期待它。任何人都看到了問題?需要一些XElement查詢的幫助
我試圖通過它的名稱獲取元素,但它沒有返回任何東西。下面是函數的具體一部分,我需要一些幫助:
更新
的解決方案是使用的XName而不是字符串。像這樣:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
試着改變你的線路:
elements.Where(e => e.Name.LocalName == name)
的LocalName
部分是重要的組成部分,否則你是一個比較string
的XName
的平等。請記住,XML支持樣式「prefix:element-name」的名稱。在該例子中,「前綴」是與由e.Name.Namespace
返回的命名空間相關聯的標識符,並且「元素名稱」是由e.Name.LocalName
返回的標識符。
我認爲您需要將根名稱空間添加到元素的名稱。 您也可以嘗試使用XContainer.Descendants(XName)
方法。
Kirk's answer是對的錢。我想指出你的代碼有幾個問題。
此行不必要計算的所有元素:
var hasMatch = matchingElements.Count() > 0;
你可以用Any()
更換一次找到一個元素時,將提前終止:
var hasMatch = matchingElements.Any();
接下來,在覈實hasMatch
是true
您應該致電First()
而不是FirstOrDefault()
,因爲您知道它必須具有此時的價值。
說了這麼多,你實際上可以重寫代碼如下:
var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name);
return (string)matchingElement;
這裏強制轉換爲string
將返回如果它被發現的元素的值,否則將返回null
。演員陣容僅用於null
,因爲如果沒有找到元素,您將無法使用matchingElement.Value
,這將拋出NullReferenceException
。如果您期望只有一個元素存在,您還應該考慮使用SingleOrDefault
。
感謝您的評論!我不知道.Any函數的優點。我很感激你花時間教這些優化。 – 2010-11-06 21:05:21
有趣 - 我有一種感覺,它可能與名稱空間有關,我會進一步調查。謝謝。 – 2010-11-06 20:38:19