Qisqartirilgan XPath sintaksisi. html ga xpath so'rovlariga misollar Quyidagi o'qdan foydalanish

XPath XML hujjatining elementlari va atributlari bo'ylab harakatlanish uchun ishlatiladi. XPath W3C XSLT standartidagi asosiy elementlardan biridir.

1 Nima bo'ldi XPath

XPath ifodalari

XPath XML hujjatidagi alohida tugunlarni yoki tugunlar to'plamini tanlash uchun yo'l ifodalaridan foydalanadi. Ushbu iboralar an'anaviy kompyuter fayl tizimi bilan ishlashda ko'rgan ifodalarga juda o'xshaydi.

Standart XPath funktsiyalari

XPath 100 dan ortiq o'rnatilgan funktsiyalarni o'z ichiga oladi. Satr va raqamli qiymatlar, sana va vaqt, tugunlarni taqqoslash va QName manipulyatsiyasi, ketma-ketlikni boshqarish, mantiqiy qiymatlar va boshqalar uchun funktsiyalar mavjud.

XSLT da XPath ishlatiladi

XPath XSLT standartidagi asosiy elementlardan biridir. XPath-ni bilmasangiz, siz XSLT hujjatlarini yarata olmaysiz.

2 Terminologiya XPath

Tugunlar

XPath-da yetti turdagi tugunlar mavjud: element, atribut, matn, nomlar maydoni, ishlov berish ko'rsatmalari, sharhlar va hujjat tugunlari. XML hujjatlari tugunlar daraxti sifatida qayta ishlanadi. Daraxtning yuqori elementi ildiz elementi deb ataladi. Quyidagi XML hujjatiga qarang:

Garri Potter J. K. Rouling 2005 29.99

Yuqoridagi XML hujjatidagi misol tugunlari:

(ildiz element) J. K. Rouling (tugun) lang="en"(xususiyat)

Atom qiymatlari

Atom qiymatlari bolalari yoki ota-onalari bo'lmagan tugunlardir. Atom qiymatlariga misol:

J. K. Rouling "en"

Elementlar

Elementlar atom qiymatlari yoki tugunlardir.

3 Aloqa tugunlar

Ota-ona

Har bir element va atribut bitta ota-onaga ega. Quyidagi misolda kitob elementi nom, muallif, yil va narx elementlarining ota-onasi hisoblanadi:

Garri Potter JK Rouling 2005 29.99

Avlodlar

Element tugunlari nol, bitta yoki bir nechta bolalarga ega bo'lishi mumkin. Quyidagi misolda "nom", "muallif", "yil" va "narx" elementlari kitob elementining bolalaridir:

Garri Potter JK Rouling 2005 29.99

Bir xil darajadagi elementlar

Bu bir xil ota-onaga ega bo'lgan tugunlar. Quyidagi misolda "nom", "muallif", "yil" va "narx" elementlari bir xil darajadagi elementlardir:

Garri Potter JK Rouling 2005 29.99

Ajdodlar

Tugunning ota-onasi, tugunning ota-onasi va boshqalar. Quyidagi misolda nom elementining ajdodlari kitob va kitob do‘koni elementlari hisoblanadi:

Garri Potter JK Rouling 2005 29.99

Avlodlar

Tugun bolalari, tugun bolalarining bolalari va boshqalar. Quyidagi misolda "kitob do'koni" elementining bolalari "kitob", "nom", "muallif", "yil" va "narx" elementlari:

Garri Potter JK Rouling 2005 29.99

4 Sintaksis XPath

XPath XML hujjatidagi tugunlar yoki tugunlar to'plamini tanlash uchun yo'l ifodalaridan foydalanadi. Tugunni yo'l yoki qadamlar bo'yicha tanlash mumkin. Quyidagi misollarda quyidagi XML hujjatidan foydalanamiz.

Garri Potter 29.99 XML o'rganish 39.95

Tugun tanlash

XML hujjatidagi tugunlarni tanlash uchun XPath iboralaridan foydalanib, siz yo'l yoki qadamlarni bajarish orqali tugunni tanlashingiz mumkin. Eng foydali yo'l iboralari quyida keltirilgan:

Quyidagi jadvalda ba'zi ifoda yo'llari va ifodani bajarish natijasi ko'rsatilgan:

XPath ifodasi Natija
kitob do'koni "Kitob do'koni" deb nomlangan barcha tugunlarni tanlaydi
/ kitob do'koni Kitob doʻkonining ildiz elementini tanlaydi

Eslatma: Agar yo'l qiyshiq chiziq (/) bilan boshlansa, u har doim elementga mutlaq yo'l bo'ladi!

