2011-05-29 136 views
27

我正在尋找正確的xpath語法來獲取元素的特定父元素。 例子:XML xpath,獲取父元素直到特定元素

root 
    |- div 
    |  | 
    |  |----??? ---| 
    |  |   |-a [class=1] 
    |  |      |- text[ A TEXT I DON'T WANT] 
    |  | 
    |  | 
    |  | 
    |  |-text[THE TEXT] 
    | 
    |-div 
    | |-text[THE TEXT I DON'T WANT] 
    | 
    |-div 
    | |-text[THE TEXT I DON'T WANT] 

我想要得到的文字「文本」,但包含a [class=1]同一div內的一個。事情是這樣的:

//div//a[@class=1]/text[contains(.,'A TEXT')]/parent::*/parent::*.... <till div element> /text 
+0

好問題,+1。請參閱我的答案,以獲取完整,精確,簡短且容易的XPath單行表達式,它可以精確選擇想要的文本節點,而不必使用任何後向軸: – 2011-05-29 16:55:57

+1

Upvote獲得一個清晰而簡潔的問題。 – 2012-05-09 16:20:08

回答

58

由於XML

 
<?xml version="1.0"?> 
<root> 
    <foo id="id1"> 
     <foo id="i2"> 
      <baz/> 
     </foo> 
    </foo> 
</root>

您可以使用XPath表達式找到巴茲的最近的祖先富元:

//baz/ancestor::foo[1]

這將選擇FOO id爲「i2」的元素節點。所以在你的例子中(如果我理解正確的話),一旦你有了你想要的「a」元素,你可以通過追加「/ ancestor :: div [1]來將樹」備份「到最近的祖先div ]「到你的表情。

+0

是的,最簡單的就是:) 謝謝! – 2011-05-29 11:54:34

+0

讓我所有的讚美,永遠。 +1 – 2015-11-10 22:14:16

9

使用

/root/div[.//a[@class='1']]/text() 

這裏選擇是具有class屬性具有值'1'和(所述a元件)中任a元素的子任何文本節點是任何div元件的後代這是名爲root的頂級元素的子元素。

+0

OP需要'THE TEXT',你的表情會檢索'A TEXT' – 2012-11-16 07:46:56

+0

好的觀察結果 - 我想我一年前回答的時候並沒有理解這個問題 - 現在就修好了。請看看,並倒退你的downvote。 – 2012-11-16 13:07:09