Forkortet XPath-syntaks. Eksempler på xpath-spørringer til html Bruk av følgende akse

XPath brukes til å navigere gjennom elementene og attributtene til et XML-dokument. XPath er et av kjerneelementene i W3C XSLT-standarden.

1 Hva har skjedd XPath

XPath-uttrykk

XPath bruker baneuttrykk for å velge individuelle noder eller et sett med noder i et XML-dokument. Disse uttrykkene ligner veldig på uttrykkene du ser når du arbeider med et tradisjonelt datafilsystem.

Standard XPath-funksjoner

XPath inkluderer over 100 innebygde funksjoner. Det er funksjoner for streng- og numeriske verdier, dato og klokkeslett, nodesammenligning og QName-manipulering, sekvensstyring, boolske verdier og mye mer.

XPath brukes i XSLT

XPath er et av kjerneelementene i XSLT-standarden. Uten kunnskap om XPath vil du ikke kunne lage XSLT-dokumenter.

2 Terminologi XPath

Noder

Det er syv typer noder i XPath: element, attributt, tekst, navneområde, behandlingsinstruksjoner, kommentarer og dokumentnoder. XML-dokumenter behandles som tre av noder. Det øverste elementet i treet kalles rotelementet. Se på følgende XML-dokument:

Harry Potter J.K. Rowling 2005 29.99

Eksempelnoder i XML-dokumentet ovenfor:

(rotelement) J.K. Rowling (node) lang="en"(Egenskap)

Atomverdier

Atomverdier er noder som ikke har barn eller foreldre. Eksempel på atomverdier:

J.K. Rowling "no"

Elementer

Elementer er atomverdier eller noder.

3 Forhold noder

Foreldre

Hvert element og attributt har én overordnet. I følgende eksempel er bokelementet overordnet til tittel-, forfatter-, år- og priselementene:

Harry Potter J K Rowling 2005 29.99

Etterkommere

Elementnoder kan ha null, ett eller flere barn. I det følgende eksempelet er elementene "tittel", "forfatter", "år" og "pris" alle underordnede av bokelementet:

Harry Potter J K Rowling 2005 29.99

Elementer på samme nivå

Dette er noder som har samme forelder. I følgende eksempel er elementene "tittel", "forfatter", "år" og "pris" alle elementer på samme nivå:

Harry Potter J K Rowling 2005 29.99

Forfedre

Forelder til noden, forelder til forelderen til noden osv. I det følgende eksempelet er forfedrene til tittelelementet bok- og bokhandelselementene:

Harry Potter J K Rowling 2005 29.99

Etterkommere

Barn av en node, barn av barn av en node, etc. I det følgende eksempelet er barna til "bokhandel"-elementet elementene "bok", "tittel", "forfatter", "år" og "pris":

Harry Potter J K Rowling 2005 29.99

4 Syntaks XPath

XPath bruker baneuttrykk for å velge noder eller sett med noder i et XML-dokument. En node kan velges ved å følge en sti eller trinnvis. Vi vil bruke følgende XML-dokument i eksemplene nedenfor.

Harry Potter 29.99 Lære XML 39.95

Nodevalg

Ved å bruke XPath-uttrykk til å velge noder i et XML-dokument, kan du velge en node ved å følge en bane eller trinn. De mest nyttige baneuttrykkene er oppført nedenfor:

Tabellen nedenfor viser noen uttrykksbaner og resultatet av å utføre uttrykket:

XPath-uttrykk Resultat
bokhandel Velger alle noder som heter "bokhandel"
/bokhandel Velger bokhandelens rotelement

Merk: Hvis en bane begynner med en skråstrek (/), er det alltid en absolutt vei til elementet!

bokhandel/bok Velger alle "bok"-elementer som er barn av "bokhandel"-elementet
//bok Velger alle "bok"-elementer uavhengig av hvor de er i dokumentet
bokhandel//bok Velger alle "bok"-elementer som er underordnede "bokhandel"-elementet, uavhengig av hvor de er under "bokhandel"-elementet
//@lang Velger alle attributter som heter "lang"

Predikater