kitob do'koni / kitob "Kitob do'koni" elementining bolalari bo'lgan barcha "kitob" elementlarini tanlaydi
//kitob Hujjatning qayerda joylashganidan qat'i nazar, barcha "kitob" elementlarini tanlaydi
kitob do'koni // kitob "Kitob do'koni" elementi ostidagi joydan qat'i nazar, "kitob do'koni" elementining bolalari bo'lgan barcha "kitob" elementlarini tanlaydi.
//@lang "lang" deb nomlangan barcha atributlarni tanlaydi

Predikatlar

Predikatlar ma'lum bir tugunni yoki ma'lum bir qiymatni o'z ichiga olgan tugunni topish uchun ishlatiladi. Predikatlar har doim kvadrat qavslar bilan o'ralgan. Quyidagi jadvalda predikatlar bilan ba'zi yo'l iboralari va ifoda natijasi keltirilgan:

XPath ifodalari Natija
/ kitob do'koni / kitob "Kitob do'koni" elementining bolasi bo'lgan birinchi "kitob" elementini tanlaydi.

Eslatma: IE 5,6,7,8,9 da birinchi tugun indeksiga ega, lekin W3C ko'rsatmalariga ko'ra, u . IE da ushbu muammoni hal qilish uchun XPath uchun "SelectionLanguage" opsiyasini o'rnating:

JavaScript-da: xml.setProperty("SelectionLanguage", "XPath");
/ kitob do'koni / kitob "Kitob do'koni" elementining bolasi bo'lgan oxirgi "kitob" elementini tanlaydi
/ kitob do'koni / kitob “Kitob do‘koni” elementining asosiy elementi bo‘lgan oxirgi “kitob” elementini tanlaydi
/ kitob do'koni / kitob "Kitob do'koni" elementining bolalari bo'lgan birinchi ikkita "kitob" elementini tanlash
//sarlavha[@lang] "lang" atributiga ega bo'lgan barcha "sarlavha" elementlarini tanlaydi
//sarlavha[@lang="en"] "en" qiymatiga ega "til" atributiga ega bo'lgan barcha "title" elementlarini tanlaydi
/ kitob do'koni / kitob Qiymati 35.00 dan katta boʻlgan “narx” elementiga ega “kitob doʻkoni” elementidan keyin barcha “kitob” elementlarini tanlaydi.
/ kitob do'koni / kitob / nom Qiymati 35,00 dan katta bo'lgan "narx" elementiga ega "kitob do'koni" elementining barcha kitob "nomi" elementlarini tanlaydi.

Noma'lum tugunlarni tanlash

Noma'lum XML tugunlarini tanlash uchun XPath maxsus belgilaridan foydalanish mumkin.

Quyidagi jadvalda biz ba'zi ifoda yo'llari va ifoda natijalarini sanab o'tdik:

Bir nechta yo'llarni tanlash

operatoridan foydalanish | XPath ifodalarida siz bir nechta yo'llarni tanlashingiz mumkin. Quyidagi jadvalda bir nechta yo'l ifodalari va ularning natijalari keltirilgan:

5 Akslar XPath

Biz keyingi misolda quyidagi XML hujjatidan foydalanamiz.

Garri Potter 29.99 XML o'rganish 39.95

O'qlar joriy tugunga nisbatan tugunlar to'plamini belgilaydi.

Eksa nomi Natija
ajdod Joriy tugunning barcha ajdodlarini (ota-onalar, bobo va buvilar va boshqalar) tanlaydi
ajdod yoki o'zi Joriy tugun va joriy tugunning barcha ajdodlarini (ota-onasi, bobosi va boshqalar) tanlaydi.
xususiyat
bola
avlod Joriy tugunning barcha bolalarini (bolalar, nabiralar va boshqalar) tanlaydi
avlod-yoki o'zi Joriy tugun va joriy tugunning barcha bolalarini (bolalar, nevaralar va boshqalar) tanlaydi.
quyidagi Joriy tugun tegi yopilgandan keyin hujjatdagi hamma narsani tanlaydi
keyingi aka-uka Joriy tugundan keyin bir xil darajadagi barcha tugunlarni tanlaydi
nom maydoni Joriy tugunning berilgan nom maydonidagi barcha tugunlarni tanlaydi
ota-ona Joriy tugunning ota-onasini tanlaydi
Oldingi Hujjatning joriy tugunidan oldin paydo bo'ladigan barcha tugunlarni tanlaydi, ajdodlar, atribut tugunlari va nom maydoni tugunlari bundan mustasno
oldingi aka-uka Joriy tugungacha bo'lgan barcha birodarlarni tanlaydi
o'zini Joriy tugunni tanlaydi

6 Ifodalar namuna olish yo'llari

