在 XmlNodeList 上使用 LINQ
Posted
技术标签:
【中文标题】在 XmlNodeList 上使用 LINQ【英文标题】:use LINQ on XmlNodeList 【发布时间】:2016-03-05 08:04:32 【问题描述】:<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 总是""。你能指出哪里有问题吗?
非常感谢
【问题讨论】:
好吧,您的 xml 节点没有内部文本。<Y id="abc" abv="a">This is the inner text</y>
。我忘记了确切的属性,但很可能是 node.Attributes["id"].Value == "abc"
和 Select(x => x.Attributes["abv"].Value)
【参考方案1】:
除了由于非唯一的node
变量(第一个在 linq 查询之外,第二个在“where”方法 lambda 中)而无法编译您的代码 sn-p 的事实之外,您还错过了Attributes
在您的查询中。
应该是这样的
var node = list.Cast<XmlNode>()
.Where(n => n.Attributes["id"].InnerText == "abc")
.Select(x => x.Attributes["abv"].InnerText);
【讨论】:
【参考方案2】:节点的InnerText
是出现在<node>
和</node>
之间的文本。因此,例如<Y attributes />
没有内部文本。
你需要使用node => node.Attributes["id"].Value == "abc"
【讨论】:
【参考方案3】:只需将 XmlNodeList 转换为 List,就像这样:
List<XmlNode> list = new List<XmlNode>();
foreach(XmlNode a in xmlNodeList)
list.Add(a);
list.OrderBy((element) => element.ChildNodes[0].InnerText);
【讨论】:
以上是关于在 XmlNodeList 上使用 LINQ的主要内容,如果未能解决你的问题,请参考以下文章