XmlDocument XPath 表达式失败

XmlDocument XPath expression failing

我正在使用 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_nodereturns无效。

这里出了什么问题?

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

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");

你可以简单的调用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");

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

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

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