Joylashuv yo'li mutlaq yoki nisbiy bo'lishi mumkin. Mutlaq joylashuv yo'li qiyshiq chiziq (/) bilan boshlanadi, lekin nisbiy yo'l yo'q. Ikkala holatda ham namuna olish yo'li qiyshiq chiziq bilan ajratilgan bir yoki bir nechta bosqichlardan iborat:

Mutlaq joylashuv yo'li:

/qadam/qadam/...

Nisbiy joylashuvni olish yo'li:

Qadam/qadam/...

Har bir qadam joriy tugunlar majmuasidagi tugunlarga nisbatan baholanadi. Bosqich quyidagilardan iborat:

  • eksa (tanlangan tugunlar va joriy tugun o'rtasidagi daraxt munosabatlarini belgilaydi);
  • tugunni tekshirish (o'q ichidagi tugunni aniqlaydi);
  • nol yoki undan ortiq predikatlar (tanlangan tugunlar to'plamini yanada takomillashtirish uchun)

Qadamni olish sintaksisi:

Axisname::nodetestAxisname::nodetest[bashoratchi]

Misol Natija
bola:: kitob Joriy tugunning bolalari bo'lgan barcha kitob tugunlarini tanlaydi
atribut ::lang Joriy tugunning til atributini (lang) tanlaydi
bola::* Joriy tugunning barcha bolalarini tanlaydi
xususiyat::* Joriy tugunning barcha atributlarini tanlaydi
bola::text() Joriy tugunning barcha matn tugunlarini tanlaydi
bola:: tugun() Joriy tugunning barcha bevosita bolalarini tanlaydi
avlod::kitob Joriy tugunning barcha bolalarini tanlaydi
ajdod::kitob Joriy tugunning "kitoblari" ning barcha ajdodlarini tanlaydi
ajdod yoki o'z :: kitob Joriy tugunning barcha kitob ajdodlarini va agar u ham kitob bo'lsa joriy tugunni tanlaydi
bola::*/child::narx Joriy tugundan bir daraja uzoqda joylashgan "narx" ning barcha bolalarini tanlaydi

7 Operatorlar XPath

XPath ifodalari tugunlar, satrlar, mantiqiy qiymatlar yoki raqamli qiymatlar to'plami sifatida qaytariladi. Quyida XPath ifodalarida ishlatiladigan operatorlar ro'yxati keltirilgan:

Operator Tavsif Misol
| Ikki tugunlar to'plamini hisoblaydi //kitob | //cd
+ Qo'shish 6 + 4
- Ayirish 6 - 4
* Ko'paytirish 6 * 4
div Bo'lim 8 div 4
= Tenglik narxi = 9.80
!= Tengsizlik narxi!=9,80
< Dan kichik; .. dan kamroq narx<9.80
<= Kamroq yoki teng narxi≤9,80
> Bundan ko'proq narxi>9,80
>= Ko'proq yoki teng narxi≤9,80
yoki Yoki narx=9,80 yoki narx=9,70
va VA narxi>9.00 va narxi<9.90
mod Bo'limning qolgan qismi 5 mod 2

8 Misollar XPath

Keling, bir nechta misollar bilan asosiy XPath sintaksisini ko'rib chiqaylik. Quyidagi misollarda biz "books.xml" XML hujjatidan foydalanamiz:

Har kuni italyancha Giada De Laurentis 2005 30.00 Garri Potter JK Rouling 2005 29.99 XQuery Kick Start Jeyms MakGovern Bothner uchun Kurt Kagl Jeyms Linn Vaidyanathan Nagarajan 2003 49.99 XML o'rganish Erik T. Rey 2003 39.95

XML hujjati yuklanmoqda

Ko'pgina zamonaviy brauzerlar tomonidan qo'llab-quvvatlanadigan XML hujjatlarini yuklab olish uchun XMLHttpRequest-dan foydalaning:

Var xmlhttp=yangi XMLHttpRequest()

Eski Microsoft brauzerlari uchun kod (IE 5 va 6):

Var xmlhttp=yangi ActiveXObject("Microsoft.XMLHTTP")

Tugun tanlash

Afsuski, XPath Internet Explorer-da boshqa brauzerlarga qaraganda boshqacha ishlashi mumkin. Bizning misollarimizda biz ko'pchilik brauzerlarda ishlashi kerak bo'lgan koddan foydalanamiz. Internet Explorer XML hujjatidagi tugunlarni tanlash uchun "selectNodes()" usulidan foydalanadi:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera va Safari XML hujjatidan tugunlarni tanlash uchun evaluate() usulidan foydalanadi:

XmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);

Barcha sarlavhalarni tanlang

Quyidagi misol barcha sarlavha tugunlarini tanlaydi:

/ kitob do'koni / kitob / nom

Birinchi kitobning nomini tanlash

Quyidagi misol "kitob do'koni" elementidan keyin birinchi "kitob" tugunining sarlavhasini tanlaydi:

/ kitob do'koni / kitob / nom

Barcha narxlarni tanlang

Quyidagi misol barcha narx tugunlarining matnini tanlaydi:

/ kitob do'koni / kitob / narx

Narxi >35 bo'lgan tugunlarni tanlaydi

Quyidagi misol narxlari 35 dan yuqori bo'lgan barcha tugunlarni tanlaydi:

/ kitob do'koni / kitob / narx

Narxi >35 bo'lgan sarlavha tugunlarini tanlash

Quyidagi misolda narxi 35 dan yuqori bo'lgan barcha nom tugunlari tanlanadi:

/ kitob do'koni / kitob / nom

Xpath - bu xml yoki xhtml hujjat elementlari uchun so'rovlar tili. Xuddi SQL kabi, xpath deklarativ so'rovlar tilidir. Qiziqarli ma'lumotlarni olish uchun siz ushbu ma'lumotlarni tavsiflovchi so'rovni yaratishingiz kerak. Xpath tili tarjimoni siz uchun barcha iflos ishlarni bajaradi.
Juda qulay, shunday emasmi? Keling, xpath veb-sahifa tugunlariga kirish uchun qanday imkoniyatlarni taqdim etishini ko'rib chiqaylik.

Veb-sahifa tugunlariga so'rov yaratish

Men sizning e'tiboringizga kichik laboratoriya ishini keltiraman, uning davomida men veb-sahifaga xpath so'rovlarini yaratishni namoyish qilaman. Siz men bergan so'rovlarni takrorlay olasiz va eng muhimi, o'zingiznikini bajarishga harakat qilasiz. Umid qilamanki, buning natijasida maqola yangi boshlanuvchilar va xml to xpath bilan tanish bo'lgan dasturchilar uchun bir xil darajada qiziqarli bo'ladi.

Laboratoriya uchun bizga kerak bo'ladi:
- xhtml veb-sahifasi;
- qo'shimchalar bilan Mozilla Firefox brauzeri;
- yong'inga qarshi;
- yong'in yo'li;
(siz Visual xpath-ni qo'llab-quvvatlaydigan har qanday boshqa brauzerdan foydalanishingiz mumkin)
- bir oz vaqt.

Tajriba o'tkazish uchun veb-sahifa sifatida men World Wide Web Consortium veb-saytining asosiy sahifasini taklif qilaman ("http://w3.org"). Aynan shu tashkilot xquery(xpath) tillarini, xhtml spetsifikatsiyasini va boshqa ko'plab Internet standartlarini ishlab chiqadi.

Vazifa
Konsorsium konferentsiyalari haqida ma'lumotni xpath so'rovlari yordamida w3.org bosh sahifasining xhtml kodidan oling.
Keling, xpath so'rovlarini yozishni boshlaylik.
Birinchi Xpath so'rovi
FireBug-da Firepath yorlig'ini oching, selektor yordamida tahlil qilinadigan elementni tanlang, bosing: Firepath tanlangan element uchun xpath so'rovini yaratdi.

Agar siz birinchi tadbir nomini tanlagan bo'lsangiz, so'rov quyidagicha bo'ladi:

Keraksiz indekslarni olib tashlaganingizdan so'ng, so'rov sarlavha turining barcha elementlariga mos keladi.

Firepath so'rovga mos keladigan elementlarni ta'kidlaydi. Qaysi hujjat tugunlari so'rovga mos kelishini real vaqt rejimida ko'rishingiz mumkin.

Konferentsiya joylari haqida ma'lumot olish uchun so'rov:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Biz homiylar ro'yxatini shunday olamiz:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

xpath sintaksisi

Keling, biz yaratgan so'rovlarga qaytaylik va ular qanday tuzilganligini tushunamiz.
Keling, birinchi so'rovni batafsil ko'rib chiqaylik

Ushbu so'rovda men xpath imkoniyatlarini ko'rsatish uchun uch qismga bo'ldim. (Qismlarga bo'linish qiyin)

Birinchi qism
.// - joriy kontekstdan ierarxiyaning nol yoki undan ortiq darajalariga rekursiv tushish. Bizning holatda, joriy kontekst hujjat ildizidir

Ikkinchi qism
* - har qanday element;
[@id="w3c_home_upcoming_events"]- predikat, uning asosida biz "w3c_home_upcoming_events" ga teng id atributiga ega bo'lgan tugunni qidiramiz. XHTML element identifikatorlari noyob bo'lishi kerak. Shuning uchun, "ma'lum bir identifikatorga ega har qanday element" so'rovi biz izlayotgan yagona tugunni qaytarishi kerak.

Biz almashtira olamiz * tugunning aniq nomiga div bu so'rovda
div[@id="w3c_home_upcoming_events"]

Shunday qilib, biz hujjat daraxti bo'ylab bizga kerak bo'lgan div[@id="w3c_home_upcoming_events"] tuguniga tushamiz. DOM daraxti qaysi tugunlardan iboratligi va yuqorida qancha ierarxiya darajasi qolishi bizni umuman qiziqtirmaydi.

Uchinchi qism
/ul/li/div/p/a-xpath - bu ma'lum bir elementga yo'l. Yo'l manzil qadamlari va tugunlarni tekshirish shartlaridan (ul, li va boshqalar) iborat. Bosqichlar "/" (qiyshiq chiziq) belgisi bilan ajratiladi.

xpath to'plamlari
Predikat yoki adreslash qadamlari yordamida qiziqish tuguniga kirish har doim ham mumkin emas. Ko'pincha bitta ierarxiya darajasida bir xil turdagi ko'plab tugunlar mavjud va "faqat birinchi" yoki "faqat ikkinchi" tugunlarni tanlash kerak. Bunday holatlar uchun to'plamlar taqdim etiladi.

xpath to'plamlari elementga indeks bo'yicha kirish imkonini beradi. Indekslar elementlarning dastlabki hujjatda taqdim etilgan tartibiga mos keladi. To'plamlardagi seriya raqami bittadan hisoblanadi.

"Makon" har doim "konferentsiya nomi" dan keyin ikkinchi xatboshi ekanligiga asoslanib, biz quyidagi so'rovni olamiz:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Bu erda p - ro'yxatdagi har bir tugun uchun to'plamning ikkinchi elementi /ul/li/div.

Xuddi shunday, biz so'rov bilan homiylar ro'yxatini olishimiz mumkin:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Ba'zi xpath funktsiyalari
Xpath-da to'plam ichidagi elementlar bilan ishlash uchun ko'plab funktsiyalar mavjud. Men ulardan faqat bir nechtasini beraman.

oxirgi():
To'plamning oxirgi elementini qaytaradi.
Ul/li/div/p so'rovi - har bir "ul" ro'yxat tugunining oxirgi paragraflarini qaytaradi.
Birinchi() funktsiyasi taqdim etilmagan. Birinchi elementga kirish uchun "1" indeksidan foydalaning.

matn():
Elementning sinov mazmunini qaytaradi.
.//a - biz "Arxiv" matni bilan barcha havolalarni olamiz.

position() va mod:
position() - toʻplamdagi elementning oʻrnini qaytaradi.
mod - bo'limning qolgan qismi.

Ushbu funktsiyalarni birlashtirib, biz quyidagilarni olishimiz mumkin:
- ul/li elementlar ham emas
- juft elementlar: ul/li

Taqqoslash operatsiyalari

  • < - логическое «меньше»
  • > - mantiqiy “kattaroq”
  • <= - логическое «меньше либо равно»
  • >= - mantiqiy “katta yoki teng”
ul/li , ul/li - ro'yxat elementlari 3-raqamdan boshlanadi va aksincha.

O'z-o'zidan

Olishga harakat qiling:
- "Standartlar" chap menyusidan hatto URL havolalari;
- w3c.org bosh sahifasidan birinchisidan tashqari barcha yangiliklar sarlavhalari.

PHP5 da Xpath

$dom = yangi DomDocument(); $dom->loadHTML($HTMLCode); $xpath = yangi DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )

Nihoyat

Oddiy misoldan foydalanib, biz xpath-ning veb-sahifa tugunlariga kirish imkoniyatlarini ko'rdik.
Xpath - xml elementlari va xhtml, xslt o'zgarishlariga kirish uchun sanoat standarti.
Siz undan istalgan html sahifani tahlil qilish uchun foydalanishingiz mumkin. Agar manba html kodida belgilashda jiddiy xatolar bo'lsa, uni ishga tushiring

Bugun biz XPath dan PHP bilan foydalanish mavzusini batafsil ko'rib chiqamiz. Misollarda XPath qanday qilib kod miqdorini sezilarli darajada kamaytirishini ko'rasiz. Keling, XPath-da so'rovlar va funktsiyalardan foydalanishni ko'rib chiqaylik.

Avvaliga men sizga ikki turdagi hujjatlarni taqdim etaman: DTD va XML, ulardan foydalanib biz PHP DOM XPath ishlashini ko'rib chiqamiz. Mana ular qanday ko'rinishga ega:

Kitob Muallif Dahshat birinchi bob Boshqa kitob Boshqa Muallif Ilmiy fantastika birinchi bob

Asosiy XPath so'rovlari

Oddiy XPath sintaksisi XML hujjatidagi elementlarga kirish imkonini beradi. Eng oddiy usulda siz kerakli elementga yo'lni belgilashingiz mumkin. Yuqorida keltirilgan XML hujjatidan foydalanib, quyidagi XPath so'rovi kitob elementida joylashgan joriy elementlar to'plamini qaytaradi:

//kutubxona/kitob

Mana bunday! Ikki toʻgʻri chiziq hujjatning ildiz elementini belgilaydi va bitta toʻgʻri chiziq kitobning asosiy elementiga oʻtadi. Bu oddiy va tez, shunday emasmi?

Ammo to'plamdan ma'lum bir kitob elementini tanlamoqchi bo'lsangiz-chi? Faraz qilaylik, siz "aniq muallif" kitoblarini olishni xohlaysiz. Buning uchun XPath so'rovi quyidagicha bo'ladi:

//kutubxona/kitob/muallif/..

foydalanishingiz mumkin matn() tugun qiymatini solishtirish uchun kvadrat qavs ichida. Shuningdek «/..» biz asosiy elementdan foydalanmoqchimiz degan ma'noni anglatadi (ya'ni yuqoridagi bitta tugunni orqaga qaytarish).

