質問

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

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

alt text


アップデート

解決策は、文字列の代わりに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();

次に、それを確認しました hasMatchtrue 電話する必要があります 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) 代わりにメソッド。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top