Predikater brukes til å finne en bestemt node eller en node som inneholder en bestemt verdi. Predikater er alltid omgitt av hakeparenteser. Tabellen nedenfor viser noen baneuttrykk med predikater, og resultatet av uttrykket:

XPath-uttrykk Resultat
/bokhandel/bok Velger det første "bok"-elementet, som er et underordnet "bokhandel"-element.

Merk: I IE 5,6,7,8,9 har den første noden en indeks på , men i henhold til W3C-retningslinjene er den . For å løse dette problemet i IE, sett alternativet "SelectionLanguage" for XPath:

I JavaScript: xml.setProperty("SelectionLanguage", "XPath");
/bokhandel/bok Velger det siste "bok"-elementet som er et underordnet "bokhandel"-element
/bokhandel/bok Velger det nest siste "bok"-elementet, som er et underordnet "bokhandel"-element
/bokhandel/bok Velge de to første "bok"-elementene som er barn av "bokhandel"-elementet
//tittel[@lang] Velger alle "tittel"-elementer som har et attributt kalt "lang"
//title[@lang="no"] Velger alle "title"-elementer som har et "language"-attributt med verdien "en"
/bokhandel/bok Velger alle "bok"-elementer etter "bokhandel"-elementet som har et "pris"-element med en verdi større enn 35,00
/bokhandel/bok/tittel Velger alle boktittelelementer i "bokhandel"-elementet som har et "pris"-element med en verdi større enn 35,00

Velge ukjente noder

XPath spesialtegn kan brukes til å velge ukjente XML-noder.

I tabellen nedenfor har vi listet opp noen uttrykksbaner og uttrykksresultater:

Velge flere baner

Bruke operatøren | i XPath-uttrykk kan du velge flere baner. Tabellen nedenfor viser flere baneuttrykk og deres resultater:

5 Aksler XPath

Vi vil bruke følgende XML-dokument senere i eksemplet.

Harry Potter 29.99 Lære XML 39.95

Akser definerer sett med noder, i forhold til gjeldende node.

Navn på akse Resultat
stamfar Velger alle forfedre (foreldre, besteforeldre osv.) til gjeldende node
stamfar-eller-selv Velger alle forfedre (foreldre, besteforeldre osv.) til gjeldende node og selve nåværende node
Egenskap
barn
etterkommer Velger alle barn (barn, barnebarn osv.) til gjeldende node
etterkommer-eller-selv Velger alle barn (barn, barnebarn osv.) av gjeldende node og selve nåværende node
følgende Velger alt i dokumentet etter at gjeldende nodes tag lukkes
følgende søsken Velger alle noder på samme nivå etter gjeldende node
navneområde Velger alle noder i det gitte navnerommet til gjeldende node
forelder Velger overordnet til gjeldende node
foregående Velger alle noder som vises foran gjeldende node i dokumentet, unntatt forfedre, attributtnoder og navneromsnoder
forrige søsken Velger alle søsken opp til gjeldende node
selv- Velger gjeldende node

6 Uttrykkene prøvetakingsveier

Plasseringsbanen kan være absolutt eller relativ. En absolutt plasseringsbane begynner med en skråstrek (/), men en relativ bane gjør det ikke. I begge tilfeller består prøvetakingsbanen av ett eller flere trinn atskilt med skråstreker:

Absolutt plasseringsbane:

/steg/steg/...

Relativ posisjonshentingsbane:

Trinn/trinn/...

Hvert trinn blir evaluert mot nodene i det gjeldende nodesettet. Steget består av:

  • akse (definerer treforholdet mellom de valgte nodene og gjeldende node);
  • nodesjekk (identifiserer en node innenfor en akse);
  • null eller flere predikater (for ytterligere å avgrense det valgte settet med noder)

Hentetrinnsyntaksen er:

Aksenavn::nodetestAksenavn::nodetest[prediktor]

