XPath: Bagaimana memilih elemen berdasarkan nilainya?

221

Saya baru menggunakan XPath dan ini mungkin pertanyaan mendasar. Berbaik hatilah dengan saya dan bantu saya menyelesaikan masalah ini. Saya memiliki file XML seperti ini:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

Saya dapat memvalidasi keberadaan <Element>tag dengan:

// Elemen [@ attribute1 = "abc" dan @ attribute2 = "xyz"]

Sekarang saya juga ingin memeriksa nilai tag untuk string "Data". Untuk mencapai ini saya disuruh menggunakan:

// Elemen [@ attribute1 = "abc" dan @ attribute2 = "xyz" dan Data]

Ketika saya menggunakan ekspresi nanti saya mendapatkan kesalahan berikut:

Pesan kegagalan pernyataan: Tidak Ada Node yang Cocok //Element[@attribute1="abc" and @attribute2="xyz" and Data]

Mohon berikan saran Anda kepada saya apakah ekspresi XPath yang saya gunakan valid. Jika tidak, apa yang akan menjadi ekspresi XPath yang valid?

vcosk
sumber

Jawaban:

329

Kondisi di bawah ini:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

memeriksa keberadaan Data elemen dalam Elemen dan bukan untuk Data nilai elemen.

Sebaliknya Anda bisa menggunakan

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
JADI Pengguna
sumber
25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

Alasan mengapa saya menambahkan jawaban ini adalah karena saya ingin menjelaskan hubungan .dan text().

Yang pertama adalah saat menggunakan [], hanya ada dua jenis data:

  1. [number] untuk memilih node dari node-set
  2. [bool] untuk menyaring simpul-set dari simpul-set

Dalam hal ini, nilai dievaluasi menjadi boolean berdasarkan fungsi boolean(), dan ada aturan:

Filter selalu dievaluasi sehubungan dengan suatu konteks.

Saat Anda perlu membandingkan text()atau .dengan string "Data", pertama-tama ia menggunakan string()fungsi untuk mentransformasikannya menjadi tipe string, daripada mendapatkan hasil boolean.

Ada dua aturan penting tentang string():

  1. The string()fungsi mengkonversi node-set ke string dengan mengembalikan nilai string dari node pertama dalam node-set, yang dalam beberapa kasus dapat menghasilkan hasil yang tidak diharapkan.

    text()adalah jalur relatif yang mengembalikan set-simpul berisi semua simpul teks dari simpul saat ini (simpul konteks), seperti ["Data"]. Ketika dievaluasi oleh string(["Data"]), itu akan mengembalikan simpul-simpul pertama, sehingga Anda mendapatkan "Data" hanya ketika hanya ada satu simpul teks di simpul-set.

  2. Jika Anda ingin string()fungsi menggabungkan semua teks turunan, Anda harus meneruskan satu simpul alih-alih simpul-set.

    Sebagai contoh, kita mendapatkan set-simpul ['a', 'b'], Anda dapat melewati simpul induk ke sana string(parent), ini akan kembali 'ab', dan sebab string(.)dalam kasus Anda akan mengembalikan string yang digabungkan "Data".

Kedua cara akan mendapatkan hasil yang sama hanya ketika ada simpul teks.

宏杰 李
sumber