このクエリは、期待どおりに機能していません。誰かが問題を見ますか?
名前で要素を取得しようとしていますが、何も返されません。これが私が助けを必要としている関数の特定の部分です:
アップデート
解決策は、文字列の代わりにXNameを使用することでした。そのようです:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
行を次のように変更してみてください。
elements.Where(e => e.Name.LocalName == name)
このLocalName
部分は重要な部分です。そうでない場合は、とXName
の同等性を比較しているからstring
です。XMLは「prefix:element-name」スタイルの名前をサポートしていることを忘れないでください。この例では、「prefix」はによって返される名前空間に関連付けられた識別子でe.Name.Namespace
あり、「element-name」はによって返される識別子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
を使用できないため、念のために使用されます。要素が1つだけ存在することが予想される場合は、の使用も検討する必要があります。matchingElement.Value
NullReferenceException
SingleOrDefault
要素の名前にルート名前空間を追加する必要があると思います。XContainer.Descendants(XName)
代わりにこの方法を使用することもできます。