使用C#查找具有其path和id属性值的单个节点

时间:2019-07-29 16:39:29

标签: c# xpath xmldocument

说我有以下xml,我想获取ID为> db.errs.drop() true > db.problems.drop() true > db.backtraces.drop() true > db.notices.drop() true > db.comments.drop() 的单个节点的version属性的值,预计该值为Pkg1

1.2.3

下面是我的尝试,但是目标节点在<project> <nugets id='test'> </nugets> <packages> <package id='test1' version='1'/> <package id='Pkg1' version='1.2.3'/> <package id='Pkg1Test' version='4.5.6'/> </packages> </project> 字段中,作为目标节点的字符串:

OuterXml

这似乎可行:XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlStr); string path = "project/packages/package[@id='Pkg1']"; // target node has id=Pkg1 var targetNode = xmlDoc.SelectSingleNode(path); Console.WriteLine($"{targetNode.OuterXml}"); // prints out the target node as string. ,这是获取属性值的正确方法,以及为什么节点位于string version = targetN.Attributes["version"].Value中吗?

1 个答案:

答案 0 :(得分:1)

以下是可以满足您需要的工作代码:

private const string str = @"
<project>
   <nugets id='test'> </nugets>
   <packages>
      <package id='test1' version='1'/>
      <package id='Pkg1' version='1.2.3'/>
      <package id='Pkg1Test' version='4.5.6'/>
   </packages>
</project>";
        private static void Test()
        {
            var el = XElement.Parse(str);
            var packages = el.Element("packages")?
                .Elements("package")
                .ToList();
            var package = packages?
                .FirstOrDefault(x => x.Attribute("id")?.Value == "Pkg1");
            var id = package?.Attribute("version")?.Value;
            Console.Write(id);
        }