2009-06-09 8 views
4

"../"と "parent"を使用してXPathクエリで親ノードを取得することの違いは何ですか?私は彼らが同義であると思っていた。XPathクエリで "../"と "parent"を使用する違いは何ですか?

次の2つのXPathクエリには、実際にこれらの2つの違いがありますか?

//Node/id[@type='image']/id[@attr1='myVal']/../../* 

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::* 

私は私が実際にバックNode要素へ前の最初の兄弟を取得するC#/ ASP.netアプリケーションで作業して最初のXPathクエリを使用しています。私が探しているのは、Node要素自体とそのすべての子要素です。 2番目のXPathクエリは私に私の期待した結果を与えるでしょう。

私はなぜここに違いがあるのだろうかと思っています。

答えて

5

クイックアンサー; yes、../、parent :: *は等価ですが、XPath式が異なるために異なる結果になります。

長めの回答;

parent :: node()と..の表現は同等であり、後者は前者の短縮形でW3C XPath Recommendationです。

XMLはツリーを形成するため、parent :: *と同様の動作をします。したがって、すべての子は親を1つしか持てません。

結果が異なる理由は、異なるクエリであるためです。最初に余分な*が付いています(../../*)。おそらくNodeの子アイテムのシーケンスを返しています。

2番目のノードはコンテキストノードの親の親(具体的には../ ..と略記)を取得します。このノードは関心のNode要素です。

例:ドキュメントの

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Node> 
     <id type="image"> 
      <id attr1="myVal"> </id> 
     </id> 
    </Node> 
</root> 

クエリ

//Node/id[@type='image']/id[@attr1='myVal']/../../* 

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*/* 

リターンノードID

[TYPE = '映像' @]クエリ

//Node/id[@type='image']/id[@attr1='myVal']/../.. 

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::* 

リターンノードノードの一方

。 。

+0

hh?あなたの迅速な答えは基本的に言う:はい彼らは同じですが、いいえ、彼らは異なっていますか? –

+0

これをもっと明確にするために更新されました – Brabster

+0

これは素晴らしいブラスターです。私の混乱の大部分は、XPathクエリの最後に "*"を使用したことと、正確に何が返されているのかが原因です。 –

5

あなたは*あなたの式は互いに等価ないであるため、同じ結果セットを取得されていません*

は考えてみましょう:

1。ターゲットノード

//ノード/ ID [@ TYPE = '映像']/ID [@ ATTR1 = 'myVal']の孫

2ターゲットノードの子(孫の親) (等価物は、expr)

//ノード/ ID [@ TYPE = '映像']/ID [@ ATTR1 = 'myVal']/..

//ノード/ ID [@ TYPE = '画像']/id [@ attr1 =' myVal ']/parent :: *

3.ターゲットノード孫の親)(等価は、expr)

//Node/id[@type='image']/id[@attr1='myVal']/../ ..

//ノード/ ID [タイプ@ = '画像']/ID [@ ATTR1 = 'myVal'] /親:: * /親:: * < - * * * 2回目の自分のEXPR * * *

4。ターゲット・ノードのすべての子(等価は、expr)

//Node/id[@type='image']/id[@attr1='myVal']/../../* < * * * YOUR 1ST EXPR * * *

//ノード/ id [@ attr1 = 'myVal']/parent :: */parent :: */*


'//parent/child[@id="2"]/grandchild[@id="2.1"]/../../*')をクリックしてください。どのノードがどのXPath式に合っているかを赤で強調表示します。

http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

+0

すばらしい説明Bert。 XPathテストページのリンクは、いくつかの検索をテストして結果を表示するのに最適でした。大変助けになりました。便利なリンクは –

+0

+1! – Dror

関連する問題