Eksempel Resultat
barn::bok Velger alle boknoder som er underordnede av gjeldende node
attributt::lang Velger språkattributtet (lang) til gjeldende node
barn::* Velger alle underordnede av gjeldende node
Egenskap::* Velger alle attributter for gjeldende node
barn::tekst() Velger alle tekstnoder for gjeldende node
barn::node() Velger alle umiddelbare underordnede av gjeldende node
etterkommer::bok Velger alle underordnede av gjeldende node
stamfar::bok Velger alle forfedre til "bøkene" til gjeldende node
stamfar-eller-selv::bok Velger alle bokforfedre til gjeldende node - og gjeldende node hvis det også er en bok
barn::*/barn::pris Velger alle barn av "pris" ett nivå unna gjeldende node

7 Operatører XPath

XPath-uttrykk returnerer som et sett med noder, strenger, booleaner eller numeriske verdier. Nedenfor er en liste over operatorer som brukes i XPath-uttrykk:

Operatør Beskrivelse Eksempel
| Beregner to sett med noder //bok | //cd
+ Addisjon 6 + 4
- Subtraksjon 6 - 4
* Multiplikasjon 6 * 4
div Inndeling 8 div 4
= Likestilling pris=9,80
!= Ulikhet pris!=9,80
< Mindre enn pris<9.80
<= Mindre eller lik pris≤9,80
> Mer enn pris >9,80
>= Mer eller lik pris≤9,80
eller Eller pris=9,80 eller pris=9,70
og OG pris>9,00 og pris<9.90
mod Resten av divisjonen 5 mod 2

8 Eksempler XPath

La oss gå gjennom den grunnleggende XPath-syntaksen med noen få eksempler. Vi vil bruke følgende XML-dokument "books.xml" i eksemplene nedenfor:

Hverdags italiensk Giada De Laurentiis 2005 30.00 Harry Potter J K Rowling 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Lære XML Erik T. Ray 2003 39.95

Laster et XML-dokument

Bruk XMLHttpRequest for å laste ned XML-dokumenter, som støttes av de fleste moderne nettlesere:

Var xmlhttp=ny XMLHttpRequest()

Kode for eldre Microsoft-nettlesere (IE 5 og 6):

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

Nodevalg

Dessverre kan XPath fungere annerledes i Internet Explorer enn i andre nettlesere. I våre eksempler vil vi bruke kode som skal fungere i de fleste nettlesere. Internet Explorer bruker "selectNodes()"-metoden for å velge noder i et XML-dokument:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera og Safari bruker metoden evaluate() for å velge noder fra et XML-dokument:

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

Velg alle titler

Følgende eksempel velger alle overskriftsnoder:

/bokhandel/bok/tittel

Velge tittelen på den første boken

Følgende eksempel velger tittelen på den første "bok"-noden etter "bokhandel"-elementet:

/bokhandel/bok/tittel

Velg alle priser

Følgende eksempel velger teksten til alle prisnoder:

/bokhandel/bok/pris

Velger noder med pris >35

Følgende eksempel velger alle noder med priser over 35:

/bokhandel/bok/pris

Velge toppnoder med pris >35

Følgende eksempel velger alle tittelnoder med en pris høyere enn 35:

/bokhandel/bok/tittel

Xpath er et spørringsspråk for xml- eller xhtml-dokumentelementer. Akkurat som SQL, er xpath et deklarativt spørrespråk. For å få tak i dataene du er interessert i, trenger du bare å lage en spørring som beskriver disse dataene. Språktolken xpath vil gjøre alt det skitne arbeidet for deg.
Veldig praktisk, ikke sant? La oss se hvilke muligheter xpath tilbyr for å få tilgang til nettsidenoder.

Opprette en forespørsel til nettsidenoder

Jeg gjør deg oppmerksom på et lite laboratoriearbeid, der jeg vil demonstrere opprettelsen av xpath-forespørsler til en nettside. Du vil kunne gjenta forespørslene jeg ga og, viktigst av alt, prøve å oppfylle dine egne. Jeg håper at takket være dette vil artikkelen være like interessant for nybegynnere og programmerere som er kjent med xpath til xml.

Til laboratoriet trenger vi:
- xhtml nettside;
- Mozilla Firefox-nettleser med tillegg;
- brannbug;
- FirePath ;
(du kan bruke hvilken som helst annen nettleser med visuell xpath-støtte)
- litt tid.

