XPath

XPath ( XML Path Language ) er et språk som lar deg bygge uttrykk som krysser og behandler et XML-dokument. Ideen ligner på vanlige uttrykk for å velge deler av en tekst uten attributter ( ren tekst ). XPath lar deg søke og velge under hensyntagen til den hierarkiske strukturen til XML. XPath ble opprettet for bruk i XSLT -standarden , hvor den brukes til å velge og undersøke input-dokumentstrukturen til transformasjonen. XPath ble definert av W3C -konsortiet .

Introduksjon

All prosessering som utføres med en XML-fil er basert på muligheten for å adressere eller få tilgang til hver enkelt av delene som utgjør den, slik at vi kan behandle hvert og et av elementene forskjellig.

Behandlingen av XML-filen begynner med plasseringen av den samme gjennom hele settet med eksisterende dokumenter i verden. For å utføre denne plasseringen entydig, brukes URIer (Uniform Resource Identifiers), hvorav URLer (Uniform Resource Locators) utvilsomt er de mest kjente.

Når XML-dokumentet er lokalisert, er måten å velge informasjon i det gjennom bruk av XPath, som er forkortelsen for det som er kjent som XML Path Language. Med XPath kan vi velge og referere til tekst, elementer, attributter og annen informasjon som finnes i en XML-fil.

XPath i seg selv er et sofistikert og komplekst språk, men forskjellig fra de prosedyrespråkene vi vanligvis bruker (C, C++, Basic, Java...). Videre, som nesten alt i XML-verdenen, er det fortsatt i utvikling, så det er ikke lett å finne verktøy som inneholder alle funksjonene.

XPath er i sin tur grunnlaget for at det er spesifisert nye verktøy som utnytter det til behandling av XML-dokumenter. Verktøy som XPointer, XLink og XQuery (språket som håndterer XML-dokumenter som om det var en database). Dermed brukes XPath til å si hvordan et stilark skal behandle innholdet på en XML-side, men også for å kunne legge inn lenker eller laste inn bestemte områder av en XML-side i en nettleser, i stedet for hele siden.

XPath-datamodellen

Et XML-dokument behandles av en parser (eller parser) som bygger et tre med noder. Dette treet starter med et rotelement, som forgrener seg gjennom elementene som dingler fra det, og slutter med bladnoder, som bare inneholder tekst, kommentarer, behandlingsinstruksjoner, eller til og med er tomme og har bare attributter.

Måten XPath velger deler av XML-dokumentet på, er nøyaktig basert på den genererte trerepresentasjonen av dokumentet. Faktisk vil "operatørene" som dette språket består av, minne oss om terminologien som brukes når man snakker om trær i databehandling: rot, barn, stamfar, etterkommer, etc.

Et spesielt tilfelle av node er attributtnoder. En node kan ha så mange attributter du vil, og det opprettes en attributtnode for hver enkelt. Disse attributtnodene betraktes imidlertid IKKE som deres barn, men snarere som tagger lagt til elementnoden.

Nedenfor er et eksempel på hvordan et XML-dokument konverteres til et tre. Det samme eksemplet vil bli brukt gjennom hele opplæringen. XML-dokumentet vises først, etterfulgt av treet det genererer.

XML-dokument  :

<bok> <title>To ganger tre gater</title> <author>Josefa Santos</author> <chapter num="1"> Den første gaten <avsnitt> Det var en dyster natt i august... </paragraph> <paragraph highlight="yes"> Hun, uskyldig som <link href="link">sommerfugl</link> som krysser himmelen på jakt etter drikkoffer... </paragraph> </kapittel> <chapter num="2" public="yes"> Den andre gaten <avsnitt> Det var en mørk natt i september... </paragraph> <avsnitt> Hun, uskyldig som <link href="link">bi</link> som krysser vinden på jakt etter blomstenes nektar... </paragraph> </kapittel> <appendiks num="a" public="yes"> tredje gate <avsnitt> Det var en tett desembernatt... </paragraph> <avsnitt> Hun, ærlig som <link href="link">bi</link> som krysser rommet på jakt etter skapninger å spise... </paragraph> </vedlegg> </book>

