Pinaikling XPath syntax. Mga halimbawa ng xpath query sa html Gamit ang sumusunod na axis
Ginagamit ang XPath upang mag-navigate sa mga elemento at katangian ng isang XML na dokumento. Ang XPath ay isa sa mga pangunahing elemento sa pamantayang W3C XSLT.
1 Anong nangyari XPath
Mga Ekspresyon ng XPath
Gumagamit ang XPath ng mga path expression upang pumili ng mga indibidwal na node o isang hanay ng mga node sa isang XML na dokumento. Ang mga expression na ito ay halos kapareho sa mga expression na nakikita mo kapag nagtatrabaho sa isang tradisyonal na computer file system.
Karaniwang XPath Function
Kasama sa XPath ang mahigit 100 built-in na function. Mayroong mga function para sa mga string at numeric na halaga, petsa at oras, paghahambing ng node at pagmamanipula ng QName, pamamahala ng pagkakasunud-sunod, mga halaga ng boolean, at marami pang iba.
Ginagamit ang XPath sa XSLT
Ang XPath ay isa sa mga pangunahing elemento sa pamantayan ng XSLT. Kung walang kaalaman sa XPath, hindi ka makakagawa ng mga dokumentong XSLT.
2 Terminolohiya XPath
Mga node
Mayroong pitong uri ng mga node sa XPath: elemento, attribute, text, namespace, mga tagubilin sa pagproseso, komento, at mga node ng dokumento. Ang mga dokumentong XML ay pinoproseso bilang mga puno ng mga node. Ang tuktok na elemento ng puno ay tinatawag na elemento ng ugat. Tingnan ang sumusunod na XML na dokumento:
Mga halimbawang node sa XML na dokumento sa itaas:
Mga halaga ng atom
Ang mga halaga ng atom ay mga node na walang mga anak o magulang. Halimbawa ng atomic values:
J. K. Rowling "en"
Mga elemento
Ang mga elemento ay mga atomic na halaga o node.
3 Relasyon mga node
Magulang
Ang bawat elemento at katangian ay may isang magulang. Sa sumusunod na halimbawa, ang elemento ng aklat ay ang magulang ng mga elemento ng pamagat, may-akda, taon, at presyo:
Inapo
Maaaring magkaroon ng zero, isa, o higit pang mga bata ang mga Element node. Sa sumusunod na halimbawa, ang mga elementong "pamagat", "may-akda", "taon" at "presyo" ay pawang mga anak ng elemento ng aklat:
Mga elemento ng parehong antas
Ito ay mga node na may parehong magulang. Sa sumusunod na halimbawa, ang mga elementong "pamagat", "may-akda", "taon" at "presyo" ay lahat ng elemento ng parehong antas:
Mga ninuno
Magulang ng node, magulang ng magulang ng node, atbp. Sa sumusunod na halimbawa, ang mga ninuno ng elemento ng pamagat ay ang mga elemento ng libro at bookstore:
Inapo
Mga anak ng isang node, mga anak ng isang node, atbp. Sa sumusunod na halimbawa, ang mga bata ng elementong "store ng libro" ay ang mga elementong "aklat", "pamagat", "may-akda", "taon", at "presyo":
4 Syntax XPath
Gumagamit ang XPath ng mga expression ng path upang pumili ng mga node o hanay ng mga node sa isang XML na dokumento. Maaaring mapili ang isang node sa pamamagitan ng pagsunod sa isang landas o sa pamamagitan ng mga hakbang. Gagamitin namin ang sumusunod na XML na dokumento sa mga halimbawa sa ibaba.
Pagpili ng node
Sa pamamagitan ng paggamit ng mga expression ng XPath upang pumili ng mga node sa isang XML na dokumento, maaari kang pumili ng isang node sa pamamagitan ng pagsunod sa isang landas o mga hakbang. Ang pinakakapaki-pakinabang na mga expression ng path ay nakalista sa ibaba:
Ang talahanayan sa ibaba ay naglilista ng ilang mga path ng expression at ang resulta ng pagpapatupad ng expression:
XPath expression | Resulta |
---|---|
tindahan ng libro | Pinipili ang lahat ng node na pinangalanang "bookstore" |
/store ng libro | Pinipili ang elemento ng ugat ng bookstore Tandaan: Kung ang isang landas ay nagsisimula sa isang slash (/), ito ay palaging isang ganap na landas patungo sa elemento! |
tindahan ng libro/libro | Pinipili ang lahat ng elemento ng "libro" na mga anak ng elemento ng "bookstore". |
//aklat | Pinipili ang lahat ng elemento ng "libro" kahit saan man ang mga ito sa dokumento |
tindahan ng libro//libro | Pinipili ang lahat ng elemento ng "libro" na mga anak ng elemento ng "bookstore", nasaan man sila sa ilalim ng elemento ng "bookstore" |
//@lang | Pinipili ang lahat ng mga katangian na pinangalanang "lang" |
Predicates
Ang mga predicate ay ginagamit upang makahanap ng isang tiyak na node o isang node na naglalaman ng isang tiyak na halaga. Ang mga panaguri ay palaging napapalibutan ng mga square bracket. Inililista ng talahanayan sa ibaba ang ilang mga expression ng path na may mga predicate, at ang resulta ng expression:
Mga Ekspresyon ng XPath | Resulta |
---|---|
/bookstore/book | Pinipili ang unang elemento ng "libro", na isang anak ng elemento ng "bookstore". Tandaan: Sa IE 5,6,7,8,9, ang unang node ay may index na , ngunit ayon sa mga alituntunin ng W3C, ito ay . Upang malutas ang problemang ito sa IE, itakda ang opsyong "SelectionLanguage" para sa XPath: Sa JavaScript: xml.setProperty("SelectionLanguage", "XPath"); |
/bookstore/book | Pinipili ang huling elemento ng "aklat" na anak ng elemento ng "store ng libro." |
/bookstore/book | Pinipili ang penultimate na "libro" na elemento, na isang anak ng elemento ng "bookstore". |
/bookstore/book | Pagpili sa unang dalawang elemento ng "libro" na mga anak ng elemento ng "bookstore". |
//title[@lang] | Pinipili ang lahat ng elemento ng "title" na may attribute na pinangalanang "lang" |
//title[@lang="en"] | Pinipili ang lahat ng elemento ng "pamagat" na mayroong katangiang "wika" na may halagang "en" |
/bookstore/book | Pinipili ang lahat ng elemento ng "libro" pagkatapos ng elemento ng "bookstore" na mayroong elementong "presyo" na may halagang higit sa 35.00 |
/bookstore/book/title | Pinipili ang lahat ng elemento ng "pamagat" ng aklat ng elemento ng "bookstore" na may elementong "presyo" na may halagang higit sa 35.00 |
Pagpili ng hindi kilalang mga node
Maaaring gamitin ang mga espesyal na character ng XPath upang pumili ng hindi kilalang mga XML node.
Sa talahanayan sa ibaba, naglista kami ng ilang mga path ng expression at mga resulta ng expression:
Pagpili ng Maramihang Landas
Gamit ang operator | sa XPath expression maaari kang pumili ng maramihang mga landas. Ang talahanayan sa ibaba ay naglilista ng ilang mga expression ng path at ang kanilang mga resulta:
5 Mga ehe XPath
Gagamitin namin ang sumusunod na XML na dokumento sa ibang pagkakataon sa halimbawa.
Tinutukoy ng mga ax ang mga hanay ng mga node, na nauugnay sa kasalukuyang node.
Pangalan ng axis | Resulta |
---|---|
ninuno | Pinipili ang lahat ng mga ninuno (mga magulang, lolo't lola, atbp.) ng kasalukuyang node |
ninuno-o-sarili | Pinipili ang lahat ng mga ninuno (mga magulang, lolo't lola, atbp.) ng kasalukuyang node at ang kasalukuyang node mismo |
katangian | |
anak | |
inapo | Pinipili ang lahat ng mga bata (mga anak, apo, atbp.) ng kasalukuyang node |
inapo-o-sarili | Pinipili ang lahat ng mga bata (mga anak, apo, atbp.) ng kasalukuyang node at ang kasalukuyang node mismo |
sumusunod | Pinipili ang lahat sa dokumento pagkatapos magsara ang tag ng kasalukuyang node |
sumusunod-kapatid | Pinipili ang lahat ng node ng parehong antas pagkatapos ng kasalukuyang node |
namespace | Pinipili ang lahat ng node sa ibinigay na namespace ng kasalukuyang node |
magulang | Pinipili ang parent ng kasalukuyang node |
nauna | Pinipili ang lahat ng node na lumalabas bago ang kasalukuyang node sa dokumento, hindi kasama ang mga ninuno, attribute node, at namespace node |
nauuna-kapatid | Pinipili ang lahat ng magkakapatid hanggang sa kasalukuyang node |
sarili | Pinipili ang kasalukuyang node |
6 Mga ekspresyon sampling path
Ang path ng lokasyon ay maaaring ganap o kamag-anak. Ang path ng ganap na lokasyon ay nagsisimula sa isang slash (/), ngunit ang isang kamag-anak na landas ay hindi. Sa parehong mga kaso, ang sampling path ay binubuo ng isa o higit pang mga hakbang na pinaghihiwalay ng mga slash:
Ganap na landas ng lokasyon:
/hakbang/hakbang/...
Path ng pagkuha ng kaugnay na lokasyon:
Hakbang/hakbang/...
Ang bawat hakbang ay sinusuri laban sa mga node sa kasalukuyang hanay ng node. Ang hakbang ay binubuo ng:
- axis (tinutukoy ang relasyon ng puno sa pagitan ng mga napiling node at kasalukuyang node);
- node check (tumutukoy sa isang node sa loob ng isang axis);
- zero o higit pang mga predicate (upang higit na pinuhin ang napiling hanay ng mga node)
Ang syntax ng hakbang sa pagkuha ay:
Axisname::nodetestAxisname::nodetest[predictor]
Halimbawa | Resulta |
---|---|
bata::libro | Pinipili ang lahat ng node ng libro na mga anak ng kasalukuyang node |
attribute::lang | Pinipili ang attribute ng wika (lang) ng kasalukuyang node |
anak::* | Pinipili ang lahat ng mga bata ng kasalukuyang node |
katangian::* | Pinipili ang lahat ng mga katangian ng kasalukuyang node |
bata::text() | Pinipili ang lahat ng text node ng kasalukuyang node |
bata::node() | Pinipili ang lahat ng agarang anak ng kasalukuyang node |
descendant::book | Pinipili ang lahat ng mga bata ng kasalukuyang node |
ninuno::aklat | Pinipili ang lahat ng mga ninuno ng "mga aklat" ng kasalukuyang node |
ninuno-o-sarili::aklat | Pinipili ang lahat ng mga ninuno ng libro ng kasalukuyang node - at ang kasalukuyang node kung isa rin itong libro |
bata::*/bata::presyo | Pinipili ang lahat ng mga bata ng "presyo" isang antas ang layo mula sa kasalukuyang node |
7 Mga operator XPath
Ang mga expression ng XPath ay bumalik bilang isang hanay ng mga node, string, boolean, o numeric na halaga. Nasa ibaba ang isang listahan ng mga operator na ginagamit sa XPath expression:
Operator | Paglalarawan | Halimbawa |
---|---|---|
| | Kinakalkula ang dalawang hanay ng mga node | //aklat | //cd |
+ | Dagdag | 6 + 4 |
- | Pagbabawas | 6 - 4 |
* | Pagpaparami | 6 * 4 |
div | Dibisyon | 8 div 4 |
= | Pagkakapantay-pantay | presyo=9.80 |
!= | Hindi pagkakapantay-pantay | presyo!=9.80 |
< | Mas mababa sa | presyo<9.80 |
<= | Mas kaunti o katumbas | presyo≤9.80 |
> | Higit sa | presyo>9.80 |
>= | Higit pa o katumbas | presyo≤9.80 |
o | O kaya | presyo=9.80 o presyo=9.70 |
at | AT | presyo>9.00 at presyo<9.90 |
mod | Ang natitira sa dibisyon | 5 mod 2 |
8 Mga halimbawa XPath
Maglakad tayo sa pangunahing XPath syntax na may ilang mga halimbawa. Gagamitin namin ang sumusunod na XML na dokumentong "books.xml" sa mga halimbawa sa ibaba:
Naglo-load ng XML na dokumento
Gamitin ang XMLHttpRequest upang mag-download ng mga XML na dokumento, na sinusuportahan ng karamihan sa mga modernong browser:
Var xmlhttp=bagong XMLHttpRequest()
Code para sa mga legacy na browser ng Microsoft (IE 5 at 6):
Var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
Pagpili ng node
Sa kasamaang palad, ang XPath ay maaaring gumana nang iba sa Internet Explorer kaysa sa iba pang mga browser. Sa aming mga halimbawa, gagamitin namin ang code na dapat gumana sa karamihan ng mga browser. Ginagamit ng Internet Explorer ang pamamaraang "selectNodes()" upang pumili ng mga node sa isang XML na dokumento:
XmlDoc.selectNodes(xpath);
Ginagamit ng Firefox, Chrome, Opera at Safari ang paraan ng evaluate() upang pumili ng mga node mula sa isang XML na dokumento:
XmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);
Piliin ang lahat ng pamagat
Pinipili ng sumusunod na halimbawa ang lahat ng mga node ng header:
/bookstore/book/title
Pagpili ng pamagat ng unang aklat
Pinipili ng sumusunod na halimbawa ang pamagat ng unang "libro" na node pagkatapos ng elemento ng "bookstore":
/bookstore/book/title
Piliin ang lahat ng presyo
Pinipili ng sumusunod na halimbawa ang teksto ng lahat ng mga node ng presyo:
/bookstore/libro/presyo
Pumili ng mga node na may presyo >35
Pinipili ng sumusunod na halimbawa ang lahat ng node na may mga presyong higit sa 35:
/bookstore/libro/presyo
Pagpili ng mga node ng header na may presyo >35
Pinipili ng sumusunod na halimbawa ang lahat ng node ng pamagat na may presyong higit sa 35:
/bookstore/book/title
Ang Xpath ay isang query language para sa xml o xhtml na mga elemento ng dokumento. Tulad ng SQL, ang xpath ay isang declarative query language. Upang makuha ang data ng interes, kailangan mo lang gumawa ng query na naglalarawan sa data na ito. Gagawin ng xpath language interpreter ang lahat ng maruming gawain para sa iyo.
Napakakomportable, hindi ba? Tingnan natin kung anong mga kakayahan ang inaalok ng xpath para sa pag-access ng mga node ng web page.
Paglikha ng isang kahilingan sa mga node ng web page
Dinadala ko sa iyong pansin ang isang maliit na gawain sa laboratoryo, kung saan ipapakita ko ang paglikha ng mga kahilingan sa xpath sa isang web page. Magagawa mong ulitin ang mga kahilingan na ibinigay ko at, higit sa lahat, subukang tuparin ang iyong sarili. Umaasa ako na salamat dito, ang artikulo ay magiging pantay na kawili-wili sa mga nagsisimula at programmer na pamilyar sa xpath hanggang xml.Para sa laboratoryo kakailanganin namin:
- xhtml web page;
- Mozilla Firefox browser na may mga add-on;
- surot;
- firePath ;
(maaari kang gumamit ng anumang iba pang browser na may suporta sa visual na xpath)
- kaunting oras.
Bilang isang web page para sa pagsasagawa ng isang eksperimento, iminumungkahi ko ang pangunahing pahina ng website ng World Wide Web Consortium ("http://w3.org"). Ang organisasyong ito ang bumubuo ng mga wikang xquery(xpath), ang detalye ng xhtml at marami pang ibang pamantayan sa Internet.
Gawain
Kunin ang impormasyon tungkol sa mga consortium conference mula sa xhtml code ng w3.org main page gamit ang xpath query.Magsimula tayong magsulat ng mga query sa xpath.
Unang kahilingan sa Xpath
Buksan ang tab na Firepath sa FireBug, piliin ang elementong susuriin kasama ng tagapili, i-click ang: Gumawa ang Firepath ng kahilingan sa xpath para sa napiling elemento.Kung pinili mo ang pamagat ng unang kaganapan, ang kahilingan ay magiging ganito:
Pagkatapos alisin ang mga hindi kinakailangang index, tutugma ang query sa lahat ng elemento ng uri ng header.
Hina-highlight ng Firepath ang mga elementong tumutugma sa query. Makikita mo sa real time kung aling mga node ng dokumento ang tumutugma sa query.
Kahilingan para sa impormasyon tungkol sa mga lugar ng kumperensya:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Ganito kami nakakakuha ng listahan ng mga sponsor:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
xpath syntax
Bumalik tayo sa mga query na ginawa namin at unawain kung paano nakaayos ang mga ito.Isaalang-alang natin nang detalyado ang unang kahilingan
Sa query na ito ay hinati ko ang tatlong bahagi upang ipakita ang mga kakayahan ng xpath. (Ang paghahati sa mga bahagi ay nakakalito)
Unang parte
.//
- recursive descent sa zero o higit pang mga antas ng hierarchy mula sa kasalukuyang konteksto. Sa aming kaso, ang kasalukuyang konteksto ay ang ugat ng dokumento
Ikalawang bahagi
*
- anumang elemento,
[@id="w3c_home_upcoming_events"]– isang panaguri sa batayan kung saan naghahanap kami ng isang node na may katangiang id na katumbas ng "w3c_home_upcoming_events". Ang mga ID ng elemento ng XHTML ay dapat na natatangi. Samakatuwid, dapat ibalik ng query na "anumang elemento na may partikular na ID" ang tanging node na hinahanap namin.
Maaari naming palitan *
sa eksaktong pangalan ng node div sa kahilingang ito
div[@id="w3c_home_upcoming_events"]
Kaya, bumaba kami sa puno ng dokumento sa div[@id="w3c_home_upcoming_events"] node na kailangan namin. Wala kaming pakialam kung anong mga node ang binubuo ng puno ng DOM at kung gaano karaming mga antas ng hierarchy ang nananatili sa itaas.
Ang ikatlong bahagi
/ul/li/div/p/a-xpath ay ang landas sa isang tiyak na elemento. Binubuo ang landas ng pagtugon sa mga hakbang at mga kondisyon sa pagsusuri ng node (ul, li, atbp.). Ang mga hakbang ay pinaghihiwalay ng isang "/" (slash) na character.
mga koleksyon ng xpath
Hindi laging posible na ma-access ang node ng interes gamit ang isang predicate o mga hakbang sa pagtugon. Kadalasan mayroong maraming mga node ng parehong uri sa isang antas ng hierarchy at ito ay kinakailangan upang piliin ang "lamang ang una" o "lamang ang pangalawang" node. Ang mga koleksyon ay ibinibigay para sa mga ganitong kaso.Hinahayaan ka ng mga koleksyon ng xpath na ma-access ang isang elemento sa pamamagitan ng index nito. Ang mga index ay tumutugma sa pagkakasunud-sunod kung saan ipinakita ang mga elemento sa orihinal na dokumento. Ang serial number sa mga koleksyon ay binibilang mula sa isa.
Batay sa katotohanang ang "venue" ay palaging ang pangalawang talata pagkatapos ng "pangalan ng kumperensya", nakukuha namin ang sumusunod na query:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Kung saan ang p ay ang pangalawang elemento sa set para sa bawat node sa listahan /ul/li/div.
Katulad nito, makakakuha tayo ng listahan ng mga sponsor na may kahilingan:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Ang ilang mga function ng xpath
Mayroong maraming mga function sa xpath para sa pagtatrabaho sa mga elemento sa loob ng isang koleksyon. Kaunti lang ang ibibigay ko sa kanila.huling():
Ibinabalik ang huling elemento ng koleksyon.
Query ul/li/div/p - ibabalik ang mga huling talata para sa bawat node ng listahan ng "ul".
Ang first() function ay hindi ibinigay. Upang ma-access ang unang elemento, gamitin ang index na "1".
text():
Ibinabalik ang pansubok na nilalaman ng isang elemento.
.//a – nakukuha namin ang lahat ng link na may text na “Archive”.
posisyon() at mod:
position() - ibinabalik ang posisyon ng isang elemento sa isang set.
Ang mod ay ang natitira sa dibisyon.
Sa pamamagitan ng pagsasama-sama ng mga function na ito ay makakakuha tayo ng:
- hindi kahit na mga elemento ul/li
- kahit na mga elemento: ul/li
Mga Operasyon sa Paghahambing
- < - логическое «меньше»
- > - lohikal na "mas malaki kaysa sa"
- <= - логическое «меньше либо равно»
- >= - lohikal na "mas malaki kaysa sa o katumbas"
Sa sarili
Subukang makakuha ng:- kahit na mga link ng URL mula sa kaliwang menu na "Mga Pamantayan";
- mga header ng lahat ng balita, maliban sa una mula sa pangunahing pahina ng w3c.org.
XPath sa PHP5
$dom = bagong DomDocument(); $dom->loadHTML($HTMLCode); $xpath = bagong 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; )Sa wakas
Gamit ang isang simpleng halimbawa, nakita namin ang mga kakayahan ng xpath para sa pag-access ng mga node ng web page.Ang Xpath ay ang pamantayan sa industriya para sa pag-access ng mga elemento ng xml at xhtml, xslt na pagbabago.
Magagamit mo ito para i-parse ang anumang html page. Kung ang source html code ay naglalaman ng malalaking error sa markup, patakbuhin ito
Ngayon ay titingnan natin ang paksa ng paggamit ng XPath sa PHP. Makikita mo sa mga halimbawa kung paano makabuluhang binabawasan ng XPath ang dami ng code. Tingnan natin ang paggamit ng mga query at function sa XPath.
Sa simula, bibigyan kita ng dalawang uri ng mga dokumento: DTD at XML, kung saan titingnan natin ang paggana ng PHP DOM XPath. Narito kung ano ang hitsura nila:
Mga pangunahing query sa XPath
Ang simpleng XPath syntax ay nagbibigay-daan sa iyo upang ma-access ang mga elemento sa isang XML na dokumento. Sa pinakasimpleng paraan, maaari mong tukuyin ang landas sa nais na elemento. Gamit ang XML na dokumentong ibinigay sa itaas, ibabalik ng sumusunod na query sa XPath ang koleksyon ng mga kasalukuyang elemento na matatagpuan sa elemento ng aklat:
//aklatan/aklat
Ganito! Tinutukoy ng dalawang forward slash ang root element ng dokumento, at isang forward slash transition sa book child element. Ito ay simple at mabilis, hindi ba?
Ngunit paano kung gusto mong pumili ng isang partikular na elemento ng libro mula sa isang set? Ipagpalagay natin na gusto mo ng mga aklat ng isang "Ilang May-akda". Ang query ng XPath para dito ay:
//library/libro/may-akda/..
pwede mong gamitin text() sa mga square bracket upang ihambing ang halaga ng node. Gayundin «/..» ibig sabihin gusto naming gamitin ang parent na elemento (i.e. bumalik sa isang node sa itaas).
Ginagawa ang mga query sa XPath gamit ang isa o dalawang function: tanong() At suriin (). Parehong bumubuo ng isang kahilingan, ngunit ang pagkakaiba ay nasa resulta na ibinalik. query() ay palaging babalik DOMNodeList, Hindi tulad ng suriin () magbabalik ng resulta ng text kung maaari. Halimbawa, kung ibabalik ng iyong query sa XPath ang bilang ng mga aklat na isinulat ng isang partikular na may-akda, ang query() ay magbabalik ng isang walang laman na DOMNodeList, ang evaluate() ay magbabalik lamang ng isang numero, maaari mo itong gamitin nang direkta upang makuha ang data mula sa node .
XPath Code at Mga Benepisyo sa Bilis
Tingnan natin ang isang simpleng halimbawa na magbabalik ng bilang ng mga aklat na isinulat ng isang partikular na may-akda. Titingnan natin ang unang paraan sa paraang palagi nating ginagawa, nang hindi gumagamit ng XPath. Ngayon ay mauunawaan mo na kung paano gawin ito nang walang XPath at kung gaano kadaling gawin ito sa XPath.
domDocument->getElementsByTagName("may-akda"); foreach ($elemento bilang $elemento) ( kung ($elemento->nodeValue == $may-akda) ( $kabuuan++; ) ) ibalik ang $number; )
Ang susunod na paraan ay nagbabalik ng parehong resulta, ngunit gumagamit ng XPath upang piliin ang mga aklat na iyon na isinulat ng isang partikular na may-akda.
domDocument); $result = $xpath->query($query); ibalik ang $result->length; )
Tandaan na hindi namin kailangang suriin muli ang halaga ng bawat elemento upang matukoy kung aling may-akda ang sumulat ng bawat aklat. Ngunit mas mapapasimple natin ang code gamit ang XPath function bilangin() upang mabilang ang mga nilalaman ng mga elemento sa landas na ito.
domDocument); ibalik ang $xpath->evaluate($query); )
Makukuha namin ang impormasyong kailangan namin sa isang query sa XPath na linya. Hindi na kailangang lumikha ng maraming mga filter ng PHP. Ito ang pinakamadali at pinakamabilis na paraan para isulat ang functionality na ito!
Tandaan na ang evaluate() ay ginamit sa huling halimbawa. Ito ay dahil ang count() function ay nagbabalik ng isang text na resulta. Ang paggamit ng query() ay magbabalik ng isang DOMNodeList, ngunit ito ay walang laman.
Ang XPath ay sulit na gamitin dahil hindi lamang nito ginagawang mas simple ang iyong PHP code, nag-aalok din ito ng benepisyo sa bilis. Napansin ko na ang unang bersyon ay 30% na mas mabilis sa karaniwan kumpara sa pangalawa. Ngunit ang pangatlo ay 10% na mas mabilis kaysa sa una. Siyempre, depende ito sa iyong server at sa mga query na iyong ginagamit. Ang paggamit ng XPath sa dalisay nitong anyo ay nagbibigay ng pinakamalaking resulta sa bilis at kadalian ng pagsulat ng code.
Mga Pag-andar ng XPath
Narito ang ilang mga function na maaaring gamitin sa XPath. Makakakita ka rin ng maraming mapagkukunan na nagdedetalye tungkol sa bawat magagamit na feature. Kung kailangan mong kalkulahin ang DOMNodeList o ihambing ang nodeValue (node value), makakahanap ka ng angkop na XPath function na nag-aalis ng paggamit ng hindi kinakailangang PHP code.
Alam mo na ito mula sa halimbawa ng count() function. Gamitin natin ang function na id() para makuha ang mga pamagat ng mga aklat na may mga ibinigay na ISBN. Upang gawin ito kailangan mong gamitin ang sumusunod na expression ng XPath:
id("isbn1234 isbn1235")/title
Tandaan na ang mga halaga na iyong hinahanap ay hindi dapat na nakapaloob sa mga panaklong, na pinaghihiwalay lamang ng mga puwang. Gayundin, huwag mag-isip tungkol sa pagdaragdag ng kuwit:
domDocument); $result = $xpath->query($query); $libro = array(); foreach ($resulta bilang $node) ($book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )
Ang paghawak ng mga kumplikadong function sa XPath ay hindi kapani-paniwalang simple.
Paggamit ng mga function ng PHP sa XPath
Minsan kakailanganin mo ng higit pang paggana na hindi maibibigay ng karaniwang XPath function. Sa kabutihang palad, pinapayagan ng PHP DOM ang mga katutubong PHP function na makipag-ugnayan sa mga query sa XPath.
Tingnan natin ang isang halimbawa na nagbabalik ng bilang ng mga salita sa pamagat ng aklat. Sa pinakasimpleng function na ito, isusulat namin ang sumusunod:
domDocument); $result = $xpath->query($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; ibalik ang str_word_count($title); )
Ngunit, maaari rin naming isama ang str_word_count() function nang direkta sa kahilingan ng XPath. Magagawa ito sa ilang hakbang. Una sa lahat, kailangan nating magrehistro ng namespace na may XPath object. Ang mga function ng PHP sa mga kahilingan sa XPath ay tinatawag gamit ang string na "php:functionString", pagkatapos ay isusulat ang pangalan ng nais na function. Gayundin, ang namespace ay tinalakay nang mas detalyado sa http://php.net/xpath. Ang iba pang mga value ng namespace ay magdudulot ng error. Pagkatapos nito kailangan nating tumawag sa registerPHPFunctions(). Sinasabi ng function na ito sa PHP na kapag ang isang tawag ay ginawa sa pamamagitan ng namespace na "php:", hahawakan ng PHP ang tawag na ito.
Ang isang halimbawang syntax para sa mga function ng pagtawag ay:
php:functionString("nameoffunction", arg, arg...)
Pagsama-samahin natin ang lahat sa sumusunod na halimbawa ng function na getNumberOfWords() :
domDocument); //register php namespace $xpath->registerNamespace("php", "http://php.net/xpath"); //now php functions can be called in xpath requests $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; ibalik ang $xpath->evaluate($query); )
Tandaan na hindi mo kailangang tawagan ang XPath function text() para makuha ang text ng node. Ginagawa itong awtomatiko ng registerPHPFunctions() na pamamaraan. Bagaman, magiging wasto din ang sumusunod na halimbawang linya ng code:
php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))
Ang pagrerehistro ng mga function ng PHP ay hindi limitado sa mga function na kasama sa PHP. Maaari mong tukuyin ang iyong sariling mga function at gamitin ang mga ito sa loob ng XPath. Ang pagkakaiba lang ay kailangan mong gumamit ng "php:function" sa halip na "php:functionString".
Sumulat tayo ng isang function sa labas ng klase upang ipakita ang pangunahing pag-andar. Ang function na gagamitin namin ay nagbabalik ng mga libro ng may-akda na "George Orwell". Dapat itong bumalik ng totoo para sa bawat node na gusto mong isama sa query.
nodeValue == "George Orwell"; } !}
Ang argument na ipinasa sa function ay isang hanay ng mga elemento ng DOM. Ang function na ito ay dumaan sa array at tinutukoy ang mga kinakailangang elemento, at pagkatapos ay isasama ang mga ito sa DOMNodeList. Sa halimbawang ito, ang node na sinusuri ay /book, at ginamit din namin ang /author upang matukoy ang mga kinakailangang elemento.
Ngayon ay maaari na tayong lumikha ng getGeorgeOrwellBooks() function:
domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//library/book1"; $result = $xpath->query($query); $libro = array(); foreach($result bilang $node) ($books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) ibalik ang $books; )
Kung ang compare() function ay static, kailangan mong baguhin ang XPath query:
//aklatan/aklat
Sa totoo lang, lahat ng functionality na ito ay maaaring ipatupad gamit ang purong XPath code. Ngunit ipinapakita ng halimbawa kung paano mo mapapalawak ang mga query sa XPath at gawing mas kumplikado ang mga ito.
Sa konklusyon
XPath ay isang mahusay na paraan upang bawasan ang dami ng code at pataasin ang pagproseso nito kapag nagtatrabaho sa XML. Ang karagdagang paggana ng PHP DOM ay nagbibigay-daan sa iyo na palawigin ang mga function ng XPath. Ito ay talagang kapaki-pakinabang na bagay, kung gagamitin mo ito at susuriin ang mga detalye, kakailanganin mong magsulat ng mas kaunting code.
Gumagamit ang XPath ng mga path expression upang pumili ng mga node sa isang XML na dokumento o isang hanay ng mga node. Sa pamamagitan ng node kasama ang landas (path) o yugto (mga hakbang) patungo sa napili.
halimbawa ng mga dokumentong XML
Gagamitin namin ang XML na dokumentong ito sa mga halimbawa sa ibaba.
Pumili ng node
Gumagamit ang XPath ng mga expression ng path upang pumili ng mga node sa isang XML na dokumento. O kasama ang landas sa pamamagitan ng isang node upang pumili ng isang hakbang. Ang mga sumusunod ay ang pinakakapaki-pakinabang na mga expression ng path:
Sa talahanayan sa ibaba ipinapakita namin ang ilan sa mga path ng expression at ang resulta ng expression:
daanan ng pagpapahayag | resulta |
---|---|
Tindahan ng libro | Piliin ang lahat ng child node ng elemento ng libro. |
/ Tindahan ng Libro | Piliin ang root element bookstore. Tandaan: Kung ang isang landas ay nagsisimula sa isang slash (/), ang landas ay palaging kumakatawan sa ganap na landas ng elemento! |
tindahan ng libro/libro | Piliin ang mga subitems na kabilang sa bookstore lahat ng bookitems. |
// Aklat | Piliin ang lahat ng mga subelement ng aklat, anuman ang kanilang posisyon sa dokumento. |
tindahan ng libro // libro | Pinipili ang lahat ng elemento ng libro na hindi nagmula sa bookstore ng elemento, anuman ang kanilang posisyon sa loob at ilalim ng bookstore. |
// @Lang | Piliin ang lahat ng property na pinangalanang Lang. |
(mga) panaguri
Ang isang panaguri ay ginagamit upang makahanap ng isang tiyak na node o node na naglalaman ng tinukoy na halaga.
Ang panaguri ay nakapaloob sa mga square bracket.
Sa talahanayan sa ibaba, naglista kami ng ilang mga expression ng path na may mga predicate at ang resulta ng expression:
daanan ng pagpapahayag | resulta |
---|---|
/ Bookstore / libro | Piliin ang mga subelement na kabilang sa unang elemento ng workbook. |
/Bookstore/libro [last()] | Piliin ang mga sub-element na kabilang sa elemento ng huling aklat ng aklat. |
/ Bookstore / libro [huling () - 1] | Piliin ang mga sub-item na nauugnay sa mutual bookstore ng pangalawang item ng libro. |
/Bookstore/libro [posisyon()<3] | Piliin ang unang dalawang elemento ng aklat ng elemento ng aklat na kabilang sa mga subelement. |
// Pamagat [@lang] | Piliin ang lahat ng attribute na pinangalanang Lang ay may pamagat ng elemento. |
// Pamagat [@ LANG = "eng"] | Piliin ang lahat ng pangalan ng elemento at ang mga elementong ito ay mayroong English attribute value. |
/bookstore/book | Piliin ang lahat ng elemento ng aklat ng elemento ng aklat, at ang halaga ng elemento ng presyo, na dapat na mas mataas sa 35.00. |
/bookstore/book/title | Piliin ang lahat ng elemento ng header ng elemento ng libro ng elemento ng aklat at kung saan dapat na mas mataas sa 35.00 ang halaga ng elemento ng presyo. |
Pumili ng mga hindi kilalang node
Maaaring gamitin ang mga wildcard ng XPath upang pumili ng hindi kilalang mga elemento ng XML.
Sa talahanayan sa ibaba, naglista kami ng ilang expression ng path pati na rin ang mga resulta ng mga expression na ito:
Pumili ng maramihang mga landas
Gamit ang expression ng path na "|" operator, maaari kang pumili ng ilang mga landas.
Sa talahanayan sa ibaba, naglista kami ng ilang expression ng path pati na rin ang mga resulta ng mga expression na ito.