【问题标题】:XmlDocument XPath expression failingXmlDocument XPath 表达式失败
【发布时间】:2016-12-23 21:44:31
【问题描述】:

我正在使用 C# XmlDocument API。

我有以下 XML:

<Node1>
    <Node2>
        <Node3>
        </Node3>
    </Node2>
</Node1> 

我想将 Node3 作为 XmlNode。但我的代码返回 null:

XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root_node = doc.DocumentElement.SelectSingleNode("/Node1");

Log(root_node.OuterXml);
XmlNode test_node = root_node.SelectSingleNode("/Node2/Node3");

if (test_node == null)
    Logger.Log.Error(" --- TEST NODE IS NULL --- ");

root_node.OuterXml日志的日志

<Node1><Node2><Node3>.....

但是 test_node 返回 null。

这里出了什么问题?

【问题讨论】:

  • 你想在这里完成什么?
  • test_node 的范围为 Node3,并且不能为空。

标签: c# xpath xmldocument


【解决方案1】:

使用路径"Node2/Node3" 而不是"/Node2/Node3"

XmlNode test_node = root_node.SelectSingleNode("Node2/Node3");

在 XPath 表达式中,前导正斜杠 / 表示文档的根。表达式 "/Node2/Node3" 不起作用,因为 &lt;Node2&gt; 不在文档的根目录中。

【讨论】:

    【解决方案2】:

    当你从根节点选择时,使用 // 而不是 /

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
    XmlNode root_node = doc.DocumentElement.SelectSingleNode("/Node1");
    XmlNode test_node = root_node.SelectSingleNode("//Node2/Node3");
    

    另一种选择是使用节点 3 的完整路径

    XmlNode test_node = doc.DocumentElement.SelectSingleNode("/Node1/Node2/Node3");
    

    【讨论】:

      【解决方案3】:

      您可以简单地拨打Descendants()

       var xml= @"<Node1><Node2><Node3></Node3></Node2></Node1>";
       XDocument doc = XDocument.Parse(xml);
       var node = doc.Descendants("Node3");
      

      或从Root开始使用Element()

         var node2= doc.Root.Element("Node2").Element("Node3");
      

      或使用XPathSelectElement()

       var node3=  doc.XPathSelectElement("/Node1/Node2/Node3");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2013-03-26
        • 1970-01-01
        相关资源
        最近更新 更多