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:

Harry Potter J. K. Rowling 2005 29.99

Mga halimbawang node sa XML na dokumento sa itaas:

(root element) J. K. Rowling (node) lang="en"(katangian)

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:

Harry Potter JK Rowling 2005 29.99

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:

Harry Potter JK Rowling 2005 29.99

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:

Harry Potter JK Rowling 2005 29.99

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:

Harry Potter JK Rowling 2005 29.99

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":

Harry Potter JK Rowling 2005 29.99

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.

Harry Potter 29.99 Pag-aaral ng XML 39.95

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.

Harry Potter 29.99 Pag-aaral ng XML 39.95

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:

Araw-araw na Italyano Giada De Laurentiis 2005 30.00 Harry Potter JK Rowling 2005 29.99 XQuery Kick Start James McGovern Bawat Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Pag-aaral ng XML Erik T. Ray 2003 39.95

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"
ul/li , ul/li - listahan ng mga elemento simula sa ika-3 numero at vice versa.

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:

Isang libro Isang manunulat Horror unang kabanata Isa pang Aklat Isa pang Author Science Fiction unang kabanata

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.


Harry Potter
29.99


Pag-aaral ng XML
39.95

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 pagpapahayagresulta
Tindahan ng libroPiliin 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/libroPiliin ang mga subitems na kabilang sa bookstore lahat ng bookitems.
// AklatPiliin ang lahat ng mga subelement ng aklat, anuman ang kanilang posisyon sa dokumento.
tindahan ng libro // libroPinipili ang lahat ng elemento ng libro na hindi nagmula sa bookstore ng elemento, anuman ang kanilang posisyon sa loob at ilalim ng bookstore.
// @LangPiliin 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 pagpapahayagresulta
/ Bookstore / libroPiliin 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/bookPiliin 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/titlePiliin 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.