XPath so'rovlari bir yoki ikkita funksiya yordamida amalga oshiriladi: query() Va baholash(). Ikkalasi ham so'rovni shakllantiradi, ammo farq qaytarilgan natijada. query() har doim qaytib keladi DOMNodeList, farqli o'laroq baholash() iloji bo'lsa matn natijasini qaytaradi. Misol uchun, agar XPath so'rovingiz ma'lum bir muallif tomonidan yozilgan kitoblar sonini qaytarsa, query() bo'sh DOMNodeListni qaytaradi, evaluate() shunchaki raqamni qaytaradi, siz undan to'g'ridan-to'g'ri tugundan ma'lumotlarni olish uchun foydalanishingiz mumkin. .

XPath kodi va tezlikning afzalliklari

Keling, ma'lum bir muallif tomonidan yozilgan kitoblar sonini qaytaradigan oddiy misolni ko'rib chiqaylik. Biz XPath-dan foydalanmasdan birinchi usulni har doimgidek ko'rib chiqamiz. Endi siz buni XPathsiz qanday qilishni va XPath yordamida buni qilish qanchalik osonligini tushunasiz.

domDocument->getElementsByTagName("muallif"); foreach ($element sifatida $element) ( if ($element->tugunValue == $author) ( $total++; ) ) $raqamni qaytaring; )

