在XmlNodeList上使用LINQ

vsikbqxv  于 2023-09-28  发布在  其他
关注(0)|答案(4)|浏览(98)
<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总是“"。你能指出问题出在哪里吗?
非常感谢

lx0bsm1f

lx0bsm1f1#

除了由于非唯一的node变量(第一个在linq查询之外,第二个在“where”方法lambda中)而无法编译代码片段之外,您还在查询中遗漏了Attributes
应该是这样的

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

zphenhs42#

节点的InnerText是出现在<node></node>之间的文本。因此,对于例如<Y attributes />,没有内部文本。
您需要使用node => node.Attributes["id"].Value == "abc"

tquggr8v

tquggr8v3#

只需将XmlNodeList强制转换为List,如下所示:

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

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

chhkpiq44#

也许使用OfType<XmlElement>而不是Cast<XmlNode>更好

相关问题