XPath Tester

Uji ekspresi XPath terhadap XML dan lihat semua node yang cocok

Coba contoh

Input XML

Berjalan lokal ยท Aman untuk menempel rahasia

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.

โšก
Uji ekspresi secara instan
Tempel XML Anda, ketik ekspresi, dan lihat node yang cocok secara langsung. Tidak ada langkah kompilasi, tidak perlu menyiapkan REPL, tidak ada dependensi yang harus diinstal.
๐Ÿ”’
Pemrosesan mengutamakan privasi
Semua penguraian XML dan evaluasi kueri berjalan di browser Anda menggunakan API DOMParser dan document.evaluate() bawaan. Data XML Anda tidak pernah meninggalkan perangkat Anda.
๐Ÿ”
Debug kueri kompleks langkah demi langkah
Uraikan ekspresi panjang dengan menguji setiap axis dan predikat secara terpisah. Lihat dengan tepat node mana yang cocok di setiap langkah untuk mengisolasi kesalahan.
๐Ÿ“‹
Salin hasil untuk dokumentasi
Salin node yang cocok atau hasil skalar dengan satu klik. Berguna untuk ditempel ke laporan bug, pernyataan pengujian, atau skrip ekstraksi data.

Kasus Penggunaan XPath Tester

Pengembang frontend
Uji selektor XPath untuk manipulasi SVG atau konfigurasi berbasis XML sebelum menyematkannya dalam kode JavaScript yang memanggil document.evaluate().
Engineer backend
Validasi kueri terhadap respons SOAP atau payload API XML sebelum menulis logika ekstraksi di Python, Java, atau Go.
DevOps / Infrastruktur
Kueri file konfigurasi XML (Maven pom.xml, Spring beans, konfigurasi pipeline CI) untuk mengekstrak versi dependensi atau memverifikasi pengaturan tanpa mengedit file.
QA / Otomasi pengujian
Buat dan verifikasi lokator XPath untuk Selenium atau Playwright sebelum menambahkannya ke skrip pengujian. Uji kasus tepi seperti atribut yang hilang atau prefiks namespace.
Engineer data
Buat prototipe kueri untuk feed data XML (RSS, Atom, laporan keuangan XBRL) sebelum menghubungkannya ke pipeline ETL.
Pelajar / Pemula
Bereksperimen dengan axis, predikat, dan fungsi XPath menggunakan contoh XML. Lihat hasil secara langsung untuk membangun intuisi terhadap pola traversal pohon.

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.

AxisContohDeskripsi
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-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.

FungsiKategoriDeskripsi
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") โ€” substring match
starts-with()Stringstarts-with(title, "The") โ€” prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) โ€” totals numeric values
not()Booleannot(@disabled) โ€” negation
name()StringReturns 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.

JavaScript (browser)
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.98
Python (lxml)
from 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)  # โ†’ True
Java (javax.xml.xpath)
import 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
CLI (xmllint)
# 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

Pertanyaan yang Sering Diajukan

Apa perbedaan antara XPath 1.0 dan XPath 3.1?
Versi 1.0 memiliki empat tipe data (node-set, string, angka, boolean) dan 27 fungsi. Versi 3.1 menambahkan sequence, map, array, tipe tanggal/waktu, ekspresi reguler, fungsi tingkat tinggi, dan dukungan JSON. Browser dan sebagian besar library standar hanya mengimplementasikan versi 1.0. Versi 3.1 memerlukan mesin khusus seperti Saxon.
Bagaimana cara memilih node dengan nilai atribut tertentu?
Gunakan predikat dengan singkatan @ untuk axis atribut. Misalnya, //book[@category="fiction"] memilih semua elemen book di mana atribut category bernilai "fiction". Anda dapat menggabungkan beberapa predikat: //book[@category="fiction"][@year > 2000].
Mengapa XPath saya tidak mengembalikan hasil meskipun XML berisi elemen yang cocok?
Penyebab paling umum adalah namespace XML. Jika XML Anda mendeklarasikan namespace default (xmlns="..."), elemen-elemen termasuk dalam namespace tersebut meskipun tanpa prefiks. Dalam versi 1.0, Anda harus mendaftarkan namespace dan menggunakan prefiks dalam ekspresi. Di JavaScript browser, berikan namespace resolver sebagai argumen ketiga ke document.evaluate().
Apakah XPath dapat memodifikasi konten XML?
Tidak. XPath adalah bahasa kueri yang hanya bisa membaca. XPath memilih dan mengevaluasi node tetapi tidak dapat menyisipkan, menghapus, atau memperbaruinya. Untuk memodifikasi XML, gunakan transformasi XSLT, metode manipulasi DOM, atau library seperti lxml di Python yang menyediakan API terpisah untuk pengeditan.
Apa arti tanda garis miring ganda (//) dalam XPath?
Garis miring ganda adalah singkatan untuk axis descendant-or-self. Ekspresi //title berarti "pilih semua elemen title di mana saja dalam pohon dokumen, pada kedalaman berapa pun." Ini setara dengan bentuk lengkap /descendant-or-self::node()/title. Menggunakan // di awal ekspresi mencari seluruh dokumen; menggunakannya di tengah jalur (seperti /catalog//title) mencari keturunan dari node tertentu.
Bagaimana cara memilih konten teks alih-alih node elemen?
Tambahkan /text() ke ekspresi Anda. Misalnya, //book/title/text() mengembalikan konten teks setiap elemen title sebagai node string, bukan node elemen itu sendiri. Dalam kode, Anda juga dapat mengakses .textContent pada node elemen yang dikembalikan tanpa menggunakan text().
Apakah XPath lebih cepat dari selektor CSS untuk mengkueri XML?
Selektor CSS dioptimalkan untuk HTML dan traversal DOM di browser. XPath lebih ekspresif: mendukung traversal ke node induk, axis saudara, predikat numerik, dan fungsi bawaan yang tidak dapat diungkapkan oleh selektor CSS. Untuk HTML, selektor CSS (querySelector) biasanya lebih cepat. Untuk XML, sebagian besar library sisi server hanya mengekspos XPath โ€” selektor CSS bukan pilihan sama sekali.