Keyingi usul bir xil natijani qaytaradi, lekin ma'lum bir muallif tomonidan yozilgan kitoblarni tanlash uchun XPath-dan foydalanadi.

domDocument); $natija = $xpath->so'rov($query); $result->uzunligini qaytarish; )

Esda tutingki, qaysi muallif har bir kitobni yozganligini aniqlash uchun har bir elementning qiymatini qayta tekshirishimiz shart emas. Ammo XPath funksiyasidan foydalanib, kodni yanada soddalashtirishimiz mumkin count() ushbu yo'ldagi elementlarning tarkibini hisoblash uchun.

domDocument); qaytarish $xpath->baholash($query); )

Biz kerakli ma'lumotlarni bitta qatorli XPath so'rovi bilan olishimiz mumkin. Ko'p PHP filtrlarini yaratishga hojat yo'q. Bu funksiyani yozishning eng oson va tezkor usuli!

E'tibor bering, oxirgi misolda evaluate() ishlatilgan. Buning sababi, count() funksiyasi matn natijasini qaytaradi. query() dan foydalanish DOMNodeList-ni qaytaradi, lekin u bo'sh bo'ladi.

XPath-dan foydalanishga arziydi, chunki u nafaqat PHP kodingizni soddalashtiribgina qolmay, balki tezlikni ham taqdim etadi. Birinchi versiya ikkinchisiga nisbatan o'rtacha 30% tezroq ekanligini payqadim. Ammo uchinchisi birinchisidan 10% tezroq. Albatta, bu sizning serveringizga va foydalanayotgan so'rovlarga bog'liq. XPath-dan sof shaklda foydalanish tezlik va kod yozish qulayligida eng katta natijalarni beradi.