Generert tre :

/ +---bok | +---tittel | | | +---(tekst)To ganger tre baner | +---forfatter | | | +---(tekst)Josefa Santos | +---kapittel [num=1] | | | +---(tekst)Den første gaten | | | +---avsnitt | | | | | +---(tekst)Det var en dyster natt... | | | +---avsnitt [highlight=yes] | | | +---(tekst) Hun, hvor uskyldig | | | +---link [href=link] | | | | | +---(tekst)sommerfugl | | | +---(tekst) som krysser himmelen på jakt etter drikkoffer... | +---kapittel [num=2, offentlig=ja] | +---(tekst)Second Street | +---avsnitt | | | +---(tekst)Det var en mørk natt... | +---avsnitt | +---(tekst) Hun, som en uskyldig bi...


Nodetyper

Det finnes ulike typer noder i et tre fra et XML-dokument, nemlig: rot, element, attributt, tekst, kommentar og prosesseringsinstruksjon (henholdsvis: rot, elementer, attributt, tekst, kommentar og behandlingsinstruksjon). Alt dette er veldig gunstig.

Rotnoden

Det er identifisert med /. Rotnoden skal ikke forveksles med rotelementet i dokumentet. Hvis XML-dokumentet i vårt eksempel har bok som rotelement, vil dette være den første noden som henger fra rotnoden til treet, som er: /.

Jeg insisterer: / refererer til rotnoden til treet, men ikke til rotelementet til XML-dokumentet, selv om et XML-dokument bare kan ha ett rotelement. Faktisk kan vi si at rotnoden til treet inneholder rotelementet til dokumentet.

Elementnode

Ethvert element i et XML-dokument blir en elementnode i treet. Hvert element har sin overordnede node. Den overordnede noden til ethvert element er i seg selv et element, bortsett fra rotelementet, hvis overordnede er rotnoden. Elementnodene har igjen underordnede, som er: elementnoder, tekstnoder, kommentarnoder og prosesseringsinstruksjoner. Elementnoder har også egenskaper som navn, attributter og informasjon om "navneområdene" de har aktive.

En interessant egenskap til elementnoder er at de kan ha unike identifikatorer (for dette må de ledsages av en DTD som spesifiserer at nevnte attributter tar unike verdier), dette gjør det mulig å referere til nevnte elementer på en mye mer direkte måte.

Tekstnoder

Med tekst skal vi referere til alle tegnene i dokumentet som ikke er merket med en tag. En tekstnode har ingen barn, det vil si at de forskjellige tegnene som danner den, regnes ikke som dens barn.

Attributtnoder

Som vi allerede har indikert, er ikke attributtnodene så mye barn av elementnoden som inneholder dem som etiketter lagt til elementnoden. Hver attributtnode består av et navn, en verdi (som alltid er en streng) og et mulig "navneområde".

De attributtene hvis verdi er standardverdien som er tildelt i DTD, vil bli behandlet som om verdien hadde blitt tildelt dem når du skrev XML-dokumentet. Tvert imot opprettes ingen node for attributter som ikke er spesifisert i XML-dokumentet, og med #IMPLIED- egenskapen definert i DTD-en. Det opprettes heller ingen attributtnoder for navneområdedefinisjoner. Alt dette er normalt hvis vi tar i betraktning at det ikke er nødvendig å ha en DTD for å behandle et XML-dokument.

Kommentar- og prosessinstruksjonsnoder

Bortsett fra de angitte nodene, genereres det også noder i treet for hver node med kommentarer og med behandlingsinstruksjoner. Innholdet i disse nodene kan nås med egenskapen string-value .

Syntaks og semantikk (XPath 1.0)

