Misalkan saya memiliki XML berikut ini:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
Saya ingin melakukan xpath yang mengembalikan semua node buku yang memiliki node judul dengan atribut bahasa "it".
Upaya saya terlihat seperti ini:
//book[title[@lang='it']]
Tapi itu tidak berhasil. Saya berharap untuk mendapatkan kembali node:
<book category="CLASSICS">
<title lang="it">Purgatorio</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
<book category="CLASSICS">
<title lang="it">Inferno</title>
<author>Dante Alighieri</author>
<year>1308</year>
<price>30.00</price>
</book>
Ada petunjuk?
Jawaban:
Mencoba
Ini berbunyi:
book
elementitle
lang
"it"
Anda mungkin menemukan ini membantu - itu sebuah artikel berjudul "XPath di Lima Paragraf" oleh Ronald Bourret.
Tapi sejujurnya,
//book[title[@lang='it']]
dan di atas harus setara, kecuali mesin XPath Anda memiliki "masalah." Jadi bisa jadi sesuatu dalam kode atau contoh XML yang tidak Anda tunjukkan kepada kami - misalnya, contoh Anda adalah fragmen XML. Mungkinkah elemen root memiliki namespace, dan Anda tidak menghitungnya dalam kueri Anda? Dan Anda hanya memberi tahu kami bahwa itu tidak berhasil, tetapi Anda tidak memberi tahu kami hasil apa yang Anda dapatkan.sumber
title
bukan anak langsung daribook
, tetapi di suatu tempat yang lebih dalam dan kita tidak tahu persis di mana?//book[/title/@lang = 'it']
sepertinya tidak berhasil?Bertahun-tahun kemudian, tetapi opsi yang berguna adalah menggunakan Sumbu XPath ( https://www.w3schools.com/xml/xpath_axes.asp ). Lebih khusus lagi, Anda ingin menggunakan sumbu turunan .
Saya yakin contoh ini akan berhasil:
Ini memungkinkan Anda untuk memilih semua
book
elemen yang berisititle
elemen anak (terlepas dari seberapa dalam elemen itu bersarang) yang berisi nilai atribut bahasa yang sama dengan 'it'.Saya tidak dapat mengatakan dengan pasti apakah jawaban ini relevan dengan tahun 2009 atau tidak karena saya tidak 100% yakin bahwa XPath Axes ada pada saat itu. Apa yang dapat saya konfirmasikan adalah bahwa mereka ada hari ini dan saya telah menemukan mereka sangat berguna dalam navigasi XPath dan saya yakin Anda akan melakukannya juga.
sumber
sebenarnya setara dengan
Saya mencobanya menggunakan vtd-xml, kedua ekspresi tersebut mengeluarkan hasil yang sama ... mesin pengolah xpath apa yang Anda gunakan? Saya kira itu memiliki masalah kesesuaian Di bawah ini adalah kodenya
sumber
Menurut saya saran Anda sendiri benar, namun xml tidak cukup valid. Jika Anda menjalankan
//book[title[@lang='it']]
pada<root>[Your"XML"Here]</root>
kemudian penguji XPath online gratis seperti salah satu di sini akan menemukan hasil yang diharapkan.sumber
Coba gunakan ekspresi xPath ini:
Itu akan memberi Anda semua node buku dalam lang "it"
sumber