2011-08-05 3 views
11

子ノードが現在のノード内にあるように検索を制限したいと思います。例えば、私は、次のコードを持っている:C#のノード内で検索するXmlNode.SelectSingleNodeの構文

XmlNodeList myNodes = xmlDoc.DocumentElement.SelectNodes("//Books"); 
    foreach (XmlNode myNode in myNodes) 
    { 
     string lastName = ""; 
     XmlNode lastnameNode = myNode.SelectSingleNode("//LastName"); 
     if (lastnameNode != null) 
     { 
       lastName = lastnameNode.InnerText; 
     } 
    } 

を私は氏名要素がforeachの内部現在MYNODEの中から検索することがしたいです。何が起こっているのは、見つかったLastNameは常にmyNodesを持つ最初のノードからのものです。私はLastNameの正確なパスをハードコーディングするのではなく、myNodeの内部がどこにあるかについて柔軟にすることを許可します。 myNodeでSelectSingleNodeメソッドを使用すると、myNodeのxmlコンテンツ内にのみ検索が制限され、親ノードは含まれないと考えられていました。

答えて

27

先頭の//は常にドキュメントのルートから始まります。現在のノードで開始し、ちょうどその子孫を検索する.//を使用します。

XmlNode lastnameNode = myNode.SelectSingleNode(".//LastName"); 
+0

ザ・にそれを変更することですどこの選択と一致し、現在のノードから文書内のノードを選択しないことを意味し、「」素晴らしい仕事をした。その構文がどこにあるのか知っていますか?私はこの種の情報を探して、 "//"ではなく "。"を見つけました。私は、私が使うことができる他の構文があると思っています。 – user31673

+0

[XPath構文](http://www.w3schools.com/xsl/xpath_syntax.asp) –

+0

@ ibo.ezheが述べたXPath構文へのリンクが更新されました:https://www.w3schools.com/xml/xpath_syntax.asp – PolyTekPatrick

1

実は、問題は、XPathに関するものです。 XPath syntaxは//あなたは関係なく、彼らが

ので、あなたが必要とするすべての

myNode.SelectSingleNode(".LastName") 
+0

これは1レベル下にしか見つかりません。 OPは、サブツリー内のどこでもそれを見つけることができると言いました。 –

関連する問題