XPath funktsiyalari

Bu erda XPath bilan ishlatilishi mumkin bo'lgan bir nechta funktsiyalar mavjud. Shuningdek, har bir mavjud xususiyat haqida batafsil ma'lumot beruvchi ko'plab resurslarni topasiz. Agar siz DOMNodeList-ni hisoblashingiz yoki nodeValue (tugun qiymati) ni solishtirishingiz kerak bo'lsa, keraksiz PHP kodidan foydalanishni bartaraf etadigan mos XPath funktsiyasini topishingiz mumkin.

Siz buni count() funksiyasi misolidan allaqachon bilasiz. Keling, id() funksiyasidan foydalanib, berilgan ISBN ko'rsatilgan kitoblarning nomlarini olamiz. Buning uchun quyidagi XPath ifodasini ishlatishingiz kerak:

id("isbn1234 isbn1235")/title

E'tibor bering, siz izlayotgan qiymatlar qavslar ichiga kiritilmasligi kerak, faqat bo'sh joylar bilan ajratilgan. Bundan tashqari, vergul qo'shish haqida o'ylamang:

domDocument); $natija = $xpath->so'rov($query); $kitoblar = massiv(); foreach ($tugun sifatida $natija) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) $booksni qaytarish; )

XPath-da murakkab funktsiyalarni boshqarish juda oddiy.

