Xpath, bir belgenin xml veya xhtml öğeleri için bir sorgu dilidir. SQL gibi, xpath da bildirimsel bir sorgu dilidir. İlgilenilen verileri almak için, bu verileri açıklayan bir sorgu oluşturmanız yeterlidir. Tüm "kirli" işler sizin için xpath dil tercümanı tarafından yapılacaktır.
Çok uygun, değil mi? Web sayfası düğümlerine erişmek için xpath'in neler sunduğuna bir göz atalım.
Web sayfası ana bilgisayarlarına istekte bulunma
Bir web sayfasına xpath isteklerinin oluşturulmasını göstereceğim küçük bir laboratuvar çalışmasını dikkatinize sunuyorum. Verdiğim istekleri tekrar edebilecek ve en önemlisi kendi isteklerinizi yerine getirmeye çalışabileceksiniz. Bu sayede makalenin xpath by xml'ye aşina olan yeni başlayanlar ve programcılar için eşit derecede ilginç olacağını umuyorum.Laboratuvar için ihtiyacımız olan:
- xhtml web sayfası;
- Eklentileri olan Mozilla Firefox tarayıcısı;
- ateş böceği;
- yangın Yolu ;
(görsel xpath destekli başka bir tarayıcı kullanabilirsiniz)
- az zaman.
Deney için bir web sayfası olarak World Wide Web Consortium ("http://w3.org") sitesinin ana sayfasını öneriyorum. xquery(xpath) dillerini, xhtml spesifikasyonunu ve diğer birçok İnternet standardını geliştiren bu organizasyondur.
Bir görev
xpath sorgularını kullanarak w3.org ana sayfasının xhtml kodundan konsorsiyum konferans bilgilerini alın.xpath sorguları yazmaya başlayalım.
İlk XPath İsteği
FireBug'da Firepath yer imini açın, seçici ile analiz edilecek öğeyi seçin, tıklayın: Firepath, seçilen öğe için bir xpath sorgusu oluşturdu.İlk etkinliğin başlığını seçtiyseniz, istek şu şekilde olacaktır:
Gereksiz dizinleri kaldırdıktan sonra, sorgu "başlık" türünün tüm öğeleriyle eşleşecektir.
Firepath, sorguyla eşleşen öğeleri vurgular. Hangi belge düğümlerinin sorguyla eşleştiğini gerçek zamanlı olarak görebilirsiniz.
Konferans yerleri hakkında bilgi talebi:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Sponsor listesini şu şekilde alıyoruz:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
xpath sözdizimi
Oluşturduğumuz sorgulara geri dönelim ve nasıl çalıştıklarını görelim.İlk sorguya daha yakından bakalım.
Bu sorguda, xpath'in yeteneklerini göstermek için üç parçaya ayırdım. (Parçalara bölme gelenekseldir)
İlk kısım
.//
- mevcut bağlamdan hiyerarşinin sıfır veya daha fazla düzeyine özyinelemeli iniş. Bizim durumumuzda, geçerli bağlam belge köküdür.
İkinci kısım
*
- herhangi bir element
[@id="w3c_home_upcoming_events"]– "w3c_home_upcoming_events"e eşit bir id özniteliğine sahip bir düğümü aramamıza dayanan bir yüklem. XHTML öğe kimlikleri benzersiz olmalıdır. Bu nedenle, "belirli bir kimliğe sahip herhangi bir öğe" sorgusu, aradığımız tek düğümü döndürmelidir.
değiştirebiliriz *
tam ana bilgisayar adına div bu istekte
div[@id="w3c_home_upcoming_events"]
Böylece, belge ağacından div[@id="w3c_home_upcoming_events"] ihtiyacımız olan düğüme iniyoruz. DOM ağacının hangi düğümlerden oluştuğunu ve yukarıda kaç hiyerarşi seviyesinin kaldığını kesinlikle umursamıyoruz.
üçüncü kısım
/ul/li/div/p/a–xpath - belirli bir öğeye giden yol. Yol, adresleme adımlarından ve düğüm kontrol koşullarından (ul, li, vb.) oluşur. Adımlar "/" (eğik çizgi) ile ayrılır.
Koleksiyonlar
Bir yüklem veya adresleme adımları kullanarak ilgilenilen düğüme erişmek her zaman mümkün değildir. Çoğu zaman, aynı hiyerarşi seviyesinde aynı türden birkaç düğüm vardır ve “yalnızca birinci” veya “yalnızca ikinci” düğümlerin seçilmesi gerekir. Bu gibi durumlar için koleksiyonlar sağlanır.xpath koleksiyonları, bir öğeye dizinine göre erişmenizi sağlar. Dizinler, öğelerin kaynak belgede sunulduğu sıraya karşılık gelir. Koleksiyonlardaki sıra sayısı birden sayılır.
"Mekan"ın her zaman "toplantı adı"ndan sonraki ikinci paragraf olduğu gerçeğinden yola çıkarak aşağıdaki sorguyu alırız:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Burada p, /ul/li/div listesindeki her düğüm için kümedeki ikinci öğedir.
Benzer şekilde, bir sorgu ile sponsorların bir listesini alabiliriz:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Bazı xpath işlevleri
xpath, bir koleksiyon içindeki öğelerle çalışmak için birçok işleve sahiptir. Bunlardan sadece birkaçını aktaracağım.geçen():
Koleksiyonun son öğesini döndürür.
ul/li/div/p - sorgusu, "ul" listesindeki her düğüm için son paragrafları döndürür.
first() işlevi sağlanmadı. İlk öğeye erişmek için "1" dizinini kullanın.
Metin():
Öğenin test içeriğini döndürür.
.//a - "Arşiv" metnine sahip tüm bağlantıları alın.
pozisyon() ve mod:
position() - kümedeki bir öğenin konumunu döndürür.
mod, bölümün geri kalanıdır.
Bu işlevleri birleştirerek şunları elde edebiliriz:
- ul/li öğeleri bile yok
- eşit elemanlar: ul/li
Karşılaştırma işlemleri
- < - логическое «меньше»
- > - mantıksal "büyüktür"
- <= - логическое «меньше либо равно»
- >= - mantıksal "büyüktür veya eşittir"
kendi başına
Şunları almaya çalışın:- soldaki "Standartlar" menüsünden URL bağlantıları bile;
- w3c.org'un ana sayfasındaki ilk haber hariç tüm haberlerin manşetleri.
PHP5'te Xpath
$dom = yeni DomDocument(); $dom->loadHTML($HTMLCode); $xpath = yeni DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $nesne) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )Nihayet
Basit bir örnekle, xpath'in web sayfası düğümlerine erişme gücünü gördük.Xpath, xml ve xhtml öğelerine, xslt dönüşümlerine erişmek için endüstri standardıdır.
Herhangi bir html sayfasını ayrıştırmak için kullanabilirsiniz. Kaynak html kodu önemli biçimlendirme hataları içeriyorsa, onu iletin.
Steno XPath Sözdizimi
XPath sözdizimi kısayolları oldukça kullanışlı olabilir. Kurallar aşağıdadır:
Self::node() olarak kısaltılabilir. ;
Parent::node(), .. olarak kısaltılabilir;
Child::childname, childname olarak kısaltılabilir;
Attribute::childname @childname olarak kısaltılabilir;
/descendant-or-self::node()/, // olarak kısaltılabilir.
Örneğin, .//PLANET konum yolu self::node()/descendant-or-self::node()/child::PLANET için kısa yoldur. Ayrıca , like , vb. gibi yüklem ifadesini de kısaltabilirsiniz. XPath konum yollarıyla çalışmak, kısayol sözdizimi sayesinde çok daha kolaydır. Aşağıdaki liste, kısaltılmış sözdizimini kullanan birkaç konum yolu örneğini listeler:
PLANET alt öğeleri döndürür
* bağlam düğümünün tüm alt öğelerini döndürür;
Text(), bağlam düğümünün tüm alt metin düğümlerini döndürür;
@UNITS, bağlam düğümünün UNITS özniteliğini döndürür;
@* bağlam düğümünün tüm özniteliklerini döndürür;
PLANET üçüncü çocuğu geri getiriyor
PLANET son çocuğu geri getiriyor
*/PLANET tüm torunları döndürür
/PLANETS/PLANET/NAME ikinci öğeyi döndürür //PLANET tüm çocukları döndürür PLANETS//PLANET alt öğeleri döndürür //PLANET/NAME tüm öğeleri döndürür Bağlam düğümünün kendisini döndürür; .//PLANET alt öğeleri döndürür Bağlam düğümünün üst öğesini döndürür; ../@UNITS, bağlam düğümünün üst öğesinin UNITS özniteliğini döndürür; .//.. bağlam düğümünün çocuğunun tüm ebeveynlerini ve bağlam düğümünün ebeveynini döndürür; PLANET çocukları geri getiriyor PLANET çocukları geri getiriyor PLANET[@UNITS="days"] tüm çocukları döndürür PLANET[@UNITS="days"] altıncı çocuğu döndürür PLANET[@COLOR ve @UNITS] tüm çocukları döndürür " //PLANET " tüm öğeleri seçer * herhangi bir elemanı seçer *[@UNITS], bağlam düğümünün UNITS özniteliğine sahip ilk beş alt öğesini seçer. Kısaltılmış Sözdizimi Kalıplar için eksen kısaltması için iki kural vardır: child::childname, childname olarak kısaltılabilir; öznitelik::çocukadı @çocukadı olarak kısaltılabilir.Aşağıdaki liste, kısaltılmış sözdizimi kalıplarının birkaç örneğini listeler; bölümün sonunda göreceksiniz Steno Yüklem Sözdizimi Yüklem ifadeleri "position()=" atlanarak kısaltılabilir. Örneğin, olur, olur, vb. Kısaltılmış sözdizimini kullanmak, yüklemlerde XPath ifadelerini kullanmayı çok daha kolaylaştırır. İşte bir satır XPath Numaraları XPath, sayıları çift duyarlıklı kayan nokta biçiminde saklar. Resmi tanıma göre, XPath sayıları IEEE 754 64-bit çift duyarlıklı kayan nokta biçiminde saklanmalıdır ve tüm sayılar kayan nokta sayıları olarak depolanır. XPath Eksenlerini Uygulama Şimdiye kadar konum adımlarının üç bölümünü ele aldık - eksen, düğüm koşulu ve yüklem. Seçim kalıplarıyla yaptığımız çalışmadan bu öğelere aşina olmalısınız, ancak önceki örnekte, kardeşten önceki eksene dikkat edin. Hala XPath İfadelerini Test Etme Xalan paketi, bir belgeye XPath ifadesi uygulamanıza ve sonuca bakmanıza izin veren, test ederken çok yardımcı olan, ApplyXPath.java adlı kullanışlı bir örnek program içerir. Bu örneği çalıştırmak için, şu durumlarda ApplyXPath.java'yı ApplyXPath.class'ta derlemeniz gerekir: Xpath- bildirimsel sorgu dili elementlere xml veya (x)html belge ve xslt dönüşümler. Yararlı kaynaklar: Rusça Xpath 1.0 için tam spesifikasyon burada - http://citforum.ru/internet/xpath/xpath.shtml. Xpath Çevrimiçi Test Cihazı - http://www.xpathtester.com/xpath/ DOM öğelerini XPath ile aramak için Firebug'un yerleşik bir işlevi vardır: $x(xpath [, contextNode [, resultType]]) Sonuç türü: XPathResult.NUMBER_TYPE XPathResult.STRING_TYPE XPathResult.BOOLEAN_TYPE XPathResult.FIRST_ORDERED_NODE_TYPE XPathResult.UNORDERED_NODE_ITERATOR_TYPE Firebug'da XPATH sorgularını kullanmaya bir örnek: $x("//tr[@veri-yer]/@veri-yer").değer $x("string(//tr[@veri-yer]/@veri-yer)") p/ancestor::* # tüm ebeveynler (http://bit.ly/1ta7mh9) p/following-sibling::* # takip eden tüm kardeşler p/preceding-sibling::* # önceki tüm kardeşler p/following::* # sonraki tüm öğeler (http://bit.ly/1ta83H5) p/preceding::* # atalar hariç tüm önceki öğeler p/descendant-or-self::* # bağlam düğümü ve tüm alt öğeleri p/ancestor- or-self::* # bağlam düğümü ve tüm ataları Filtreleme öğelerini gösterir Input[@type=text] # niteliklerinin önüne @ input[@class="OK"] # p # niteliksiz paragraflar *[@style] # stil niteliği a[ olan tüm öğeler. = "Tamam"] # "Tamam" değerine sahip bağlantılar a/@id # bağlantı kimlikleri a/@* # tüm bağlantı öznitelikleri a[@id ve @rel] # kimlik ve rel özniteliklerini içeren bağlantılar a[@id][ @rel] # aynen bir # bağlantı bir öğe içerir veya
Çekirdek Xpath İşlevleri - http://www.w3.org/TR/xpath/#corelib Ad() # dönüş öğesi adı dize(val) dize(a/@id) # öznitelik değerini al substring(val, from, to) substring(@id, 1, 6) # dizenin kesme kısmı substring-after(val, from ) substring-after(@id, "FROM") substring-before string-length() # dizedeki karakter sayısını döndürür count() # öğelerin sayısını döndürür concat() normalize-space() # benzer trim, boşlukları kaldırır Örnek: -with() include() translate("bar","abc","ABC") # BAr XPath, bir XML belgesindeki düğümleri ve düğüm kümelerini seçmek için yol ifadelerini kullanır. Bir düğüm, önceden belirlenmiş bir yol veya sözde adımlar izlenerek seçilir. XPath sözdizimini göstermek için aşağıdaki XML belgesi kullanılacaktır:
Bir XML belgesindeki düğümleri seçmek için XPath yol ifadelerini kullanır. Verilen yol izlenerek düğüm seçilir. En kullanışlı yol ifadeleri: Aşağıdaki tablo, örnek XML belgesinde bazı seçimler yapmanıza izin veren bazı XPath ifadelerini listeler: Tahminler, belirli bir düğümü veya belirli bir değere sahip bir düğümü bulmanızı sağlar. Tahminler her zaman köşeli parantez içine alınır. Aşağıdaki tabloda, örnek XML belgesine karşı seçim yapılmasına izin veren yüklemlerle birlikte bazı XPath ifadeleri listelenmektedir: Bir XML belgesinde önceden bilinmeyen düğümleri bulmak için XPath, özel karakterlerin kullanılmasına izin verir. Aşağıdaki tabloda, örnek XML belgesine karşı seçim yapılmasına izin veren özel karakterlere sahip bazı XPath ifadeleri listelenmektedir: Operatörü kullanma | XPath ifadesinde birden çok yol seçmenize olanak tanır. Aşağıdaki tabloda, örnek XML belgesinde seçim yapmanıza izin veren bazı XPath ifadeleri listelenmiştir.Firebug'da Xpath'i Kullanma
Örnekler
//div //a //*/ata-veya-kendi::düğmesi Temel Sözdizimi
yollar
. # mevcut bağlam.// # özyinelemeli olarak alçalma (geçerli bağlamdan sıfır veya daha fazla seviye) /html/body # mutlak yol tablosu//a # göreceli yol a # mevcut bağlama göreli yol //* # mevcut bağlamdaki her şey li/* /a # li'nin "torunları" olan bağlantılar //a|//button # bağlantılar ve düğmeler (iki düğüm kümesini birleştirir) ilişkiler
a/i/parent::p # acil ebeveyn, Düğüm Alma
/div/text() # metin düğümlerini al /div/text() # ilk metin düğümünü al eleman konumu
a # ilk öğe a # son öğe a[i] # öğeyi içeren ikinci bağlantı a # İlk 3 bağlantı ul # ilk elemanı "OK" değerini içeren bir liste (UL) tr # eleman bile değil tr # çift eleman p/text() # ikinci metin düğümü Özellikler ve filtreler
Fonksiyonlar
Matematik
//p[ pozisyon() = kat(son() div 2 + 0.5) veya pozisyon() = tavan(last() div 2 + 0.5) ] //tr pozisyon() # div # bölme mod # bölme tavanın kalanı () # minimum tamsayı tabanı() # maksimum tamsayı turu() toplam() gruplama
(tablo/tbody/tr) # son satır tüm tablolardan (//h1|//h2) # "Metin" içeren birinci veya ikinci düzey başlık Bileşik filtre koşulları
Örnek XML Belgesi
düğüm seçimi
XPath ifadesi
Sonuç
mesajlar
"Mesajlar" adlı tüm düğümleri seçer
/mesajlar
Mesajların kök öğesini seçer
Not: Yol bir eğik çizgi (/) ile başlıyorsa, her zaman öğeye giden mutlak yolu temsil eder!mesajlar/not
Mesajlar öğesinin alt öğeleri olan tüm not öğelerini seçer
// Not
Belgenin neresinde olursa olsun tüm not öğelerini seçer
mesajlar//not
Mesajlar öğesinden nerede olduklarına bakılmaksızın, mesajlar öğesinin alt öğeleri olan tüm not öğelerini seçer
//@tarih
Tarih adlı tüm nitelikleri seçer
yüklemler
XPath ifadesi
Sonuç
/mesajlar/not
Mesajlar öğesinin doğrudan alt öğesi olan ilk not öğesini seçer.
Not: IE 5,6,7,8,9'da ilk düğüm olurdu , ancak W3C'ye göre olması gerekir . IE'de bu sorunu çözmek için SelectionLanguage seçeneğini XPath olarak ayarlamanız gerekir.
JavaScript'te: xml.setProperty("SelectionLanguage","XPath");/mesajlar/not
Mesajlar öğesinin doğrudan alt öğesi olan son not öğesini seçer.
/mesajlar/not
Mesajlar öğesinin doğrudan alt öğesi olan sondan bir önceki not öğesini seçer.
/mesajlar/not
Tarih özniteliğine sahip tüm başlık öğelerini seçer
//başlık[@date="10/01/2008"]
"01.10.2008" değerine sahip bir tarih özniteliğine sahip tüm başlık öğelerini seçer
Önceden bilinmeyen düğümlerin seçimi
Çoklu yol seçimi
Altın Numaralar Güzel bir telefon numarası nasıl satılır
Kripto para madenciliği: basit kelimelerle nedir
En iyi dizüstü bilgisayar işletim sistemi: Eksiksiz inceleme
Sınıf arkadaşlarından müzik indirmek için programlar Sosyal ağ sınıf arkadaşlarından üzücü bir şarkı indirin
Yandex tarayıcısının mobil versiyonu