2016-12-23 116 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");