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()
*-siblingsumbu. +1 sekalipun.
Yang Anda butuhkan adalah following-siblingsumbu 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 ccorang tua memiliki anak bbdengan 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 bbyang berisi 'zz'string di semua node anak bbkemudian pergi ke node induk yang bbmenggunakan .., sekarang kita dapat mengakses ccteks yang kembali.
Saya harap penjelasan itu tidak rumit.