Saya memiliki dokumen berikut:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Bagaimana saya bisa mendapatkan nilai <cc>
menggunakan XPath jika <bb>
ada zz
?
Saya memiliki dokumen berikut:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Bagaimana saya bisa mendapatkan nilai <cc>
menggunakan XPath jika <bb>
ada zz
?
Jawaban:
Tidak yakin mengapa semua orang menanyakan saudara kandung, Anda juga dapat memeriksa <bb/>
-elements yang cocok dengan predikat dari <a/>
predikat:
//a[bb/text() = "zz"]/cc/text()
*-sibling
sumbu. +1 sekalipun.
Yang Anda butuhkan adalah following-sibling
sumbu XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Uji Xpath di sini: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
T: Bagaimana cara memilih node menggunakan XPath jika node saudara memiliki nilai tertentu?
Karena hanya ada "Sumbu XPath" untuk saudara berikut dan saudara sebelumnya, Anda dapat menggunakan salah satu dari mereka jika posisinya ditetapkan.
Tetapi lebih baik:
Carilah jika cc
orang tua memiliki anak bb
dengan nilai 'zz'
:
//cc[../bb='zz']
//a[bb = 'zz']/cc
.
Pertama, contoh Anda bukanlah XML dengan format yang baik. Melihat itu dan bahwa Anda tidak menggambarkan maksud Anda dengan baik (Apa sebenarnya yang ingin Anda pilih dalam kondisi apa?), Saya berasumsi Anda ingin melakukan ini:
//cc[preceding-sibling::bb[text()="zz"]]/text()
Itu memilih
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Anda bisa menulis juga sebagai
//bb[text()="zz"]/following-sibling::cc/text()
Silakan lihat spesifikasinya , ini memiliki beberapa contoh yang dapat dibaca dengan sangat baik dari mana Anda akan belajar banyak.
//a/cc[../bb='zz']/text()
// a: Memilih semua elemen 'a' dimanapun itu.
// a / cc: Memilih elemen 'cc' yang merupakan turunan dari elemen 'a' (di mana pun a berada).
..: Memilih induk dari node saat ini.
[../bb='zz ']: dimana nilai dari elemen sibling' bb 'adalah zz.
Solusi lain untuk masalah ini adalah
//bb[contains(.,'zz')]/../cc/text()
Penjelasan : Setiap bb
yang berisi 'zz'
string di semua node anak bb
kemudian pergi ke node induk yang bb
menggunakan ..
, sekarang kita dapat mengakses cc
teks yang kembali.
Saya harap penjelasan itu tidak rumit.