Som en nettside for å gjennomføre et eksperiment, foreslår jeg hovedsiden til World Wide Web Consortiums nettsted ("http://w3.org"). Det er denne organisasjonen som utvikler xquery(xpath)-språkene, xhtml-spesifikasjonen og mange andre Internett-standarder.

Oppgave
Hent informasjon om konsortiumkonferanser fra xhtml-koden til w3.org-hovedsiden ved å bruke xpath-spørringer.
La oss begynne å skrive xpath-spørringer.
Første Xpath-forespørsel
Åpne Firepath-fanen i FireBug, velg elementet som skal analyseres med velgeren, klikk: Firepath har opprettet en xpath-forespørsel for det valgte elementet.

Hvis du valgte tittelen på den første hendelsen, vil forespørselen være slik:

Etter å ha fjernet unødvendige indekser, vil spørringen samsvare med alle elementene i overskriftstypen.

Firepath fremhever elementer som samsvarer med søket. Du kan se i sanntid hvilke dokumentnoder som samsvarer med spørringen.

Forespørsel om informasjon om konferansesteder:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Slik får vi en liste over sponsorer:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

xpath syntaks

La oss gå tilbake til søkene vi opprettet og forstå hvordan de er strukturert.
La oss vurdere den første forespørselen i detalj

I denne spørringen har jeg delt inn tre deler for å demonstrere mulighetene til xpath. (Inndelingen i deler er vanskelig)

Første del
.// - rekursiv nedstigning til null eller flere nivåer av hierarki fra gjeldende kontekst. I vårt tilfelle er den aktuelle konteksten dokumentroten

Andre del
* - ethvert element,
[@id="w3c_home_upcoming_events"]– et predikat på grunnlag av hvilket vi søker etter en node som har et id-attributt lik "w3c_home_upcoming_events". XHTML-element-ID-er må være unike. Derfor bør spørringen "ethvert element med en spesifikk ID" returnere den eneste noden vi leter etter.

Vi kan erstatte * til det nøyaktige nodenavnet div i denne forespørselen
div[@id="w3c_home_upcoming_events"]

Dermed går vi ned i dokumenttreet til div[@id="w3c_home_upcoming_events"]-noden vi trenger. Vi bryr oss ikke i det hele tatt hvilke noder DOM-treet består av og hvor mange nivåer av hierarki som er igjen over.

Den tredje delen
/ul/li/div/p/a–xpath er banen til et spesifikt element. Banen består av adresseringstrinn og nodekontrollbetingelser (ul, li, etc.). Trinn er atskilt med et "/" (skråstrek).

xpath samlinger
Det er ikke alltid mulig å få tilgang til noden av interesse ved å bruke et predikat eller adresseringstrinn. Svært ofte er det mange noder av samme type på ett hierarkinivå, og det er nødvendig å velge "bare den første" eller "bare den andre" nodene. Det gis samlinger for slike saker.

xpath-samlinger lar deg få tilgang til et element ved dets indeks. Indeksene tilsvarer rekkefølgen elementene ble presentert i det originale dokumentet. Serienummeret i samlinger regnes fra én.

Basert på det faktum at "sted" alltid er det andre avsnittet etter "konferansenavn", får vi følgende spørring:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Hvor p er det andre elementet i settet for hver node i listen /ul/li/div.

På samme måte kan vi få en liste over sponsorer med forespørselen:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Noen xpath-funksjoner
Det er mange funksjoner i xpath for å jobbe med elementer i en samling. Jeg vil bare gi noen få av dem.

siste():
Returnerer det siste elementet i samlingen.
Spørring ul/li/div/p - vil returnere de siste avsnittene for hver "ul"-listenode.
Den første()-funksjonen er ikke gitt. For å få tilgang til det første elementet, bruk indeks "1".

tekst():
Returnerer testinnholdet til et element.
.//a – vi får alle lenker med teksten "Arkiv".

posisjon() og mod:
posisjon() - returnerer posisjonen til et element i et sett.
mod er resten av divisjonen.

Ved å kombinere disse funksjonene kan vi få:
- ikke engang elementer ul/li
- jevne elementer: ul/li