Den viktigste typen uttrykk i XPath er en lokasjonsbane . En posisjonsbane består av en sekvens med posisjonstrinn . For hvert lokaliseringstrinn er det 3 komponenter:

Et XPath-uttrykk evalueres mot en kontekstnode . En aksespesifikasjoner som "barn" eller "etterkommer" spesifiserer retningen for å navigere fra kontekstnoden. 'Test'-noden og predikatet brukes til å filtrere spesifikke 'noder' i henhold til den spesifikke aksen: For eksempel krever testnoden 'A' at alle noder for å navigere har etiketten ('label') 'A'. Et predikat kan brukes til å spesifisere at de valgte nodene har en spesifikk egenskap, disse er spesifisert av XPath-uttrykket.

XPath-syntaksen har to former: Stenografisyntaksen er mer kompakt og lar XPaths skrives og leses enkelt og intuitivt, i mange tilfeller ved å bruke kjente tegn og en kjent måte å konstruere den på. Hele syntaksen er mer avansert, men lar deg spesifisere flere alternativer og er mer beskrivende å lese, så lenge du leser nøye.

Kort syntaks

Den kompakte notasjonen tillater mange standardverdier og forkortelser for de vanligste tilfellene. Gitt XML-en som inneholder følgende eksempel:

<A> <B> <C/> </B> </A>

Et enkelt valg med stenografi XPath-syntaks har en form som dette:

  • /A/B/C

den velger element C på adressen til "underordnet" til element B, som er et underordnet element til element A, og velger dermed elementet lengst utenfor XML-dokumentet. XPath-syntaksen etterligner en URI ( Uniform Resource Identifier ) ​​og en filbanesyntaks i Unix-stil .

Mer komplekse uttrykk kan konstrueres ved å bruke en annen spesifikk akse enn standard 'barneakse', en nodetest som ikke har et enkelt navn, eller predikater, for eksempel å skrive i parentes etter et hvilket som helst trinn. For eksempel uttrykket:

  • A//B/*[1]

velger det første barnet (' *[1]'), uansett navn, av hvert element B og dets barn. Dette symbolet (' //') refererer til å ta et avkom av element A, det vil si et barn av den gjeldende kontekstnoden (Uttrykket starter ikke med et ' /'). Legg merke til at predikatet [1]binder tettere enn operatoren /. For å velge den første noden som er valgt med uttrykket A//B/*, skriv inn (A//B/*)[1]. Merk at verdien av indeksen i XPath-predikatet (teknisk sett 'neste posisjon' til XPath-nodesettet) starter på 1, ikke 0 som er vanlig i språk som Javascript, C og Java.

Utvidet syntaks

Vi kan skrive de to eksemplene ovenfor i den utvidede (uforkortede) syntaksen som følger:

  • /child::A/child::B/child::C
  • child::A/descendant-or-self::node()/child::B/child::node()[position()=1]

Her, ved hvert trinn i XPath, spesifiseres aksen (eksempel: childo descendant-or-self) eksplisitt, etterfulgt av , ::og deretter nodetesten , akkurat som Ao node()i de foregående eksemplene.

I dette samme, men kortere:

A//B/*[position()=1]

Aksespesifikasjoner

Aksespesifikatoren angir navigasjonsretningen i XML-dokumentrepresentasjonstreet. De tilgjengelige aksene er:

Aksespesifikasjoner i XPath
Full syntaks Forkortet syntaks notater
ancestor
ancestor-or-self
attribute (SimboloArroba) (SimboloArroba)abcer kortformen forattribute::abc
child xyzer en forkortelse forchild::xyz
descendant
descendant-or-self // //er en forkortelse for/descendant-or-self::node()/
following
following-sibling
namespace
parent .. ..er en forkortelse forparent::node()
preceding
preceding-sibling
self . .er en forkortelse forself::node()