XPath bilan PHP funksiyalaridan foydalanish

Ba'zan sizga standart XPath funktsiyalari taqdim eta olmaydigan qo'shimcha funktsiyalar kerak bo'ladi. Yaxshiyamki, PHP DOM mahalliy PHP funktsiyalariga XPath so'rovlari bilan o'zaro ta'sir qilish imkonini beradi.

Keling, kitob nomidagi so'zlar sonini qaytaradigan misolni ko'rib chiqaylik. Ushbu eng oddiy funktsiyada biz quyidagilarni yozamiz:

domDocument); $natija = $xpath->so'rov($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; qaytish str_word_count($title); )

Biroq, biz str_word_count() funktsiyasini to'g'ridan-to'g'ri XPath so'roviga kiritishimiz mumkin. Bu bir necha bosqichda amalga oshirilishi mumkin. Avvalo, XPath ob'ekti bilan nom maydonini ro'yxatdan o'tkazishimiz kerak. XPath so'rovlarida PHP funktsiyalari "php:functionString" qatori yordamida chaqiriladi, undan so'ng kerakli funksiya nomi yoziladi. Shuningdek, nom maydoni http://php.net/xpath da batafsilroq muhokama qilinadi. Boshqa nom maydoni qiymatlari xatoga yo'l qo'yadi. Shundan so'ng biz registerPHPFunctions() ni chaqirishimiz kerak. Bu funksiya PHP ga “php:” nom maydoni orqali qo‘ng‘iroq qilinganda PHP bu qo‘ng‘iroqni amalga oshirishini bildiradi.

Funktsiyalarni chaqirish uchun misol sintaksisi:

php:functionString("nameoffunction", arg, arg...)

Keling, barchasini quyidagi getNumberOfWords() funksiyasi misolida birlashtiramiz:

domDocument); //php nom maydonini ro'yxatdan o'tkazing $xpath->registerNamespace("php", "http://php.net/xpath"); //endi php funksiyalarini xpath so'rovlarida chaqirish mumkin $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; qaytarish $xpath->baholash($query); )

Esda tutingki, tugun matnini olish uchun XPath text() funksiyasini chaqirishingiz shart emas. RegisterPHPFunctions() usuli buni avtomatik qiladi. Shunga qaramay, quyidagi misol kod qatori ham amal qiladi:

php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))

PHP funktsiyalarini ro'yxatdan o'tkazish faqat PHP tarkibiga kiritilgan funktsiyalar bilan cheklanmaydi. Siz o'zingizning funktsiyalaringizni belgilashingiz va ularni XPath ichida ishlatishingiz mumkin. Yagona farq shundaki, siz "php: functionString" o'rniga "php: function" dan foydalanishingiz kerak bo'ladi.

Keling, asosiy funksionallikni namoyish qilish uchun sinfdan tashqarida funksiya yozaylik. Biz foydalanadigan funktsiya muallifning "Jorj Oruell" kitoblarini qaytaradi. So'rovga qo'shmoqchi bo'lgan har bir tugun uchun u true qiymatini qaytarishi kerak.

nodeValue == " Jorj Oruell"; } !}

Funktsiyaga uzatiladigan argument DOM elementlari massividir. Ushbu funktsiya massivdan o'tadi va kerakli elementlarni aniqlaydi va keyin ularni DOMNodeList-ga kiritadi. Ushbu misolda sinovdan o'tkazilayotgan tugun /book edi va biz kerakli elementlarni aniqlash uchun /author dan ham foydalandik.

Endi getGeorgeOrwellBooks() funksiyasini yaratishimiz mumkin:

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//library/book1"; $natija = $xpath->so'rov($query); $kitoblar = massiv(); foreach($natija sifatida $tugun) ( $books = $tugun->getElementsByTagName("title") ->item(0)->nodeValue; ) $booksni qaytaring; )

