Bu Araç Nedir?
XPath (XML Path Language), bir XML belgesindeki düğümleri — elementleri, öznitelikleri, metni — kompakt yol benzeri bir sözdizimi kullanarak gezinmek ve seçmek için bir W3C standardıdır; örneğin `//book[price>30]/title`, belgenin herhangi bir yerinde, kardeş `<price>` değeri 30'dan büyük olan her `<title>` elementini seçer. XSLT stil sayfaları, XML doğrulama araçları, web kazıyıcıları (scraper), tarayıcı otomasyon çerçeveleri (Selenium, Playwright) ve birçok programlama dilinin XML kütüphanesi tarafından kullanılır.
Her büyük tarayıcının — Chrome, Firefox, Safari, Edge — uyguladığı mevcut sürüm XPath 1.0, yani 1999 tarihli orijinal W3C Tavsiyesi'dir. Bu araç, tarayıcının `document.evaluate()` API'si üzerinden tam olarak bu yerel motoru kullanır, dolayısıyla buradaki sonuçlar tarayıcı geliştirici araçlarından veya bir tarayıcıda çalışan herhangi bir JavaScript'ten alacağınız sonuçlarla eşleşir. Daha sonraki XPath 2.0/3.0/3.1 spesifikasyonlarını uygulamaz (bunlar `for`, diziler ve regex eşleştirme gibi fonksiyonlar ekler) — bunun pratikte ne anlama geldiğini SSS bölümünde görebilirsiniz.
Bir ifade iki tür sonuçtan birini döndürebilir: bir düğüm kümesi (bu aracın serileştirip her satıra bir tane olacak şekilde bir sayaçla listelediği sıfır veya daha fazla eşleşen element, öznitelik ya da metin düğümü) veya bir skaler değer — `count(//book)` ya da `//book[1]/title = 'Dune'` gibi ifadenin kendisi bir değer hesapladığında ortaya çıkan bir sayı, dize veya boolean.
Neden Kullanmalısınız?
- Bir web kazıyıcıya, Selenium/Playwright testine veya XSLT stil sayfasına gömmeden önce bir XPath ifadesini hata ayıklayın.
- Gerçek bir XML/HTML örneğinden verilen bir XPath'in beklediğiniz düğümü seçip seçmediğini hızlıca kontrol edin.
- Koddan tahmin etmek yerine tam eşleşme sayılarını ve serileştirilmiş çıktıyı görün.
- Kriptik bir yığın izleme yerine, bozuk XML veya geçersiz XPath sözdizimi için anında, okunabilir hatalar alın.
- %100 istemci tarafında: XML'iniz ve ifadeniz asla tarayıcınızdan çıkmaz.
Nasıl Kullanılır
- XML'inizi (veya HTML'inizi) giriş kutusuna yapıştırın veya düzenleyin — çalıştığını hemen görebilmeniz için örnek bir kitapçı belgesi önceden doldurulmuştur.
- İfade alanına bir XPath ifadesi yazın veya önceden doldurulmuş örneği düzenleyin.
- "Değerlendir" düğmesine tıklayın (veya ifade alanında Enter tuşuna basın).
- Eşleşen düğümleri, üstte bir sayaçla birlikte aşağıda okuyun; skaler sonuçlar (sayılar, dizeler, booleanlar) doğrudan gösterilir.
- XML veya ifade geçersizse, sonuçların yerini belirli bir hata mesajı alır.
Örnek
Giriş
XML:
<bookstore>
<book><title>The Great Gatsby</title><price>12.99</price></book>
<book><title>Learning XPath</title><price>34.50</price></book>
<book><title>Dune</title><price>45.00</price></book>
</bookstore>
XPath: //book[price>30]/titleÇıkış
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>3 kitaptan yalnızca 2'sinin fiyatı 30'un üzerinde, bu yüzden tam olarak 2 <title> elementi döndürülür — üçüncü kitap (Gatsby, 12,99$) doğru şekilde hariç tutulur.
Bir bakışta XPath ile CSS seçicileri
Her iki dil de bir belgeden düğüm seçer, ancak farklı sorunları çözerler. Belirli bir seçim için doğru aracı seçmek üzere bu tabloyu kullanın.
| Yetenek | XPath | CSS seçicileri |
|---|---|---|
| Etikete/sınıfa/kimliğe göre aşağı doğru seçim | Evet | Evet — ve genellikle daha hızlı |
| Görünür/metin içeriğine göre seçim | Evet — `contains(text(),'x')` | Hayır |
| Bir üst/atalara doğru yukarı gezinme | Evet — `//div[span]/..` | Hayır (`:has()` daha yeni, kısmi bir istisna) |
| Kardeş değer karşılaştırmaları (örn. `price>30`) | Evet | Hayır |
| Tarayıcı dışında çalışır (sunucu tarafı XML araçları, XSLT) | Evet | Hayır — CSS seçicileri tarayıcıya/DOM'a özgüdür |
İlgili araçlar
Yapılandırılmış veri formatlarıyla mı çalışıyorsunuz? Bu araçlar XPath testiyle iyi eşleşir.
Sıkça Sorulan Sorular
XPath ne için kullanılır?
XPath, bir yol sözdizimi kullanarak bir XML veya HTML belgesinden düğümleri — elementleri, öznitelikleri veya metni — seçer. XSLT dönüşümlerinin ve birçok XML doğrulayıcısının arkasındaki seçim dilidir; ayrıca web kazımada ve tarayıcı test otomasyonunda (Selenium, Playwright, Cypress) bir sayfadaki elementleri bulmak için yaygın olarak kullanılır, özellikle CSS seçicilerinin tek başına ifade edemediği koşullar söz konusu olduğunda.
XPath ile CSS seçicileri — hangisini kullanmalıyım?
Örtüşürler ama eşdeğer değildirler. XPath, bir çocuğun içeriğine göre bir üst elementi seçebilir (`//div[span='Total']`), atalara doğru yukarı çıkabilir ve görünür metne göre seçim yapabilir (`//button[contains(text(),'Submit')]`) — CSS seçicileri ağaçta yukarı çıkamaz ve metin içeriğine hiç göre eşleşme yapamaz. Yalnızca etikete, sınıfa veya kimliğe göre belgede aşağı doğru seçim yapıyorsanız, CSS seçicileri yazması daha basittir ve genellikle değerlendirmesi daha hızlıdır. "Bu metnin üst elementini seç" veya "elementin ne söylediğine göre seç" gerektiğinde, sadece ne ile etiketlendiğine veya sınıflandırıldığına göre değil, XPath'e başvurun.
Bu araç XPath 2.0 veya 3.0 fonksiyonlarını destekliyor mu?
Hayır — hiçbir tarayıcı da desteklemiyor. Tarayıcılar `document.evaluate()` üzerinden XPath 1.0'ı (1999 W3C Tavsiyesi) uygular ve bu araç da tam olarak o yerel motoru kullanır, dolayısıyla tarayıcı geliştirici araçlarında veya JavaScript'te aynı ifadeyi çalıştırdığınızda alacağınız sonuçlarla birebir uyumludur. XPath 2.0/3.0/3.1'de tanıtılan fonksiyonlar ve özellikler (`for` ifadeleri, diziler veya regex ile `matches()` gibi) mevcut değildir — burada yalnızca `contains()`, `starts-with()`, `substring()`, `count()`, `position()` ve `last()` gibi 1.0 fonksiyonları çalışır.
Bilmem gereken yaygın XPath ifadeleri nelerdir?
`//tag`, belgenin herhangi bir yerindeki her `<tag>` elementini seçer. `//tag[@attr='value']`, `attr` özniteliği `value`'ya eşit olan `<tag>` elementlerini seçer. `//tag[contains(text(),'x')]`, doğrudan metni `x` içeren `<tag>` elementlerini seçer. `//tag[1]`, her üst elementteki ilk `<tag>` kardeşini seçer. `//parent/child`, `<parent>`'ın doğrudan çocuğu olan `<child>` elementlerini seçer. `count(//tag)`, bir düğüm kümesi yerine bir sayı döndürür.
Bu araç XML ad alanlarını (namespace) destekliyor mu?
Yalnızca yaygın, ad alanı olmayan durum düzgün şekilde desteklenir; bu da elle yazılmış veya kazınmış XML/HTML'in büyük çoğunluğunu kapsar. Belgeniz bir XML ad alanı bildiriyorsa (örneğin kök elementte `xmlns="..."`), `document.evaluate` önekleri URI'lere eşleyen ad alanı farkında bir çözümleyici (resolver) fonksiyonu gerektirir; bu basit araç bunu kurmaz — ad alanlı XML'e karşı ifadeler doğru görünseler bile sıfır eşleşme döndürebilir. Bu bilinen bir sınırlamadır, hata değildir: örneğinizden ad alanı bildirimini kaldırın veya bir geçici çözüm olarak local-name() fonksiyonunu kullanın (örneğin `//*[local-name()='title']`).
XML'im veya XPath ifadem bir sunucuya gönderiliyor mu?
Hayır. Her şey tarayıcınızın yerleşik `DOMParser` ve `document.evaluate()` özellikleri kullanılarak yerel olarak çalışır — tarayıcınızın zaten dahili olarak kullandığı aynı motor. Yazdığınız veya yapıştırdığınız hiçbir şey cihazınızdan asla çıkmaz.