XPath: pilih simpul teks

150

Memiliki XML berikut:

<node>Text1<subnode/>text2</node>

Bagaimana cara memilih simpul teks pertama atau kedua melalui XPath?

Sesuatu seperti ini:

/node/text()[2]

tentu saja tidak berfungsi karena merupakan hasil gabungan dari setiap teks di dalam simpul.

inti
sumber
11
Anda menulis: /node/text()[2][...] tidak berfungsi karena merupakan hasil gabungan dari setiap teks di dalam simpul. Itu salah: itu berarti simpul teks kedua dari nodeelemen root . Nilai string (gabungan dari node teks turunan) adalahstring(/node)
Maksud Anda, permintaan Xpath harus berfungsi? Kurasa aku punya masalah lain di tempat lain. ;) Terima kasih!
kernel
Pertanyaan bagus, +1. Lihat jawaban saya untuk penjelasan dan beberapa ekspresi XPath yang memilih semua atau anak-simpul teks tertentu dari elemen atas.
Dimitre Novatchev

Jawaban:

183

Memiliki XML berikut:

<node>Text1<subnode/>text2</node> 

Bagaimana cara memilih simpul teks pertama atau kedua melalui XPath?

Gunakan :

/node/text()

Ini memilih semua anak-anak simpul teks dari elemen atas (dinamai "simpul") dari dokumen XML.

/node/text()[1]

Ini memilih anak simpul teks pertama dari elemen atas (bernama "simpul") dari dokumen XML.

/node/text()[2]

Ini memilih anak simpul teks kedua dari elemen atas (bernama "simpul") dari dokumen XML.

/node/text()[someInteger]

Ini memilih anak-simpul teks someInteger-th dari elemen atas (bernama "node") dari dokumen XML. Itu sama dengan ekspresi XPath berikut:

/node/text()[position() = someInteger]
Dimitre Novatchev
sumber
@NaftuliTzviKay: Ini berarti Chrome rusak. /node[2]tidak boleh memilih simpul apa pun jika dokumen sumber XML terbentuk dengan baik. Menurut definisi dalam dokumen XML yang dibentuk dengan baik, hanya ada satu (satu) elemen teratas - juga dikenal sebagaidocument-element
Dimitre Novatchev
1
Apakah ini berfungsi dalam PHP? Saya mencoba untuk mengulang hanya melalui simpul teks, bahkan di antara serangkaian tag. Masalahnya adalah bahwa menghancurkan konten beberapa node teks bersamaan, terlepas dari tag. //*[text()]Tetap menggunakan . /html/text()tidak bekerja.
Aaron Gillion
2
@ AaronGillion, Ya, AFAIK PHP memiliki evaluasi XPath 1.0 yang berfungsi dengan baik. Perhatikan bahwa /html/text()tidak memilih semua simpul teks dalam dokumen - hanya simpul teks yang merupakan anak-anak (bukan turunan) dari htmlelemen atas . Anda mungkin mau /html//text() . Beberapa pengetahuan dan pemahaman tentang XPath biasanya diperlukan untuk membangun ekspresi XPath.
Dimitre Novatchev
Terima kasih. Saya menemukan trik tebas-ganda beberapa saat yang lalu!
Aaron Gillion
@ AaronGillion, Sama-sama. Anda dapat mempelajari dasar-dasar XPath 1.0 dan 2.0 dalam modul 2 dari kursus pelatihan online: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev
29

xpath Anda seharusnya bekerja. saya telah menguji xpath dan milik saya di implementasi MarkLogic dan Zorba Xquery / Xpath.

Keduanya harus bekerja.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
Kadalamittai
sumber