XPath Tester
Uji ekspresi XPath terhadap XML dan lihat semua node yang cocok
Input XML
Apa itu XPath?
XPath (XML Path Language) adalah bahasa kueri untuk memilih node dari dokumen XML. Didefinisikan oleh W3C sebagai bagian dari standar XSLT, XPath memperlakukan dokumen XML sebagai pohon node dan menyediakan sintaks berbasis jalur untuk menavigasi pohon tersebut. Ekspresi XPath seperti //book[@category="fiction"]/title memilih setiap elemen title di dalam elemen book yang atribut category-nya bernilai "fiction". XPath 1.0, versi yang didukung oleh semua browser utama dan sebagian besar library XML, diterbitkan sebagai Rekomendasi W3C pada tahun 1999 dan tetap menjadi versi yang paling banyak digunakan.
Ekspresi XPath mengembalikan salah satu dari empat tipe hasil: node-set, string, angka, atau boolean. Node-set adalah hasil yang paling umum dan berisi nol atau lebih node XML (elemen, atribut, node teks, komentar, atau instruksi pemrosesan). Hasil string, angka, dan boolean berasal dari fungsi XPath seperti count(), sum(), contains(), dan perbandingan boolean. Sistem tipe ini membuat XPath cocok baik untuk mengekstrak data maupun untuk menulis logika kondisional dalam stylesheet XSLT dan pernyataan XML Schema.
Ekspresi versi 1.0 berfungsi di mana saja: document.evaluate() di JavaScript, lxml dan ElementTree di Python, javax.xml.xpath di Java, DOMXPath di PHP, serta alat baris perintah seperti xmllint. Versi 2.0 dan 3.1 menambahkan sistem tipe dan fungsi yang lebih kaya, tetapi memerlukan mesin khusus seperti Saxon. Gunakan versi 1.0 sebagai default. Beralih ke 2.0 atau 3.1 hanya ketika Anda membutuhkan sequence, ekspresi reguler, atau fungsi tingkat tinggi โ dan siap menerima ketergantungan pada Saxon atau BaseX.
Mengapa Menggunakan XPath Tester Online?
Menulis ekspresi yang benar memerlukan pemahaman tentang struktur dokumen dan pengujian terhadap data nyata. Alat ini memberikan lingkungan interaktif untuk mengiterasi ekspresi tanpa perlu menyiapkan proyek atau menulis kode boilerplate.
Kasus Penggunaan XPath Tester
Referensi Axis XPath
Sebuah axis mendefinisikan arah navigasi relatif terhadap node saat ini (node konteks). Sintaks lengkapnya adalah axis::node-test[predicate], meskipun sebagian besar pengembang menggunakan bentuk singkat (//, @, ..) sehari-hari. Tabel ini mencantumkan semua axis versi 1.0 beserta contoh praktisnya.
| Axis | Contoh | Deskripsi |
|---|---|---|
| child | child::book | Direct children named "book" |
| descendant | descendant::title | All "title" elements at any depth |
| parent | parent::* | The parent of the current node |
| ancestor | ancestor::catalog | All ancestors named "catalog" |
| following-sibling | following-sibling::book | Siblings after the current node |
| preceding-sibling | preceding-sibling::book | Siblings before the current node |
| attribute | attribute::lang | The "lang" attribute of the node |
| self | self::book | The current node if it is "book" |
| descendant-or-self | //title | Shorthand: any "title" in the tree |
| ancestor-or-self | ancestor-or-self::* | Current node plus all ancestors |
Fungsi XPath 1.0
Bahasa ini mendefinisikan 27 fungsi bawaan dalam empat kategori: node-set, string, angka, dan boolean. Berikut adalah fungsi yang paling sering digunakan saat menulis kueri. Semua fungsi didukung oleh alat ini dan oleh setiap implementasi yang sesuai standar.
| Fungsi | Kategori | Deskripsi |
|---|---|---|
| text() | Node test | Selects text content of a node |
| position() | Numeric | Returns 1-based position in node set |
| last() | Numeric | Returns size of current node set |
| count() | Numeric | Counts nodes: count(//book) |
| contains() | String | contains(@class, "active") โ substring match |
| starts-with() | String | starts-with(title, "The") โ prefix match |
| normalize-space() | String | Strips leading/trailing whitespace |
| string-length() | Numeric | Returns character count of a string |
| sum() | Numeric | sum(//price) โ totals numeric values |
| not() | Boolean | not(@disabled) โ negation |
| name() | String | Returns element or attribute name |
Contoh Kode
Contoh-contoh ini menunjukkan cara mengevaluasi ekspresi secara programatik. Setiap cuplikan menggunakan struktur catalog.xml yang sama sehingga Anda dapat membandingkan perbedaan API antar bahasa.
const xml = `<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
console.log(node.textContent) // โ "1984", "Dune"
node = result.iterateNext()
}
// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // โ 20.98from lxml import etree
xml = """<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""
tree = etree.fromstring(xml.encode())
# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books) # โ ['1984']
# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first) # โ ['1984']
# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap) # โ Trueimport javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;
var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));
var xpath = XPathFactory.newInstance().newXPath();
// Select node set
NodeList titles = (NodeList) xpath.evaluate(
"//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
System.out.println(titles.item(i).getTextContent());
// โ "1984", "Dune"
}
// Evaluate to number
double total = (double) xpath.evaluate(
"sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // โ 20.98# Select all book titles xmllint --xpath '//book/title/text()' catalog.xml # โ 1984Dune # Select by attribute xmllint --xpath '//book[@id="2"]/title' catalog.xml # โ <title>Dune</title> # Count nodes xmllint --xpath 'count(//book)' catalog.xml # โ 2 # Using xmlstarlet for formatted output xmlstarlet sel -t -v '//book/title' -n catalog.xml # โ 1984 # โ Dune