XPath - XPath

XPath
Paradigme Forespørgselssprog
Udvikler W3C
Første gang dukkede op 1998
Stabil udgivelse
3.1 / 21. marts 2017 ; for 4 år siden ( 2017-03-21 )
Påvirket af
XSLT , XPointer
Påvirket
XML -skema , XForms

XPath ( XML Path Language ) er et forespørgselssprog til valg af noder fra et XML -dokument. Derudover kan XPath bruges til at beregne værdier (f.eks. Strenge , tal eller boolske værdier) ud fra indholdet af et XML -dokument. XPath blev defineret af World Wide Web Consortium (W3C).

Oversigt

XPath -sproget er baseret på en trærepræsentation af XML -dokumentet og giver mulighed for at navigere rundt i træet og vælge noder efter forskellige kriterier. I populær brug (dog ikke i den officielle specifikation) omtales et XPath -udtryk ofte blot som "en XPath".

Oprindeligt motiveret af et ønske om at tilvejebringe en fælles syntaks- og adfærdsmodel mellem XPointer og XSLT , bruges undersæt af XPath -forespørgselssproget i andre W3C -specifikationer såsom XML -skema , XForms og Internationalization Tag Set (ITS) .

XPath er blevet vedtaget af en række XML -behandlingsbiblioteker og -værktøjer, hvoraf mange også tilbyder CSS Selectors , en anden W3C -standard, som et enklere alternativ til XPath.

Versioner