Agar solishtirish() funktsiyasi statik bo'lsa, XPath so'rovini o'zgartirishingiz kerak:

//kutubxona/kitob

Rostini aytsam, bu funksiyalarning barchasi sof XPath kodi yordamida amalga oshirilishi mumkin edi. Ammo misol XPath so'rovlarini qanday kengaytirish va ularni yanada murakkablashtirish mumkinligini ko'rsatadi.

Yakunida

XPath XML bilan ishlashda kod miqdorini kamaytirish va uni qayta ishlashni oshirishning ajoyib usuli. Qo'shimcha PHP DOM funksiyasi XPath funksiyalarini kengaytirish imkonini beradi. Bu haqiqatan ham foydali narsa, agar siz undan foydalansangiz va tafsilotlarni o'rgansangiz, kamroq va kamroq kod yozishingiz kerak bo'ladi.


XPath XML hujjatidagi tugunlarni yoki tugunlar to'plamini tanlash uchun yo'l ifodalaridan foydalanadi. Tanlanganiga yo'l (yo'l) yoki bosqich (qadamlar) bo'ylab tugun bo'yicha.

misol XML hujjatlari

Biz ushbu XML hujjatidan quyidagi misollarda foydalanamiz.


Garri Potter
29.99


XML o'rganish
39.95

Tugunni tanlang

XPath XML hujjatidagi tugunlarni tanlash uchun yo'l ifodalaridan foydalanadi. Yoki qadamni tanlash uchun tugun orqali yo'l bo'ylab. Quyidagilar eng foydali yo'l iboralari:

Quyidagi jadvalda biz ba'zi ifoda yo'llari va ifoda natijasini ko'rsatamiz:

ifoda yoʻlinatija
kitob do'koniKitob elementining barcha tugunlarini tanlang.
/ Kitob do'koni

Ildiz element kitob do'konini tanlang.

Eslatma: Agar yo'l qiyshiq chiziq (/) bilan boshlansa, yo'l har doim elementning mutlaq yo'lini ifodalaydi!

kitob do'koni / kitobKitob do'koniga tegishli bo'lgan barcha kitoblarni tanlang.
// KitobHujjatdagi joylashuvidan qat'i nazar, barcha kitob subelementlarini tanlang.
kitob do'koni // kitobKitob doʻkonidagi va ostidagi joylashuvidan qatʼi nazar, kitob doʻkonining avlodi boʻlmagan barcha kitob elementlarini tanlaydi.
// @LangLang nomli barcha xususiyatlarni tanlang.

Predikat(lar)

Belgilangan qiymatni o'z ichiga olgan muayyan tugun yoki tugunni topish uchun predikat ishlatiladi.

Predikat kvadrat qavs ichiga olingan.

Quyidagi jadvalda biz predikatlar va ifoda natijasi bilan ba'zi yo'l ifodalarini sanab o'tdik:

ifoda yoʻlinatija
/ Kitob do'koni / kitobBirinchi ishchi kitob elementiga tegishli bo'lgan pastki elementlarni tanlang.
/Kitob do'koni/kitob [oxirgi()]Kitobning oxirgi kitob elementiga tegishli bo'lgan kichik elementlarni tanlang.
/ Kitob do'koni / kitob [oxirgi () - 1]Ikkinchi kitob ob'ektining o'zaro kitob do'koniga tegishli kichik narsalarni tanlang.
/Kitob do'koni/kitob [pozitsiya()<3] Kichik elementlarga tegishli kitob elementining dastlabki ikkita kitob elementini tanlang.
// Sarlavha [@lang]Lang nomli barcha atributni tanlang element sarlavhasi.
// Sarlavha [@ LANG = "eng"]Barcha element nomlarini tanlang va bu elementlar ingliz atribut qiymatiga ega.
/ kitob do'koni / kitobKitob elementining barcha kitob elementlarini va 35.00 dan katta bo'lishi kerak bo'lgan narx elementining qiymatini tanlang.
/ kitob do'koni / kitob / nomKitob elementining barcha kitob elementi sarlavhasi elementlarini tanlang va unda narx elementining qiymati 35.00 dan katta boʻlishi kerak.

Noma'lum tugunlarni tanlang

Noma'lum XML elementlarini tanlash uchun XPath joker belgilaridan foydalanish mumkin.

Quyidagi jadvalda biz ba'zi yo'l iboralarini, shuningdek, ushbu ifodalarning natijalarini sanab o'tdik:

Bir nechta yo'lni tanlang

"|" yo'l ifodasidan foydalanish operator, siz bir nechta yo'llarni tanlashingiz mumkin.

Quyidagi jadvalda biz ba'zi yo'l iboralarini hamda bu ifodalarning natijalarini sanab o'tdik.