2016-12-23 4 views
0

私はC#XmlDocument APIを使用しています。XmlDocument XPath式が失敗する

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

は私がのXmlNodeとしてノード3を取得したい:

は、私は、次のXMLを持っています。しかし、私のコードは、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リターンのログ。

ここで何が問題になりますか?

+0

ここで何を達成しようとしていますか? –

+0

test_nodeはNode3にスコープされ、nullにはなりません。 – ScottF

答えて

1

を使用:

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

、フォワードリーディング/がドキュメントのルートを表すスラッシュ。 <Node2>がドキュメントのルートにないため、式"/Node2/Node3"は機能しません。

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

又は代わり"/Node2/Node3"の経路"Node2/Node3"を使用XPathSelectElement()

var node3= doc.XPathSelectElement("/Node1/Node2/Node3"); 
関連する問題