Ответ 1
InnerText
для node - это текст, который появляется между <node>
и </node>
. Так, например, <Y attributes />
нет внутреннего текста.
Вам нужно использовать node => node.Attributes["id"].Value == "abc"
<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 всегда "". Можете ли вы указать, где проблема?
Спасибо большое
InnerText
для node - это текст, который появляется между <node>
и </node>
. Так, например, <Y attributes />
нет внутреннего текста.
Вам нужно использовать node => node.Attributes["id"].Value == "abc"
Помимо того, что ваш фрагмент кода не будет скомпилирован из-за неуникальной переменной node
(сначала вне запроса linq, а затем в лямбде-метода "где"), вы также пропустили Attributes
в своем запросе.
Это должно быть что-то вроде
var node = list.Cast<XmlNode>()
.Where(n => n.Attributes["id"].InnerText == "abc")
.Select(x => x.Attributes["abv"].InnerText);
Просто приведите XmlNodeList к списку, вот так:
List<XmlNode> list = new List<XmlNode>();
foreach(XmlNode a in xmlNodeList)
{
list.Add(a);
}
list.OrderBy((element) => element.ChildNodes[0].InnerText);