1

このクエリは、期待どおりに機能していません。誰かが問題を見ますか?

名前で要素を取得しようとしていますが、何も返されません。これが私が助けを必要としている関数の特定の部分です:

代替テキスト


アップデート

解決策は、文字列の代わりにXNameを使用することでした。そのようです:

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

3 に答える 3

3

行を次のように変更してみてください。

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

このLocalName部分は重要な部分です。そうでない場合は、とXNameの同等性を比較しているからstringです。XMLは「prefix:element-name」スタイルの名前をサポートしていることを忘れないでください。この例では、「prefix」はによって返される名前空間に関連付けられた識別子でe.Name.Namespaceあり、「element-name」はによって返される識別子e.Name.LocalNameです。

于 2010-11-06T20:32:41.137 に答える
2

カークの答えはお金に正解です。私はあなたのコードに関するいくつかの問題を指摘したいと思いました。

この行は、すべての要素を不必要にカウントします。

var hasMatch = matchingElements.Count() > 0;

Any()要素が見つかると早期に終了するものに置き換えることができます。

var hasMatch = matchingElements.Any();

次に、それを確認したら、その時点で値が必要であることがわかっているので、代わりに呼び出す必要がhasMatchあります。trueFirst()FirstOrDefault()

そうは言っても、実際には次のようにコードを書き直すことができます。

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

ここでaにキャストするstringと、要素が見つかった場合はその値が返され、見つからなかった場合は。が返されnullます。キャストは、要素が見つからなかった場合にスローするnullを使用できないため、念のために使用されます。要素が1つだけ存在することが予想される場合は、の使用も検討する必要があります。matchingElement.ValueNullReferenceExceptionSingleOrDefault

于 2010-11-06T20:54:41.203 に答える
1

要素の名前にルート名前空間を追加する必要があると思います。XContainer.Descendants(XName)代わりにこの方法を使用することもできます。

于 2010-11-06T20:23:51.953 に答える