web-dev-qa-db-ja.com

XmlNodeListでLINQを使用する

<X version="1.0">
  <Y id="abc" abv="a"/>
  <Y id="edf" abv="e"/>
</X>

Idが「abc」であるノードを選択し、そのabv「a」を返します。

XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XmlNodeList list = doc.SelectNodes("X/Y");
var node = list.Cast<XmlNode>().Where(node => node["id"].InnerText == "abc")
                               .Select(x=>x["abv"].InnerText);

ただし、それは機能しません。node["id"]。InnerTextは常に ""です。どこが問題なのか指摘できますか?

どうもありがとう

18
ZHE.ZHAO

ノードのInnerTextは、<node></node>の間に表示されるテキストです。したがって、たとえば<Y attributes />の場合、内部テキストはありません。

node => node.Attributes["id"].Value == "abc"を使用する必要があります

6
David Arno

一意でないnode変数(最初はlinqクエリの外側、2番目は "where"メソッドラムダ)のためにコードスニペットがコンパイルされないという事実とは別に、クエリでAttributesも見逃しました。

それは次のようなものでなければなりません

_var node = list.Cast<XmlNode>()
               .Where(n => n.Attributes["id"].InnerText == "abc")
               .Select(x => x.Attributes["abv"].InnerText);
_
21
Andy Korneyev

次のように、XmlNodeListをListにキャストするだけです。

            List<XmlNode> list = new List<XmlNode>();

            foreach(XmlNode a in xmlNodeList)
            {
                list.Add(a);
            }
            list.OrderBy((element) => element.ChildNodes[0].InnerText);
0
Bartosz546