Sammenligningsoperasjoner

  • < - логическое «меньше»
  • > - logisk "større enn"
  • <= - логическое «меньше либо равно»
  • >= - logisk "større enn eller lik"
ul/li , ul/li - liste elementer fra det tredje tallet og omvendt.

På egenhånd

Prøv å få:
- til og med URL-lenker fra venstremenyen "Standarder";
- overskrifter på alle nyheter, bortsett fra den første fra hovedsiden til w3c.org.

Xpath i PHP5

$dom = nytt DomDocument(); $dom->loadHTML($HTMLCode); $xpath = ny 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; )

Endelig

Ved å bruke et enkelt eksempel så vi mulighetene til xpath for å få tilgang til nettsidenoder.
Xpath er industristandarden for tilgang til xml-elementer og xhtml, xslt-transformasjoner.
Du kan bruke den til å analysere hvilken som helst HTML-side. Hvis html-kildekoden inneholder betydelige feil i markeringen, kjør den gjennom

I dag skal vi se nærmere på temaet bruk av XPath med PHP. Du vil se i eksemplene hvordan XPath reduserer mengden kode betydelig. La oss se på bruk av spørringer og funksjoner i XPath.

Til å begynne med vil jeg gi deg to typer dokumenter: DTD og XML, hvor vi vil se på funksjonen til PHP DOM XPath. Slik ser de ut:

Ei bok En forfatter Skrekk kapittel en En annen bok En annen forfatter Science Fiction kapittel en

Grunnleggende XPath-spørringer

Den enkle XPath-syntaksen lar deg få tilgang til elementer i et XML-dokument. På den enkleste måten kan du angi banen til ønsket element. Ved å bruke XML-dokumentet ovenfor, vil følgende XPath-spørring returnere samlingen av de gjeldende elementene som finnes i bokelementet:

//bibliotek/bok

Som dette! To skråstreker fremover definerer rotelementet til dokumentet, og en skråstrek går over til bokunderelementet. Det er enkelt og raskt, er det ikke?

Men hva om du vil velge et spesifikt bokelement fra et sett? La oss anta at du vil ha bøker av en "viss forfatter". XPath-spørringen for dette vil være:

//bibliotek/bok/forfatter/..

du kan bruke tekst() i firkantede parenteser for å sammenligne nodeverdien. Også «/..» betyr at vi ønsker å bruke det overordnede elementet (dvs. gå tilbake én node ovenfor).

XPath-spørringer gjøres ved å bruke en eller to funksjoner: spørsmål() Og evaluere(). Begge danner en forespørsel, men forskjellen er i resultatet som returneres. query() vil alltid returnere DOMNodeList, I motsetning til evaluere() vil returnere et tekstresultat hvis mulig. For eksempel, hvis XPath-spørringen din ville returnere antall bøker skrevet av en bestemt forfatter, så ville query() returnere en tom DOMNodeList, evaluate() ville ganske enkelt returnere et tall, du kan bruke dette direkte til å hente dataene fra noden .

XPath-kode og hastighetsfordeler

La oss se på et enkelt eksempel som vil returnere antall bøker skrevet av en bestemt forfatter. Vi skal se på den første metoden slik vi alltid gjør, uten å bruke XPath. Nå vil du forstå hvordan du gjør dette uten XPath og hvor mye enklere det er å gjøre det med XPath.

domDocument->getElementsByTagName("author"); foreach ($elementer som $element) ( if ($element->nodeValue == $author) ( $total++; ) ) returner $nummer; )

Den neste metoden returnerer det samme resultatet, men bruker XPath til å velge de bøkene som er skrevet av en spesifikk forfatter.

domDokument); $result = $xpath->query($query); return $result->length; )

Merk at vi ikke trenger å kontrollere verdien av hvert element på nytt for å finne ut hvilken forfatter som har skrevet hver bok. Men vi kan forenkle koden mer ved å bruke XPath-funksjonen telle()å telle innholdet i elementene i denne banen.

domDokument); return $xpath->evaluate($query); )

Vi kan få informasjonen vi trenger med en enkelt linje XPath-spørring. Det er ikke nødvendig å lage mange PHP-filtre. Dette er den enkleste og raskeste måten å skrive denne funksjonaliteten på!

