2011-05-29 18 views
27

'a kadar ana öğeyi alın Bir öğenin belirli bir ebeveyini almak için doğru xpath sözdizimini arıyorum. Örnek:XML xpath, bir öğe

Ben metin "METİN" ama aynı div içinde a [class=1] içeren bir tane almak istiyorum
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] 

. Böyle bir şey:

//baz/ancestor::foo[1]

foo seçecektir:

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

İyi soru, +1. Cevaplarımı tam olarak istediğiniz metin düğümünü seçen tam, tam, kısa ve kolay bir XPath one-liner ifadesi için, herhangi bir geri dönüş ekseni kullanmadan görüyorum :) –

+1

Net ve özlü bir soru için çekin. –

cevap

58

Sen XPath ifadesini kullanarak Baz gelen yakın atası foo elemanını bulabilirsiniz

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

XML Belirli "i2" kimliğinin öğe düğümü.

Örneğinizde (eğer doğru anladıysam), istediğiniz "a" elemanına sahip olduğunuzda, "/ ancestor :: div [1] ekleyerek ağacı" en yakın atasözüne "getirebilirsiniz ] "ifadenize.

+0

Evet, bu kadar basit :) Teşekkürler! –

+0

Tüm oylarım sonsuza dek var. +1 –

9

kullanımı: Bu değer '1' ve (a elemanı) bir class özelliği olan herhangi bir a elemanının bir alt olan herhangi bir metin düğümünü seçer

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

herhangi div elemanının bir soyundan root adlı üst öğenin alt öğesi.

+0

OP'in 'METİN'e ihtiyacı var, ifadeniz' A TEXT ' –

+0

'a ulaşacak. İyi bir gözlem - Sanırım bir yıl önce cevapladığım zaman soruyu anlamadım - şimdi düzeltildi. Lütfen bir göz atın ve reddetmenizi tersine çevirin. –