Som et eksempel på bruk av attributt - aksen i stenografisyntaksen, //a/(SimboloArroba)hrefvelger den attributtet som kalles hrefpå elementet apå hver side av dokumenttreet. Uttrykket " ." (Det er en forkortelse for self::node() ) brukes ofte i et predikat for å referere til den valgte noden. Velg for eksempel h3[.='See also']et element som er navngitt h3i gjeldende kontekst, hvis tekstinnhold er See also.

Nodetest

Nodetesten kan bestå av et spesifikt nodenavn eller et mer generelt uttrykk. I tilfellet med et XML-dokument der navneromsprefikset gser definert, vil det //gs:enquirysøke etter alle elementene enquiryi det navnerommet, og //gs:*finne alle elementene, uavhengig av det lokale navnet i dette navnerommet.

Andre nodetestformater er:

kommentar() Søk i XML-en etter en kommentarnode, for eksempel.<!-- Comment --> tekst() Søk etter en hel tekst, eksempel el hello worlden<k>hello<m> world</m></k> behandlingsinstruksjon() Finn XML i behandlingsinstruksjoner for eksempel <?php echo $a; ?>. I dette tilfellet vil det processing-instruction('php')matche. ikke gi() Finn hvilken som helst node i det hele tatt.

Predikater

Predikater, skrevet som uttrykk i hakeparenteser, kan brukes til å filtrere et sett av alle i henhold til en betingelse. For eksempel areturnerer den et sett med alt (alle elementene asom er barn av kontekstnoden), og a[(SimboloArroba)href='help.php']lagrer bare elementene som har attributtet hrefmed verdien help.php.

Det er ingen grenser for antall predikater i dette trinnet, og de trenger ikke være begrenset til det siste trinnet i en XPath. De kan også nestes på hvilken som helst dybde. Baner spesifisert i predikater begynner i konteksten til det gjeldende trinnet (det vil si den umiddelbart foregående nodetesten) og endrer ikke den konteksten. Alle predikater må være oppfylt for at en kamp skal skje.

Når verdien av predikatet er numerisk, er det syntaktisk sukker å sammenligne med posisjonen til noden i settet med noder (som indikert av funksjonen position()). Så p[1]det er en kort form for p[position()=1]y for å velge det første underordnede elementet p, mens p[last()]det er en kort form for p[position()=last()]y for å velge det siste underordnede pav gjeldende kontekstnod.

I det andre tilfellet konverteres verdien til predikatet automatisk til en boolsk verdi. Når predikatet evalueres til et nodesett, er resultatet sant når nodesettet ikke er tomt. Derfor p[(SimboloArroba)x]velger de pvelger elementene som har et attributt x.

Et mer komplekst eksempel er uttrykket: a[/html/(SimboloArroba)lang='en'][(SimboloArroba)href='help.php'][1]/(SimboloArroba)targetvelger attributtverdien til targetdet første elementet ablant barna til kontekstnoden som har attributtet hrefmed verdien help.php, forutsatt at det overordnede elementet htmlhar attributtet langmed verdien en. Referansen til et attributt for elementet på øverste nivå i det første predikatet påvirker verken konteksten til andre predikater eller konteksten til selve plasseringstrinnet.

Rekkefølgen til predikatene er signifikant hvis predikatene tester posisjonen til en node. Hvert predikat tar et sett med noder og returnerer (potensielt) et mindre sett. Den vil da a[1][(SimboloArroba)href='help.php']finne treff bare hvis det første barnet atil kontekstnoden tilfredsstiller betingelsen (SimboloArroba)href='help.php', så lenge det a[(SimboloArroba)href='help.php'][1]finner det første barnet asom tilfredsstiller betingelsen.

Funksjoner og operatorer

XPath 1.0 definerer 4 datatyper: Settet med noder (nodesett uten egenrekkefølge), strenger (tegnstreng), tall (tall) og booleaner (booleaner).

