【问题标题】:use LINQ on XmlNodeList在 XmlNodeList 上使用 LINQ
【发布时间】: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)

标签: c# .net xml linq


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多