Xelementクエリを使用してヘルプが必要です
質問
このクエリは、私が期待しているように機能していません。誰かが問題を見ていますか?
私はその名前で要素を取得しようとしていますが、それは何も返していません。これが私が助けが必要な関数の特定の部分です:
アップデート
解決策は、文字列の代わりにxNameを使用することでした。そのようです:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
解決
ラインを変更してみてください。
elements.Where(e => e.Name.LocalName == name)
LocalName
それ以外の場合は、あなたがの平等を比較しているため、部分は重要な部分です XName
とともに string
. 。 XMLは、スタイル「プレフィックス:要素名」の名前をサポートしています。その例では、「プレフィックス」は、によって返される名前空間に関連付けられた識別子です e.Name.Namespace
「要素名」は、によって返される識別子です e.Name.LocalName
.
他のヒント
カークの答え お金に正しい。私はあなたのコードに関するいくつかの問題を指摘したかった。
この行は、すべての要素を不必要にカウントします。
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;
ここでaにキャストします string
要素が見つかった場合、要素の値を返し、それ以外の場合は戻ります null
. 。キャストは、そうであった場合に備えて使用されます null
使用できないので matchingElement.Value
それはaを投げます NullReferenceException
要素が見つからなかった場合。また、使用を検討する必要があります SingleOrDefault
1つの要素のみが存在すると予想される場合。
ルートネームスペースを要素の名前に追加する必要があると思います。使用することもできます XContainer.Descendants(XName)
代わりにメソッド。