Der er flere versioner af XPath i brug. XPath 1.0 blev udgivet i 1999, XPath 2.0 i 2007 (med en anden udgave i 2010), XPath 3.0 i 2014 og XPath 3.1 i 2017. XPath 1.0 er dog stadig den version, der er mest tilgængelig.

  • XPath 1.0 blev en anbefaling den 16. november 1999 og er bredt implementeret og brugt, enten alene (kaldet via en API fra sprog som Java , C# , Python eller JavaScript ) eller integreret i sprog som XSLT , XProc , XML Schema eller XForms.
  • XPath 2.0 blev en anbefaling den 23. januar 2007, med en anden udgave offentliggjort den 14. december 2010. Der findes en række implementeringer, men er ikke så udbredt som XPath 1.0. XPath 2.0 -sprogspecifikationen er meget større end XPath 1.0 og ændrer nogle af de grundlæggende begreber i sproget såsom typesystemet.
    Den mest bemærkelsesværdige ændring er, at XPath 2.0 er bygget op omkring XQuery og XPath Data Model (XDM), der har et meget rigere type system. Hver værdi er nu en sekvens (en enkelt atomværdi eller node betragtes som en sekvens med længde 1). XPath 1.0-nodesæt erstattes af nodesekvenser, som kan være i enhver rækkefølge.
    For at understøtte rigere type sæt tilbyder XPath 2.0 et stærkt udvidet sæt funktioner og operatører.
    XPath 2.0 er faktisk en delmængde af XQuery 1.0. De deler den samme datamodel ( XDM ). Det tilbyder et forudtryk, der er en nedskåret version af " FLWOR " -udtrykkene i XQuery. Det er muligt at beskrive sproget ved at angive de dele af XQuery, som det udelader: Hovedeksemplerne er forespørgselsprolog-, element- og attributkonstruktører, resten af ​​"FLWOR" -syntaksen og typeswitchudtrykket.
  • XPath 3.0 blev en anbefaling den 8. april 2014. Den mest betydningsfulde nye funktion er understøttelse af funktioner som førsteklasses værdier. XPath 3.0 er en undersæt af XQuery 3.0, og de fleste aktuelle implementeringer (april 2014) findes som en del af en XQuery 3.0 -motor.
  • XPath 3.1 blev en anbefaling den 21. marts 2017. Denne version tilføjer nye datatyper: kort og arrays, stort set til at understøtte understøttelse af JSON .
XPath -udtryk anvendes på en XML -fil

Syntaks og semantik (XPath 1.0)

Den vigtigste form for udtryk i XPath er en placeringssti . En placeringssti består af en sekvens af placeringstrin . Hvert placeringstrin har tre komponenter:

Et XPath -udtryk evalueres i forhold til en kontekstknude . En aksespecifikator, f.eks. 'Barn' eller 'efterkommer', angiver den retning, der skal navigeres fra kontekstnoden. Nodetesten og prædikatet bruges til at filtrere de noder, der er angivet af aksespecifikatoren: For eksempel kræver nodetesten 'A', at alle noder, der navigeres til, skal have etiketten 'A'. Et prædikat kan bruges til at angive, at de valgte noder har bestemte egenskaber, som er angivet af XPath -udtryk selv.

XPath -syntaksen findes i to varianter: den forkortede syntaks , er mere kompakt og gør det let at skrive og læse XPaths ved hjælp af intuitive og i mange tilfælde velkendte tegn og konstruktioner. Den fulde syntaks er mere omfattende , men giver mulighed for at angive flere muligheder og er mere beskrivende, hvis den læses omhyggeligt.

Forkortet syntaks

Den kompakte notation tillader mange standarder og forkortelser for almindelige sager. Givet kilde -XML, der indeholder mindst

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

den enkleste XPath har en form som f.eks

  • /A/B/C

der vælger C -elementer, der er børn af B -elementer, der er børn af A -elementet, der udgør det yderste element i XML -dokumentet. XPath-syntaksen er designet til at efterligne URI ( Uniform Resource Identifier ) og filsti- syntaks i Unix-stil .

Mere komplekse udtryk kan konstrueres ved at angive en anden akse end standard 'underordnet' akse, en anden nodetest end et simpelt navn eller prædikater, som kan skrives i firkantede parenteser efter ethvert trin. Eksempelvis udtrykket

  • A//B/*[1]

vælger det første barn (' *[1]'), uanset dets navn, for hvert B -element, der selv er et barn eller en anden, dybere efterkommer (' //') af et A -element, der er et barn af den aktuelle kontekstknude (udtrykket begynder ikke med et ' /'). Bemærk, at prædikatet [1]binder tættere end /operatøren. For at vælge den første knude, der er valgt af udtrykket A//B/*, skal du skrive (A//B/*)[1]. Bemærk også, indeksværdier i XPath -prædikater (teknisk set 'nærhedspositioner' for XPath -nodesæt) starter fra 1, ikke 0 som almindeligt på sprog som C og Java.

Udvidet syntaks

I den fulde, ikke -afkortede syntaks ville de to eksempler ovenfor blive skrevet

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

Her, i hvert trin i XPath, er aksen (f.eks. childEller descendant-or-self) eksplicit specificeret, efterfulgt af ::og derefter nodetesten , f.eks. AEller node()i eksemplerne ovenfor.

Her det samme, men kortere:

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

Akse specificatorer

Akse -angivere angiver navigationsretning inden for trærepræsentationen af ​​XML -dokumentet. De tilgængelige akser er:

Akse -specifikationer i XPath
Fuld syntaks Forkortet syntaks Noter
ancestor
ancestor-or-self
attribute @ @abc er forkortelse for attribute::abc
child xyz er forkortelse for child::xyz
descendant
descendant-or-self // // er forkortelse for /descendant-or-self::node()/
following
following-sibling
namespace
parent .. .. er forkortelse for parent::node()
preceding
preceding-sibling
self . . er forkortelse for self::node()

Som et eksempel på anvendelse af attributten akse i forkortet syntaks, //a/@hrefvælger attribut kaldet hrefi aelementer overalt i dokumentet træet. Udtrykket . (en forkortelse for self :: node () ) bruges mest inden for et prædikat til at henvise til den aktuelt valgte node. For eksempel h3[.='See also']vælger et element kaldet h3i den aktuelle kontekst, hvis tekstindhold er See also.

Nodetest

Nodetest kan bestå af specifikke nodenavne eller mere generelle udtryk. I tilfælde af et XML -dokument, hvor navneområdet gser defineret, //gs:enquiryfinder alle enquiryelementerne i det navneområde og //gs:*finder alle elementer, uanset det lokale navn, i det navneområde.

Andre node testformater er:

kommentar()
finder en XML -kommentarknude, f.eks <!-- Comment -->
tekst()
finder en knude af type tekst, f.eks. hello worldin<k>hello<m> world</m></k>
behandling-instruktion ()
finder XML -behandlingsinstruktioner som f.eks <?php echo $a; ?>. I dette tilfælde processing-instruction('php')ville matche.
node ()
finder overhovedet en node.

Forudsiger

Predikater, skrevet som udtryk i firkantede parenteser, kan bruges til at filtrere et node-sæt i henhold til nogle betingelser. For eksempel areturnerer et nodesæt (alle de aelementer, der er underordnede i kontekstnoden), og a[@href='help.php']bevarer kun de elementer, der har en hrefattribut med værdien help.php.

Der er ingen grænse for antallet af prædikater i et trin, og de behøver ikke at være begrænset til det sidste trin i en XPath. De kan også indlejres i enhver dybde. Stier, der er angivet i prædikater, begynder ved konteksten for det aktuelle trin (dvs. den umiddelbart forudgående nodetest) og ændrer ikke denne kontekst. Alle prædikater skal være tilfredse for at en kamp kan finde sted.

Når prædikatets værdi er numerisk, er det syntaktisk-sukker til sammenligning med nodens position i nodesættet (som givet af funktionen position()). Så p[1]er stenografi for p[position()=1]og vælger det første pelementbarn, mens det p[last()]er stenografi for p[position()=last()]og vælger det sidste pbarn i kontekstnoden.

I andre tilfælde konverteres prædikatets værdi automatisk til en boolean. Når prædikatet evalueres til et nodesæt, er resultatet sandt, når nodesættet ikke er tomt . Således p[@x]vælger de pelementer, der har en attribut navngivet x.

Et mere komplekst eksempel: udtrykket a[/html/@lang='en'][@href='help.php'][1]/@targetvælger værdien af targetattributten for det første aelement blandt børnene i kontekstnoden, der har sit hrefattribut sat til help.php, forudsat at dokumentets htmløverste niveauelement også har en langattribut sat til en. Henvisningen til en attribut for elementet på øverste niveau i det første prædikat påvirker hverken konteksten for andre prædikater eller selve lokalitetstrinnet.

Predikatrækkefølge er signifikant, hvis prædikater tester positionen af ​​en node. Hvert prædikat tager et node-sæt returnerer et (potentielt) mindre node-sæt. Så a[1][@href='help.php']vil kun finde en match, hvis det første abarn i kontekstnoden opfylder betingelsen @href='help.php', mens det a[@href='help.php'][1]vil finde det første abarn, der opfylder denne betingelse.

Funktioner og operatører

XPath 1.0 definerer fire datatyper: nodesæt (sæt noder uden egen rækkefølge), strenge, tal og booleans.

De tilgængelige operatører er:

  • Operatørerne "/", "//" og "[...]", der bruges i stiudtryk, som beskrevet ovenfor.
  • En fagforeningsoperatør, "|", som danner foreningen af ​​to nodesæt.
  • Boolske operatorer "og" og "eller" eller en funktion "ikke ()"
  • Aritmetiske operatorer "+", "-", "*", "div" (divider) og "mod"
  • Sammenligningsoperatorer "=", "! =", "<", ">", "<=", "> ="

Funktionsbiblioteket indeholder:

  • Funktioner til at manipulere strenge: concat (), substring (), indeholder (), substring-before (), substring-after (), translate (), normalize-space (), string-length ()
  • Funktioner til manipulation af tal: sum (), rund (), gulv (), loft ()
  • Funktioner til at få egenskaber for noder: navn (), lokalt navn (), navneområde-uri ()
  • Funktioner til at få oplysninger om behandlingskonteksten: position (), sidste ()
  • Type konverteringsfunktioner: string (), nummer (), boolsk ()

Nogle af de mere almindeligt nyttige funktioner er beskrevet detaljeret nedenfor.

Nodesæt funktioner

position()
returnerer et tal, der repræsenterer positionen for denne knude i sekvensen af ​​noder, der i øjeblikket behandles (f.eks. de noder, der er valgt af en xsl: for-hver instruktion i XSLT).
count ( node-set )
returnerer antallet af noder i det medfølgende nodesæt som sit argument.

String funktioner

streng ( objekt ?)
konverterer en af ​​de fire XPath-datatyper til en streng i henhold til de indbyggede regler. Hvis argumentets værdi er et node-sæt, returnerer funktionen strengværdien for den første node i dokumentrækkefølge og ignorerer yderligere noder.
konkat ( streng , streng , streng *)
sammenkæder to eller flere strenge
starter med ( s1 , s2 )
vender tilbage truehvis s1starter meds2
indeholder ( s1 , s2 )
returnerer truehvis s1indeholders2
substring ( streng , start , længde ?)
eksempel: substring("ABCDEF",2,3)returnerer "BCD".
substring-før ( s1 , s2 )
eksempel: substring-before("1999/04/01","/")returnerer1999
substring-after ( s1 , s2 )
eksempel: substring-after("1999/04/01","/")returnerer04/01
strenglængde (streng?)
returnerer antallet af tegn i strengen
normalize-space ( streng ?)
alt førende og efterfølgende mellemrum fjernes, og eventuelle sekvenser af mellemrumstegn erstattes af et enkelt mellemrum. Dette er meget nyttigt, når den originale XML muligvis er blevet formateret som en fin udskrift, hvilket kan gøre yderligere strengbehandling upålidelig.

Boolske funktioner

ikke ( boolsk )
negerer ethvert boolsk udtryk.
sand()
vurderer til sandt .
falsk()
vurderer til falsk .

Tal funktioner

sum ( node-sæt )
konverterer strengværdierne for alle de noder, der findes i XPath-argumentet, til tal i henhold til de indbyggede casting-regler og returnerer derefter summen af ​​disse tal.

Eksempler på brug

Udtryk kan oprettes inde i prædikater ved hjælp af operatorerne: =, !=, <=, <, >=og >. Boolske udtryk kan kombineres med beslag ()og boolske operatører andog orsamt not()funktion beskrevet ovenfor. Numeriske beregninger kan bruge *, +, -, divog mod. Strenge kan bestå af alle Unicode -tegn.

//item[@price > 2*@discount] vælger varer, hvis prisattribut er større end det dobbelte af den numeriske værdi af deres rabatattribut.

Hele node-sæt kan kombineres ( 'unioned' ) ved hjælp af det lodrette stregtegn |. Nodesæt, der opfylder en eller flere af flere betingelser, kan findes ved at kombinere betingelserne inde i et prædikat med ' or'.

v[x or y] | w[z]returnerer et enkelt node-sæt bestående af alle de velementer, der har xeller yunderordnede elementer, samt alle de welementer, der har zunderordnede elementer, som blev fundet i den aktuelle kontekst.

Syntaks og semantik (XPath 2.0)

Syntaks og semantik (XPath 3)

Eksempler

Givet et eksempel på XML -dokument

<?xml version="1.0" encoding="utf-8"?>
<Wikimedia>
  <projects>
    <project name="Wikipedia" launch="2001-01-05">
      <editions>
        <edition language="English">en.wikipedia.org</edition>
        <edition language="German">de.wikipedia.org</edition>
        <edition language="French">fr.wikipedia.org</edition>
        <edition language="Polish">pl.wikipedia.org</edition>
        <edition language="Spanish">es.wikipedia.org</edition>
      </editions>
    </project>
    <project name="Wiktionary" launch="2002-12-12">
      <editions>
        <edition language="English">en.wiktionary.org</edition>
        <edition language="French">fr.wiktionary.org</edition>
        <edition language="Vietnamese">vi.wiktionary.org</edition>
        <edition language="Turkish">tr.wiktionary.org</edition>
        <edition language="Spanish">es.wiktionary.org</edition>
      </editions>
    </project>
  </projects>
</Wikimedia>

XPath -udtrykket

/Wikimedia/projects/project/@name

vælger navneattributter for alle projekter og

/Wikimedia//editions

vælger alle udgaver af alle projekter, og

/Wikimedia/projects/project/editions/edition[@language='English']/text()

Vælger adresser på alle engelske Wikimedia projekter (tekst for alle edition elementer, hvor sprog attribut er lig med engelsk ). Og det følgende

/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()

vælger adresser på alle Wikipedier (tekst af alle udgaveelementer , der findes under projektelement med en navneattribut fra Wikipedia ).

Implementeringer

Kommandolinjeværktøjer

  • XMLStarlet brugervenligt værktøj til at teste/udføre XPath -kommandoer i farten.
  • xmllint (libxml2)
  • RaptorXML Server fra Altova understøtter XPath 1.0, 2.0 og 3.0
  • Xidel

C/C ++

Gratis Pascal

  • Enheden XPath er inkluderet i standardbibliotekerne

Implementeringer til databasemotorer

Java

Den Java -pakken javax.xml.xpathhar været en del af Java Standard Edition da Java 5 via Java API for XML Processing . Teknisk set er dette en XPath API frem for en XPath -implementering, og det giver programmereren mulighed for at vælge en specifik implementering, der er i overensstemmelse med grænsefladen.

JavaScript

.NET Framework

  • I navneområderne System.Xml og System.Xml.XPath
  • Sedna XML -database

Perl

PHP

  • Sedna XML -database
  • DOMXPath via libxml -udvidelse

Python

Rubin

Skema

  • Sedna XML -database

SQL

  • MySQL understøtter et delsæt af XPath fra version 5.1.5 og fremefter
  • PostgreSQL understøtter XPath og XSLT fra version 8.4 og fremefter

Tcl

  • TDOM -pakken giver en komplet, kompatibel og hurtig XPath -implementering i C

Brug på skemasprog

XPath bruges i stigende grad til at udtrykke begrænsninger på skemasprog for XML.

  • Det (nu ISO -standard ) skemasprog Schematron var banebrydende for metoden.
  • Et streamingundersæt af XPath bruges i W3C XML Schema 1.0 til at udtrykke entydighed og nøglebegrænsninger. I XSD 1.1 udvides brugen af ​​XPath til at understøtte betinget typetildeling baseret på attributværdier og for at tillade, at vilkårlige boolske påstande evalueres i forhold til elementernes indhold.
  • XForms bruger XPath til at binde typer til værdier.
  • Fremgangsmåden har endda fundet anvendelse i ikke -XML -applikationer, såsom kildekodeanalysatoren til Java kaldet PMD : Java'en konverteres til et DOM -lignende parsetræ, derefter defineres XPath -regler over træet.

Se også

Noter

Referencer

eksterne links