Merk at evaluate() ble brukt i det siste eksemplet. Dette er fordi funksjonen count() returnerer et tekstresultat. Bruk av query() vil returnere en DOMNodeList, men den vil være tom.

XPath er verdt å bruke fordi det ikke bare gjør PHP-koden enklere, det gir også en hastighetsfordel. Jeg la merke til at den første versjonen var 30 % raskere i gjennomsnitt sammenlignet med den andre. Men den tredje er 10 % raskere enn den første. Dette avhenger selvfølgelig av serveren din og spørringene du bruker. Bruk av XPath i sin rene form gir de beste resultatene når det gjelder hastighet og enkel skriving av kode.

XPath-funksjoner

Her er noen funksjoner som kan brukes med XPath. Du vil også finne mange ressurser som går i detalj om hver tilgjengelig funksjon. Hvis du trenger å beregne DOMNodeList eller sammenligne nodeValue (nodeverdi), kan du finne en passende XPath-funksjon som eliminerer bruken av unødvendig PHP-kode.

Dette vet du allerede fra eksemplet med funksjonen count(). La oss bruke id()-funksjonen for å få titlene på bøker med de gitte ISBN-ene. For å gjøre dette må du bruke følgende XPath-uttrykk:

id("isbn1234 isbn1235")/tittel

Merk at verdiene du leter etter ikke skal stå i parentes, bare atskilt med mellomrom. Tenk heller ikke på å legge til et komma:

domDokument); $result = $xpath->query($query); $books = array(); foreach ($result som $node) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) returner $books; )

Å håndtere komplekse funksjoner i XPath er utrolig enkelt.

Bruke PHP-funksjoner med XPath

Noen ganger vil du trenge mer funksjonalitet enn standard XPath-funksjonene ikke kan tilby. Heldigvis lar PHP DOM native PHP-funksjoner samhandle med XPath-spørringer.

La oss se på et eksempel som returnerer antall ord i en boktittel. I denne enkleste funksjonen vil vi skrive følgende:

domDokument); $result = $xpath->query($query); $tittel = $result->item(0)->getElementsByTagName("tittel") ->item(0)->nodeValue; return str_word_count($tittel); )

Men vi kan også inkludere str_word_count()-funksjonen direkte i XPath-forespørselen. Dette kan gjøres i noen få trinn. Først av alt må vi registrere navneområdet med et XPath-objekt. PHP-funksjoner i XPath-forespørsler kalles ved hjelp av strengen "php:functionString", hvoretter navnet på den ønskede funksjonen skrives. Navneområdet er også diskutert mer detaljert på http://php.net/xpath. Andre navneområdeverdier vil gi en feil. Etter dette må vi kalle registerPHPFunctions(). Denne funksjonen forteller PHP at når et anrop foretas gjennom navneområdet "php:", vil PHP håndtere dette anropet.

Et eksempel på syntaks for å kalle funksjoner kan være:

php:functionString("navn på funksjon", arg, arg...)

La oss sette det hele sammen i følgende getNumberOfWords() funksjonseksempel:

domDokument); //register php navneområde $xpath->registerNamespace("php", "http://php.net/xpath"); //nå kan php-funksjoner kalles i xpath-forespørsler $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/tittel))"; return $xpath->evaluate($query); )

Merk at du ikke trenger å kalle XPath-funksjonen text() for å få nodens tekst. RegisterPHPFunctions()-metoden gjør dette automatisk. Selv om følgende eksempellinje med kode også vil være gyldig:

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

Registrering av PHP-funksjoner er ikke begrenset til funksjoner som er inkludert i PHP. Du kan definere dine egne funksjoner og bruke dem i XPath. Den eneste forskjellen er at du må bruke "php:function" i stedet for "php:functionString".

La oss skrive en funksjon utenfor klassen for å demonstrere den grunnleggende funksjonaliteten. Funksjonen vi skal bruke returnerer bøkene til forfatteren "George Orwell". Den skal returnere sann for hver node du vil inkludere i spørringen.

nodeValue == "George Orwell"; } !}

