2016-12-23 4 views
0

Я использую C# XmlDocument API.XmlDocument XPath выражение сбой

У меня есть следующий XML:

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

Я хочу, чтобы получить node3 как XmlNode. Но мой код возвращается нуль:

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 возвращает нуль.

Что здесь общего не работает?

+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"); 
Смежные вопросы