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:
Yuqoridagi XML hujjatidagi misol tugunlari:
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:
Avlodlar
Element tugunlari nol, bitta yoki bir nechta bolalarga ega bo'lishi mumkin. Quyidagi misolda "nom", "muallif", "yil" va "narx" elementlari kitob elementining bolalaridir:
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:
Ajdodlar
Tugunning ota-onasi, tugunning ota-onasi va boshqalar. Quyidagi misolda nom elementining ajdodlari kitob va kitob do‘koni elementlari hisoblanadi:
Avlodlar
Tugun bolalari, tugun bolalarining bolalari va boshqalar. Quyidagi misolda "kitob do'koni" elementining bolalari "kitob", "nom", "muallif", "yil" va "narx" elementlari:
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.
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.
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:
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”
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:
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.
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ʻli | natija |
---|---|
kitob do'koni | Kitob 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 / kitob | Kitob do'koniga tegishli bo'lgan barcha kitoblarni tanlang. |
// Kitob | Hujjatdagi joylashuvidan qat'i nazar, barcha kitob subelementlarini tanlang. |
kitob do'koni // kitob | Kitob doʻkonidagi va ostidagi joylashuvidan qatʼi nazar, kitob doʻkonining avlodi boʻlmagan barcha kitob elementlarini tanlaydi. |
// @Lang | Lang 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ʻli | natija |
---|---|
/ Kitob do'koni / kitob | Birinchi 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 / kitob | Kitob elementining barcha kitob elementlarini va 35.00 dan katta bo'lishi kerak bo'lgan narx elementining qiymatini tanlang. |
/ kitob do'koni / kitob / nom | Kitob 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.