Saya punya masalah kecil dengan Xpath berisi dengan dom4j ...
Katakanlah XML saya
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Katakanlah saya ingin menemukan semua node yang memiliki ABC dalam teks yang diberikan Elemen root ...
Jadi xpath yang harus saya tulis adalah
//*[contains(text(),'ABC')]
Namun ini bukan apa yang dikembalikan Dom4j .... apakah ini masalah dom4j atau pemahaman saya tentang cara kerja xpath. karena kueri itu hanya mengembalikan Elemen Jalan dan bukan elemen Komentar.
DOM menjadikan elemen Komentar elemen gabungan dengan empat tag dua
[Text = 'XYZ'][BR][BR][Text = 'ABC']
Saya akan berasumsi bahwa kueri masih harus mengembalikan elemen karena harus menemukan elemen dan menjalankan mengandung di atasnya tetapi tidak ... ...
kueri berikut mengembalikan elemen tetapi mengembalikan jauh lebih dari elemen, itu mengembalikan elemen induk juga ... yang tidak diinginkan untuk masalah ...
//*[contains(text(),'ABC')]
Apakah ada yang tahu permintaan xpath yang hanya akan mengembalikan Elemen <Street/>
dan <Comment/>
?
//*[contains(text(),'ABC')]
hanya mengembalikan<Street>
elemen. Itu tidak mengembalikan leluhur<Street>
atau<Comment>
.Jawaban:
The
<Comment>
tag berisi dua node teks dan dua<br>
node sebagai anak-anak.Ekspresi xpath Anda tadinya
Untuk memecah ini,
*
adalah pemilih yang cocok dengan elemen apa pun (yaitu tag) - ia mengembalikan set-simpul.[]
adalah kondisi yang beroperasi pada setiap node individu di set simpul itu. Ini cocok jika ada satu node yang beroperasi sesuai kondisi di dalam tanda kurung.text()
adalah pemilih yang cocok dengan semua node teks yang merupakan anak-anak dari simpul konteks - mengembalikan set simpul.contains
adalah fungsi yang beroperasi pada string. Jika melewati set simpul, set simpul dikonversi menjadi string dengan mengembalikan nilai string dari simpul dalam set-simpul yang pertama dalam urutan dokumen . Oleh karena itu, ia hanya dapat mencocokkan simpul teks pertama dalam<Comment>
elemen Anda - yaituBLAH BLAH BLAH
. Karena itu tidak cocok, Anda tidak mendapatkan<Comment>
hasil Anda.Anda perlu mengubahnya ke
*
adalah pemilih yang cocok dengan elemen apa pun (yaitu tag) - ia mengembalikan set-simpul.[]
adalah suatu kondisi yang beroperasi pada setiap node individu dalam set simpul - di sini beroperasi pada setiap elemen dalam dokumen.text()
adalah pemilih yang cocok dengan semua node teks yang merupakan anak-anak dari simpul konteks - mengembalikan set simpul.[]
adalah sebuah kondisi yang beroperasi pada setiap node di set simpul itu - di sini setiap node teks individu. Setiap node teks individu adalah titik awal untuk setiap jalur dalam tanda kurung, dan juga dapat disebut secara eksplisit sebagai.
dalam tanda kurung. Ini cocok jika ada satu node yang beroperasi sesuai kondisi di dalam tanda kurung.contains
adalah fungsi yang beroperasi pada string. Di sini dilewatkan node teks individu (.
). Karena dilewatkan node teks kedua dalam<Comment>
tag secara individual, ia akan melihat'ABC'
string dan dapat mencocokkannya.sumber
//*[contains(., 'ABC')]
. Saya selalu menggunakan pola yang diberikan oleh Mike Milkin, berpikir itu lebih tepat, tetapi hanya melakukancontains
pada konteks saat ini tampaknya sebenarnya menjadi apa yang saya inginkan lebih sering.[contains(text(),'')]
hanya mengembalikan benar atau salah. Itu tidak akan mengembalikan hasil elemen apa pun.sumber
contains(text(),'JB-')
tidak bekerja!conatains
membutuhkan dua string sebagai argumen -contains(**string**, **string**)
! text () bukan string , adalah fungsi!Dokumen XML:
Ekspresi XPath:
//*
cocok dengan elemen turunan dari node root . Artinya, elemen apa pun kecuali simpul root.[...]
adalah predikat , itu menyaring node-set. Ini mengembalikan node yang...
adalahtrue
:contains('haystack', 'needle')
kembalitrue
jikahaystack
berisineedle
:Tetapi
contains()
mengambil string sebagai parameter pertama. Dan melewati node. Untuk mengatasinya, setiap node atau node-set dilewatkan sebagai parameter pertama dikonversi ke string olehstring()
fungsi:string()
pengembalian fungsistring-value
dari simpul pertama :string-value
dari simpul elemen :string-value
dari simpul teks :Jadi, pada dasarnya
string-value
adalah semua teks yang terkandung dalam sebuah simpul (gabungan dari semua simpul teks turunan).text()
adalah tes simpul yang cocok dengan simpul teks apa pun:Karena itu,
//*[contains(text(), 'ABC')]
cocok dengan elemen apa pun (kecuali simpul root), simpul teks pertama yang berisiABC
. Sejaktext()
mengembalikan set-simpul yang berisi semua simpul teks turunan dari simpul konteks (relatif terhadap ekspresi yang dievaluasi). Tetapicontains()
hanya mengambil yang pertama. Jadi untuk dokumen di atas jalan cocok denganStreet
elemen.Ekspresi berikut
//*[text()[contains(., 'ABC')]]
cocok dengan elemen apa pun (tetapi simpul root), yang memiliki setidaknya satu simpul teks anak, yang berisiABC
..
mewakili node konteks. Dalam hal ini, ini adalah simpul teks anak dari elemen apa pun kecuali simpul akar. Jadi untuk dokumen di atas jalan cocok denganStreet
, danComment
elemen.Nah,
//*[contains(., 'ABC')]
cocok dengan elemen apa pun (kecuali simpul root) yang berisiABC
(dalam rangkaian simpul teks turunan). Untuk dokumen di atas cocok denganHome
, yangAddr
, yangStreet
, danComment
unsur-unsur. Dengan demikian,//*[contains(., 'BLAH ABC')]
cocokHome
denganAddr
,, danComment
elemen.sumber
Butuh beberapa saat, tetapi akhirnya saya tahu. Xpath khusus yang berisi beberapa teks di bawah ini berfungsi dengan baik untuk saya.
sumber
contains(text(),'JB-')
tidak bekerja!conatains
membutuhkan dua string sebagai argumen -contains(**string**, **string**)
! text () bukan string , adalah fungsi!Jawaban yang diterima akan mengembalikan semua node induk juga. Untuk mendapatkan hanya simpul yang sebenarnya dengan ABC meskipun stringnya adalah setelah
:
sumber
kembali
sumber