XPath - XPath
Paradigme | Forespørgselssprog |
---|---|
Udvikler | W3C |
Første gang dukkede op | 1998 |
Stabil udgivelse | 3.1 / 21. marts 2017
|
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
for
udtryk, 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 ogtypeswitch
udtrykket.
- 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 .
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:
- en akse
- en nodetest
- nul eller flere prædikater .
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. child
Eller descendant-or-self
) eksplicit specificeret, efterfulgt af ::
og derefter nodetesten , f.eks. A
Eller 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:
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/@href
vælger attribut kaldet href
i a
elementer 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 h3
i 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 gs
er defineret, //gs:enquiry
finder alle enquiry
elementerne 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 world
in<k>hello<m> world</m></k>
- behandling-instruktion ()
- finder XML -behandlingsinstruktioner som f.eks
<?php echo $a; ?>
. I dette tilfældeprocessing-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 a
returnerer et nodesæt (alle de a
elementer, der er underordnede i kontekstnoden), og a[@href='help.php']
bevarer kun de elementer, der har en href
attribut 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 p
elementbarn, mens det p[last()]
er stenografi for p[position()=last()]
og vælger det sidste p
barn 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 p
elementer, der har en attribut navngivet x
.
Et mere komplekst eksempel: udtrykket a[/html/@lang='en'][@href='help.php'][1]/@target
vælger værdien af target
attributten for det første a
element blandt børnene i kontekstnoden, der har sit href
attribut sat til help.php
, forudsat at dokumentets html
øverste niveauelement også har en lang
attribut 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 a
barn i kontekstnoden opfylder betingelsen @href='help.php'
, mens det a[@href='help.php'][1]
vil finde det første a
barn, 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
true
hviss1
starter meds2
- indeholder ( s1 , s2 )
- returnerer
true
hviss1
indeholders2
- 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 and
og or
samt not()
funktion beskrevet ovenfor. Numeriske beregninger kan bruge *, +, -, div
og 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 v
elementer, der har x
eller y
underordnede elementer, samt alle de w
elementer, der har z
underordnede 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
- Saxon XSLT understøtter XPath 1.0, XPath 2.0 og XPath 3.0 (samt XSLT 2.0, XQuery 3.0 og XPath 3.0)
- BaseX (understøtter også XPath 2.0 og XQuery)
- VTD-XML
- Sedna XML -database Både XML: DB og proprietær.
- QuiXPath en streaming open source -implementering af Innovimax
- Xalan
- Dom4j
Den Java
-pakken javax.xml.xpath
har 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
- jQuery XPath-plugin baseret på Open-source XPath 2.0-implementering i JavaScript
- FontoXPath Open source XPath 3.1 -implementering i JavaScript. I øjeblikket under udvikling.
.NET Framework
- I navneområderne System.Xml og System.Xml.XPath
- Sedna XML -database
Perl
- XML :: LibXML (libxml2)
PHP
- Sedna XML -database
- DOMXPath via libxml -udvidelse
Python
- Den ElementTree XML API i Python Standard Library indeholder begrænset støtte til XPath udtryk
- libxml2
- Amara
- Sedna XML -database
- lxml
- Skrap
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
- XPath 1.0 -specifikation
- XPath 2.0 -specifikation
- XPath 3.0 -specifikation
- XPath 3.1 -specifikation
- Hvad er nyt i XPath 2.0
- XPath Reference (MSDN)
- XPath -udtrykssyntaks (saksisk)
- XPath 2.0 Expression Syntax (Saxon) , [1]
- XPath - MDC Docs af Mozilla Developer Network
- XPath introduktion/tutorial
- XSLT og XPath funktionsreference