2011-05-29 114 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