2016-12-23 119 views
0

我正在使用C#XmlDocument API。XmlDocument XPath表达式失败

我有下面的XML:

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

我想作为节点3一个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。

这里怎么回事?

+0

你想在这里完成什么? –

+0

test_node的作用域为Node3,而不是null。 – ScottF

回答

1

使用路径"Node2/Node3"代替"/Node2/Node3"

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

在XPath表达式,领先的斜线/表示文档的根。表达式"/Node2/Node3"不起作用,因为<Node2>不在文档的根部。

1

使用//代替/,当你从根节点

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

你可以简单的调用Descendants()

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

或使用Element()Root

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

,或者使用XPathSelectElement()

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