Argumentet som sendes til funksjonen er en rekke DOM-elementer. Denne funksjonen går gjennom matrisen og bestemmer de nødvendige elementene, og inkluderer dem deretter i DOMNodeList. I dette eksemplet var noden som ble testet /book, og vi brukte også /author for å bestemme de nødvendige elementene.

Nå kan vi lage getGeorgeOrwellBooks()-funksjonen:

domDokument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//bibliotek/bok1"; $result = $xpath->query($query); $books = array(); foreach($result as $node) ( $books = $node->getElementsByTagName("tittel") ->item(0)->nodeValue; ) returner $books; )

Hvis compare()-funksjonen er statisk, må du endre XPath-spørringen:

//bibliotek/bok

For å være ærlig, kunne all denne funksjonaliteten vært implementert ved bruk av ren XPath-kode. Men eksemplet viser hvordan du kan utvide XPath-spørringer og gjøre dem mer komplekse.

For å konkludere

XPath er en fin måte å redusere mengden kode og øke behandlingen når du arbeider med XML. Ytterligere PHP DOM-funksjonalitet lar deg utvide XPath-funksjoner. Dette er en veldig nyttig ting, hvis du bruker den og fordyper deg i detaljene, må du skrive mindre og mindre kode.


XPath bruker baneuttrykk for å velge noder i et XML-dokument eller et sett med noder. Etter node langs banen (stien) eller etappen (trinnene) til den valgte.

forekomst av XML-dokumenter

Vi vil bruke dette XML-dokumentet i eksemplene nedenfor.


Harry Potter
29.99


Lære XML
39.95

Velg node

XPath bruker baneuttrykk for å velge noder i et XML-dokument. Eller langs stien gjennom en node for å velge et trinn. Følgende er de mest nyttige baneuttrykkene:

I tabellen nedenfor viser vi noen av uttrykksbanene og resultatet av uttrykket:

uttrykk Veiresultat
bokhandelVelg alle underordnede noder til bokelementet.
/ Bokhandel

Velg rotelementbokhandelen.

Merk: Hvis en bane begynner med en skråstrek (/), er banen alltid representativ for den absolutte banen til elementet!

bokhandel/bokVelg underelementene som tilhører bokhandelen alle bokvarer.
// BokVelg alle bokunderelementer, uavhengig av deres plassering i dokumentet.
bokhandel // bokVelger alle bokelementer som ikke er etterkommere av elementets bokhandel, uavhengig av deres plassering i og under bokhandelen.
// @LangVelg alle eiendommer som heter Lang.

Predikat(er)

Et predikat brukes til å finne en spesifikk node eller node som inneholder verdien som er spesifisert.

Predikatet er omsluttet av firkantede parenteser.

I tabellen nedenfor har vi listet opp noen baneuttrykk med predikater og resultatet av uttrykket:

uttrykk Veiresultat
/ Bokhandel / bokVelg underelementene som tilhører det første arbeidsbokelementet.
/Bokhandel/bok [siste()]Velg underelementene som tilhører bok siste bok-elementet.
/ Bokhandel / bok [siste () - 1]Velg underelementene knyttet til den gjensidige bokhandelen til den andre bokartikkelen.
/Bokhandel/bok [posisjon()<3] Velg de to første bokelementene i bokelementet som tilhører underelementene.
// Tittel [@lang]Velg alle attributter som heter Lang har en elementtittel.
// Tittel [@ LANG = "eng"]Velg alle elementnavnene og disse elementene har den engelske attributtverdien.
/bokhandel/bokVelg alle bokelementer i bokelementet, og verdien av priselementet, som må være større enn 35,00.
/bokhandel/bok/tittelVelg alle bokelementets overskriftselementer i bokelementet og der verdien av priselementet må være større enn 35,00.

Velg ukjente noder

XPath-jokertegn kan brukes til å velge ukjente XML-elementer.

I tabellen nedenfor har vi listet opp noen baneuttrykk samt resultatene av disse uttrykkene:

Velg flere veier

Bruke baneuttrykket "|" operatør, kan du velge flere veier.

I tabellen nedenfor har vi listet opp noen baneuttrykk samt resultatene av disse uttrykkene.