XPath Test Aracı
XPath ifadelerini XML'ye karşı test edin ve eşleşen tüm düğümleri görün
XML Girdisi
XPath Nedir?
XPath (XML Path Language), bir XML belgesinden düğüm seçmeye yarayan bir sorgu dilidir. W3C tarafından XSLT standardının bir parçası olarak tanımlanan XPath, bir XML belgesini düğümlerden oluşan bir ağaç olarak ele alır ve bu ağaçta gezinmek için yol tabanlı bir sözdizimi sunar. Örneğin //book[@category="fiction"]/title gibi bir XPath ifadesi, category özniteliği "fiction"a eşit olan her book öğesinin içindeki tüm title öğelerini seçer. Tüm büyük tarayıcılar ve çoğu XML kütüphanesi tarafından desteklenen XPath 1.0, 1999 yılında W3C Önerisi olarak yayımlanmış ve bugün hâlâ en yaygın kullanılan sürüm olmaya devam etmektedir.
XPath ifadeleri dört sonuç türünden birini döndürür: düğüm kümeleri, dizeler, sayılar veya boole değerleri. Düğüm kümesi en yaygın sonuç türüdür ve sıfır veya daha fazla XML düğümü (öğeler, öznitelikler, metin düğümleri, yorumlar veya işleme talimatları) içerir. Dize, sayı ve boole sonuçları ise count(), sum(), contains() gibi XPath işlevlerinden ve boole karşılaştırmalarından elde edilir. Bu tür sistemi, XPath'ı hem veri çıkarma hem de XSLT stil sayfalarındaki ve XML Şema savlarındaki koşullu mantık için uygun kılar.
Sürüm 1.0 ifadeleri her yerde çalışır: JavaScript'in document.evaluate() fonksiyonu, Python'un lxml ve ElementTree kütüphaneleri, Java'nın javax.xml.xpath paketi, PHP'nin DOMXPath sınıfı ve xmllint gibi komut satırı araçları. Sürüm 2.0 ve 3.1 daha zengin tür sistemleri ve işlevler ekler; ancak Saxon gibi özel motorlar gerektirir. Varsayılan olarak Sürüm 1.0 kullanın. Dizilere, düzenli ifadelere veya yüksek dereceli işlevlere ihtiyaç duyduğunuzda 2.0 veya 3.1'e geçin ve Saxon ya da BaseX bağımlılığını göze alın.
Neden Çevrimiçi XPath Test Aracı Kullanmalısınız?
Doğru ifadeler yazmak, belge yapısını anlamayı ve gerçek verilerle test etmeyi gerektirir. Bu araç, bir proje kurmak ya da standart kod yazmak zorunda kalmadan ifadeler üzerinde yinelemeli çalışabileceğiniz etkileşimli bir ortam sunar.
XPath Test Aracı Kullanım Senaryoları
XPath Eksen Başvurusu
Bir eksen, geçerli (bağlam) düğüme göre gezinme yönünü tanımlar. Tam sözdizimi axis::node-test[predicate] şeklindedir; ancak çoğu geliştirici günlük olarak kısaltılmış biçimleri (//, @, ..) kullanır. Bu tablo, tüm 1.0 eksenlerini pratik örneklerle listeler.
| Eksen | Örnek | Açıklama |
|---|---|---|
| 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 |
XPath 1.0 İşlevleri
Dil, dört kategoride 27 yerleşik işlev tanımlar: düğüm kümesi, dize, sayı ve boole. Bunlar, sorgu yazarken en sık kullanacağınız işlevlerdir. Tümü bu test aracı ve her uyumlu uygulama tarafından desteklenmektedir.
| İşlev | Kategori | Açıklama |
|---|---|---|
| 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 |
Kod Örnekleri
Bu örnekler, ifadelerin programatik olarak nasıl değerlendirileceğini gösterir. Her kod parçacığı aynı catalog.xml yapısını kullanır; böylece diller arasındaki API farklılıklarını karşılaştırabilirsiniz.
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