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:
Eksempelnoder i XML-dokumentet ovenfor:
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:
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:
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å:
Forfedre
Forelder til noden, forelder til forelderen til noden osv. I det følgende eksempelet er forfedrene til tittelelementet bok- og bokhandelselementene:
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":
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.
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.
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:
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"
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:
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.
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 Vei | resultat |
---|---|
bokhandel | Velg 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/bok | Velg underelementene som tilhører bokhandelen alle bokvarer. |
// Bok | Velg alle bokunderelementer, uavhengig av deres plassering i dokumentet. |
bokhandel // bok | Velger alle bokelementer som ikke er etterkommere av elementets bokhandel, uavhengig av deres plassering i og under bokhandelen. |
// @Lang | Velg 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 Vei | resultat |
---|---|
/ Bokhandel / bok | Velg 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/bok | Velg alle bokelementer i bokelementet, og verdien av priselementet, som må være større enn 35,00. |
/bokhandel/bok/tittel | Velg 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.