Di Xpath, saya ingin memilih elemen yang sama dengan nilai tertentu.
Contoh data XML:
<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>
Sekarang, menggunakan XPath:
//ccc[.='qwerty']
Saya mendapatkan hasil yang benar dan diharapkan :
Name Value
ccc qwerty
Sekarang, menggunakan XPath:
//aaa[.='qwerty']
Saya mendapatkan hasil yang tidak terduga :
Name Value
aaa
aaa qwerty
Dan yang paling saya minati adalah bagaimana memilih elemen apa pun dengan nilai itu
XPath:
//*[.='qwerty']
Saya mendapatkan hasil tak terduga yang sangat aneh :
Name Value
aaa
bbb
ddd qwerty
bbb qwerty
aaa qwerty
ccc qwerty
Adakah yang bisa menjelaskan hasil ini, dan cara memperbaiki ekspresi XPath saya untuk mendapatkan hasil yang lebih diharapkan?
. =
berbeda dengan XPathtext() =
. Lihat perbedaan node teks yang cocok dengan nilai string yang cocok untuk mempelajari alasannya.Jawaban:
Spesifikasi XPath. mendefinisikan nilai string sebuah elemen sebagai rangkaian (dalam urutan dokumen) dari semua turunan node teksnya .
Ini menjelaskan "hasil yang aneh".
Hasil "lebih baik" dapat diperoleh dengan menggunakan ekspresi di bawah ini:
Di atas memilih setiap elemen dalam dokumen yang memiliki setidaknya satu anak node teks dengan nilai 'qwerty'.
Di atas memilih setiap elemen dalam dokumen yang hanya memiliki satu anak node teks dan nilainya adalah: 'qwerty'.
sumber
text()
adalah salah satu tes node yang mungkin di XPath, yang berarti "apakah ini node teks?". Nodetests laincomment()
,processing-instruction()
atau hanyanode()
.Mencoba
//*[text()='qwerty']
karena elemen.
Anda saat inisumber