在 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 节点没有内部文本。 &lt;Y id="abc" abv="a"&gt;This is the inner text&lt;/y&gt;。我忘记了确切的属性,但很可能是 node.Attributes["id"].Value == "abc"Select(x =&gt; 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 是出现在&lt;node&gt;&lt;/node&gt; 之间的文本。因此,例如&lt;Y attributes /&gt; 没有内部文本。

你需要使用node =&gt; 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 xPath 和通配符过滤 XMLNodeList

将 XmlNodeList 加载到 XmlDocument 中而不循环?

如何用同名节点的所有子节点填充 XmlNodeList?

将XmlNodeList转换为DataTable

如何从 xmlnodelist 获取 xml 节点

C#将多个XMLNode或XMLNodeList从一个XMLDocument复制到另一个XMLDocument