2010-07-08 8 views
76

Xpath'de, belirli bir değere eşit olan öğeleri seçmek istiyorum.XPath - Bir değere eşit olan öğelerin seçilmesi

Örnek XML veriler: XPath kullanarak Şimdi

Name Value 
ccc  qwerty 

,: Artık

<aaa id="11" > 
    <aaa id="21" > 
     <aaa id="31" ></aaa> 
     <bbb id="32" > 
      <aaa id="41" ></aaa> 
      <bbb id="42" ></bbb> 
      <ccc id="43" ></ccc> 
      <ddd id="44" >qwerty</ddd> 
      <ddd id="45" ></ddd> 
      <ddd id="46" ></ddd> 
     </bbb> 
    </aaa> 
    <bbb id="22" > 
     <aaa id="33" >qwerty</aaa> 
     <bbb id="34" ></bbb> 
     <ccc id="35" ></ccc> 
     <ddd id="36" ></ddd> 
     <ddd id="37" ></ddd> 
     <ddd id="38" ></ddd> 
    </bbb> 
    <ccc id="23" >qwerty</ccc> 
    <ccc id="24" ></ccc> 
</aaa> 

, XPath kullanarak: Doğru, beklenen sonuç almak

//ccc[.='qwerty'] 

:

//aaa[.='qwerty'] 

Ben beklenmedik sonuç alın:

Name Value 
aaa  
aaa  qwerty 

Ve özellikle ilgileniyorum, ne bu değerle

XPath ile herhangi elemanı seçmek için yapılması gerekenler:

//*[.='qwerty'] 

Çok garip oluyorum beklenmedik sonuçları:

Name Value 
aaa 
bbb 
ddd  qwerty 
bbb  qwerty 
aaa  qwerty 
ccc  qwerty 

birisi bu sonuçları açıklayabilir ve nasıl daha beklenen sonuçları almak için benim XPath ifadeleri düzeltmek için?

+0

Çünkü XPath '. = 'XPath' text() = ''den farklıdır. Nedenini öğrenmek için [** eşleşen metin düğümleri eşleşen dizgi değerlerinden farklıdır **] (http://stackoverflow.com/a/34595441/290085). – kjhughes

cevap

126

XPath spec olduğunu

//*[text()='qwerty'] çünkü deneyin. bir öğenin dize değerini dizgisini, tüm metin düğüm düğümleri'un birleştirme (belge sırasına göre) olarak tanımlar.

Bu "garip sonuçları" açıklar. Yukarıdaki değer 'qwerty' ile en az bir metin-düğümü çocuğu var belgedeki her eleman seçer

//*[text() = 'qwerty'] 

:

"iyi" sonuçlar aşağıda ifadeleri kullanılarak elde edilebilir.

//*[text() = 'qwerty' and not(text()[2])] 

yukarıdaki seçer yalnızca bir metin düğümü çocuğu vardır ve değer belgedeki her öğe: 'qwerty'.

+0

Teşekkürler! Bu işe yarıyor .. Ben metin() hakkında bilmiyordum .. tanımı nedir? – developer

+3

@iHeartGreek: Sevindim işe yarıyor. Kabul/yükseltme hakkında ne dersiniz?text() ', XPath içindeki olası * node-testlerinden * biridir, yani" bu bir metin düğümüdür ". Diğer nodetest'ler 'comment()', 'processing-teaching()' veya sadece 'node()' dır. –

12

. sizin akım eleman

+1

Teşekkürler! Bu işe yarıyor .. Ben metin() hakkında bilmiyordum .. tanımı nedir? – developer