Использовать LINQ в XmlNodeList

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

Я хочу выбрать node, чей идентификатор "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 всегда "". Можете ли вы указать, где проблема?

Спасибо большое

Ответ 1

InnerText для node - это текст, который появляется между <node> и </node>. Так, например, <Y attributes /> нет внутреннего текста.

Вам нужно использовать node => node.Attributes["id"].Value == "abc"

Ответ 2

Помимо того, что ваш фрагмент кода не будет скомпилирован из-за неуникальной переменной node (сначала вне запроса linq, а затем в лямбде-метода "где"), вы также пропустили Attributes в своем запросе.

Это должно быть что-то вроде

var node = list.Cast<XmlNode>()
               .Where(n => n.Attributes["id"].InnerText == "abc")
               .Select(x => x.Attributes["abv"].InnerText);

Ответ 3

Просто приведите XmlNodeList к списку, вот так:

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

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