De tilgjengelige operatørene er:

  • Operatorene "/", "//" og "[...]" brukes i xpath-uttrykk, som beskrevet ovenfor.
  • Unionsoperatør "|", som danner foreningen av to sett med noder.
  • De boolske operatorene "og" og "eller", sammen med funksjonen "ikke()".
  • Aritmetiske operatorer "+", "-", "*", "div" (divisjon) og "mod" (modul)
  • Sammenligningsoperator "=", "!=", "<", ">", "<=", ">="

Funksjonsbiblioteket inkluderer:

  • Funksjoner for å manipulere strenger: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
  • Funksjoner for å manipulere tall: sum(), rund(), gulv(), tak()
  • Funksjoner for å få egenskapene til en node: navn(), lokalnavn(), navneområde-uri()
  • Funksjoner for å få informasjon om behandlingskonteksten: posisjon(), siste()
  • Konverteringsfunksjoner: streng(), tall(), boolsk()

Noen av de mest brukte funksjonene er beskrevet nedenfor. [ 1 ]

Nodesettfunksjoner stilling() Returnerer et tall som representerer posisjonen til noden i sekvensen av noder som for øyeblikket behandles (for eksempel noden valgt av xsl:for-each-setningen i XSLT). telle ( node-sett ) returnerer antall noder i nodesettet som samsvarer med argumentet. Strengfunksjoner streng ( objekt ?) konverterer hvilken som helst av de 4 XPath-datatypene til en streng i henhold til konstruksjonsreglene. Hvis argumentverdien er et sett med noder, returnerer funksjonen en strengverdi som tilsvarer den første noden (i henhold til dokumentrekkefølgen), og ignorerer alle fremtidige noder. concat( string , string , string *) slå sammen 2 eller flere strenger starter-med( s1 , s2 ) returnerer truehvis den s1starter meds2 inneholder ( s1 , s2 ) returner truehvis s1inneholders2 delstreng ( streng , start , lengde ?) eksempel: substring("ABCDEF",2,3)retur "BCD". delstreng-før( s1 , s2 ) eksempel: substring-before("1999/04/01","/")retur1999 delstreng-etter( s1 , s2 ) eksempel: substring-after("1999/04/01","/")retur04/01 strenglengde (streng?) returnerer antall tegn i en streng normaliser-mellomrom ( streng ?) alle innledende og etterfølgende mellomromstegn vil bli fjernet, og enhver sekvens av mellomromstegn vil bli erstattet av et enkelt mellomrom. Dette er veldig nyttig når den originale XML-en kan ha blitt formatert for Pretty-printing , noe som kan gjøre videre strengbehandling upålitelig. Boolske funksjoner ikke ( boolsk ) opphever det boolske uttrykket. ekte() vurderes til sann . falsk() vurderes som falsk . Tallfunksjoner sum( node-sett ) konverterer strengverdiene til alle noder funnet av XPath-argumentet til tall, i henhold til de innebygde casting-reglene, og returnerer deretter summen av disse tallene.

Brukseksempel

Uttrykk kan opprettes i predikater ved å bruke operatorene: =, !=, <=, <, >=og >. Boolske uttrykk kan kombineres med parenteser ()og de boolske operatorene andog ori tillegg til funksjonen not()beskrevet ovenfor. Numerisk beregning kan bruke *, +, -, divog mod. Strenger kan bestå av Unicode- tegn .

//item[(SimboloArroba)price > 2*(SimboloArroba)discount]velger varene hvis prisattributt er større enn to ganger den numeriske verdien av rabattattributtet.

Hele nodesett kan kombineres med operatøren ( 'unioned' ) som består av rørkarakteren |. Nodesett som tilfredsstiller flere betingelser kan bli funnet ved å kombinere betingelsene i et predikat med ' or'.

v[x or y] | w[z]kan returnere et enkelt nodesett som består av alle elementer vsom har et underordnet element xeller y, samt alle elementer wsom har et underelement z, som ble funnet i gjeldende kontekst.

Eksterne lenker

  1. for den fullstendige beskrivelsen, se W3C-anbefalingsdokumentet .