ToolDeck

XPath Test Aracı

XPath ifadelerini XML'ye karşı test edin ve eşleşen tüm düğümleri görün

Örnek dene

XML Girdisi

Yerel olarak çalışır · Gizli bilgi yapıştırmak güvenlidir

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.

İfadeleri Anında Test Edin
XML'inizi yapıştırın, bir ifade yazın ve eşleşen düğümleri gerçek zamanlı olarak görün. Derleme adımı yok, REPL kurulumu yok, yüklenecek bağımlılık yok.
🔒
Gizlilik Öncelikli İşleme
Tüm XML ayrıştırma ve sorgu değerlendirmesi, yerel DOMParser ve document.evaluate() API'leri kullanılarak tarayıcınızda gerçekleşir. XML verileriniz makinenizi hiç terk etmez.
🔍
Karmaşık Sorguları Adım Adım Hata Ayıklayın
Uzun ifadeleri her eksen ve koşulu ayrı ayrı test ederek parçalara ayırın. Her adımda tam olarak hangi düğümlerin eşleştiğini görerek hataları kolayca yalıtın.
📋
Sonuçları Belgeleme İçin Kopyalayın
Eşleşen düğümleri veya skaler sonuçları tek tıkla kopyalayın. Hata raporlarına, test savlarına veya veri çıkarma betiklerine yapıştırmak için kullanışlıdır.

XPath Test Aracı Kullanım Senaryoları

Frontend Geliştirici
document.evaluate() çağrısı yapan JavaScript koduna eklemeden önce SVG manipülasyonu veya XML tabanlı yapılandırma için XPath seçicilerini test edin.
Backend Mühendisi
Python, Java veya Go'da çıkarma mantığı yazmadan önce SOAP yanıtlarına veya XML API yüklerine karşı sorguları doğrulayın.
DevOps / Altyapı
Dosyaları düzenlemek zorunda kalmadan bağımlılık sürümlerini çıkarmak veya ayarları doğrulamak için XML yapılandırma dosyalarını (Maven pom.xml, Spring beans, CI boru hattı yapılandırmaları) sorgulayın.
QA / Test Otomasyonu
Test betiklerine eklemeden önce Selenium veya Playwright için XPath belirleyicilerini oluşturun ve doğrulayın. Eksik öznitelikler veya ad alanı önekleri gibi uç durumları test edin.
Veri Mühendisi
ETL boru hatlarına bağlamadan önce XML veri akışları (RSS, Atom, XBRL finansal raporları) için sorguları prototip haline getirin.
Öğrenci / Öğrenen
Örnek XML kullanarak XPath eksenlerini, koşullarını ve işlevlerini deneyin. Ağaç geçiş kalıplarına ilişkin sezginizi geliştirmek için sonuçları anında görün.

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ÖrnekAçıklama
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

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.

İşlevKategoriAçıklama
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

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.

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

Sıkça Sorulan Sorular

XPath 1.0 ile XPath 3.1 arasındaki fark nedir?
Sürüm 1.0 dört veri türüne (düğüm kümesi, dize, sayı, boole) ve 27 işleve sahiptir. Sürüm 3.1 ise diziler, haritalar, diziler, tarih/saat türleri, düzenli ifadeler, yüksek dereceli işlevler ve JSON desteği ekler. Tarayıcılar ve çoğu standart kütüphane yalnızca sürüm 1.0'ı uygular. Sürüm 3.1, Saxon gibi özel bir motor gerektirir.
Belirli bir öznitelik değerine sahip düğümleri nasıl seçerim?
Öznitelik ekseni için @ kısaltmasıyla bir koşul kullanın. Örneğin //book[@category="fiction"], category özniteliği "fiction"a eşit olan tüm book öğelerini seçer. Birden fazla koşulu birleştirebilirsiniz: //book[@category="fiction"][@year > 2000].
XML eşleşen öğeler içermesine rağmen XPath'ım neden sonuç döndürmüyor?
En yaygın neden XML ad alanlarıdır. XML'iniz varsayılan bir ad alanı bildiriyorsa (xmlns="..."), öğeler önek olmaksızın bile o ad alanına aittir. Sürüm 1.0'da, ad alanını kaydetmeniz ve ifadenizde bir önek kullanmanız gerekir. Tarayıcı JavaScript'inde, document.evaluate() fonksiyonuna üçüncü bağımsız değişken olarak bir ad alanı çözümleyicisi geçirin.
XPath, XML içeriğini değiştirebilir mi?
Hayır. XPath salt okunur bir sorgu dilidir. Düğümleri seçer ve değerlendirir; ancak ekleyemez, silemez veya güncelleyemez. XML'i değiştirmek için XSLT dönüşümlerini, DOM manipülasyon yöntemlerini veya Python'un lxml gibi düzenleme için ayrı API'ler sağlayan bir kütüphane kullanın.
XPath'taki çift eğik çizgi (//) ne anlama gelir?
Çift eğik çizgi, descendant-or-self ekseninin kısaltmasıdır. //title ifadesi, "belge ağacında herhangi bir derinlikte, her yerdeki tüm title öğelerini seç" anlamına gelir. Bu ifade, /descendant-or-self::node()/title tam biçimiyle eşdeğerdir. // ifadesinin başında kullanılması tüm belgeyi arar; ortada kullanılması (örneğin /catalog//title) belirli bir düğümün alt öğelerini arar.
Öğe düğümü yerine metin içeriğini nasıl seçerim?
İfadenize /text() ekleyin. Örneğin //book/title/text(), her title öğesinin metin içeriğini öğe düğümü yerine dize düğümü olarak döndürür. Kod içinde, text() kullanmadan döndürülen öğe düğümünde .textContent özelliğine de erişebilirsiniz.
XML sorgulamada XPath, CSS seçicilerinden daha hızlı mıdır?
CSS seçicileri, tarayıcılarda HTML ve DOM geçişi için optimize edilmiştir. XPath daha ifade gücüne sahiptir: üst öğe geçişini, kardeş eksenlerini, sayısal koşulları ve CSS seçicilerinin ifade edemediği yerleşik işlevleri destekler. HTML için CSS seçicileri (querySelector) genellikle daha hızlıdır. XML için ise sunucu tarafı kütüphanelerinin çoğu yalnızca XPath sunar; CSS seçicileri bir seçenek bile değildir.