XPath

XPath
Paradigma Abfragesprache
Entwickler W3c
Erstmals erschienen 1998
Stabile Version
3.1 / 21. März 2017; vor 5 Jahren
Beeinflusst von
Xslt, Xpointer
Beeinflusst
XML -Schema, XForms

XPath (XML Pfadsprache) ist ein Ausdruckssprache Entwickelt, um die Abfrage oder Transformation von zu unterstützen Xml Unterlagen. Es wurde durch die definiert World Wide Web Konsortium (W3C)[1] und kann verwendet werden, um Werte zu berechnen (z. B.,, Saiten, Zahlen oder Boolesche Werte) aus dem Inhalt eines XML -Dokuments. Die Unterstützung für XPath gibt es in Anwendungen, die XML unterstützen, z. B. Webbrowser und viele Programmiersprachen.

Überblick

Die XPath -Sprache basiert auf einem Baumdarstellung des XML -Dokumentsund bietet die Möglichkeit, durch den Baum zu navigieren und Knoten nach einer Vielzahl von Kriterien auszuwählen.[2][3] Bei der populären Verwendung (wenn auch nicht in der offiziellen Spezifikation) wird ein XPath -Ausdruck oft einfach als "ein XPath" bezeichnet.

Ursprünglich motiviert durch den Wunsch, ein gemeinsames Syntax- und Verhaltensmodell dazwischen zu liefern Xpointer und Xslt, Untergruppen des XPaths Abfragesprache werden in anderen verwendet W3c Spezifikationen wie XML -Schema, XForms und die Internationalisierung Tag Set (ITS).

XPath wurde von einer Reihe von XML -Verarbeitungsbibliotheken und Tools übernommen, von denen viele auch bieten CSS -Selektoren, ein weiterer W3C -Standard, als einfachere Alternative zu XPath.

Versionen

Es gibt mehrere Versionen von XPath. XPath 1.0 wurde 1999, XPath 2.0 im Jahr 2007 (mit einer zweiten Ausgabe im Jahr 2010), XPath 3.0 im Jahr 2014 und XPath 3.1 im Jahr 2017 veröffentlicht. XPath 1.0 ist jedoch immer noch die Version, die am weitesten verbreitet ist.[1]

  • XPATH 1.0 wurde am 16. November 1999 Empfehlung und wird ausführlich umgesetzt und verwendet, entweder für sich allein (über eine API aus Sprachen wie z. Java, C#, Python oder JavaScript) oder in Sprachen eingebettet wie z. Xslt, Xproc, XML -Schema oder xForms.
  • XPath 2.0 wurde eine Empfehlung am 23. Januar 2007 mit einer zweiten Ausgabe am 14. Dezember 2010. Es gibt eine Reihe von Implementierungen, die jedoch nicht so weit verbreitet sind wie XPath 1.0. Die Sprachspezifikation von XPath 2.0 ist viel größer als XPath 1.0 und ändert einige der grundlegenden Konzepte der Sprache wie dem Typ -System.
    Die bemerkenswerteste Änderung ist, dass XPath 2.0 um die gebaut wird XQuery- und XPath -Datenmodell (XDM) Das hat ein viel reichhaltigeres Typsystem.[a] Jeder Wert ist jetzt eine Sequenz (ein einzelner Atomwert oder Knoten wird als Sequenz von Länge eins angesehen). XPATH 1.0-Knotenmengen werden durch Knotensequenzen ersetzt, die in beliebiger Reihenfolge sein können.
    Um reichhaltigere Typ -Sets zu unterstützen, bietet XPath 2.0 einen stark erweiterten Satz von Funktionen und Betreibern.
    XPath 2.0 ist in der Tat eine Teilmenge von XQuery 1.0. Sie teilen das gleiche Datenmodell (XDM). Es bietet a zum Ausdruck, der eine abgeschnittene Version des "ist"Flor"Ausdrücke in XQuery. Es ist möglich, die Sprache zu beschreiben, indem die Teile von XQuery, die sie auslässt TypSwitch Ausdruck.
  • XPath 3.0 wurde eine Empfehlung am 8. April 2014.[4] Die wichtigste neue Funktion ist die Unterstützung für Funktionen als erstklassige Werte.[5] XPATH 3.0 ist eine Teilmenge von XQuery 3.0, und die meisten aktuellen Implementierungen (April 2014) existieren als Teil einer XQuery 3.0 -Engine.
  • XPath 3.1 wurde am 21. März 2017 Empfehlung.[6] Diese Version fügt neue Datentypen hinzu: Karten und Arrays, hauptsächlich zur Unterstützung der Unterstützung für JSON.
XPath -Ausdruck, der auf eine XML -Datei angewendet wird

Syntax und Semantik (XPath 1.0)

Die wichtigste Art von Ausdruck in XPath ist a Standortpfad. Ein Ortpfad besteht aus einer Sequenz von Standortschritte. Jeder Standortschritt hat drei Komponenten:

Ein XPath -Ausdruck wird in Bezug auf a bewertet Kontextknoten. Ein Achsenspezifizierer wie "Kind" oder "Nachkommen" gibt die Richtung an, um vom Kontextknoten zu navigieren. Der Knotentest und das Prädikat werden verwendet, um die vom Achsenspezifizierer angegebenen Knoten zu filtern: Zum Beispiel erfordert der Knotentest 'A', dass alle Knoten nach dem Kennzeichnung "a" navigiert werden müssen. Ein Prädikat kann verwendet werden, um anzugeben, dass die ausgewählten Knoten bestimmte Eigenschaften haben, die durch XPath -Ausdrücke selbst angegeben werden.

Die XPath -Syntax ist in zwei Geschmacksrichtungen erhältlich: die abgekürzte Syntax, ist kompakter und ermöglicht es XPaths, mit intuitiven und in vielen Fällen vertraute Charaktere und Konstrukte leicht zu schreiben und zu lesen. Das Vollständige Syntax ist ausführlicher, ermöglicht jedoch, dass mehr Optionen angegeben werden und ist beschreibender, wenn sie sorgfältig gelesen werden.

Abgekürzte Syntax

Die kompakte Notation ermöglicht viele Standardeinstellungen und Abkürzungen für gemeinsame Fälle. Gegebene Quelle XML mit mindestens

Der einfachste XPath nimmt eine Form an, wie z.

  • /ABC

Das wählt C -Elemente aus, die Kinder von B -Elementen sind, die Kinder des A -Elements sind, das das äußerste Element des XML -Dokuments bildet. Die XPath -Syntax ist so konzipiert, dass sie URI nachahmen ((Einheitliche Ressourcenkennung) und Dateipfad im Unix-Stil Syntax.

Komplexere Ausdrücke können konstruiert werden, indem eine andere Achse als die Standard -Child -Achse, ein anderes Knotentest als einen einfachen Namen oder Prädikate, die nach jedem Schritt in quadratischen Klammern geschrieben werden können, angeben. Zum Beispiel der Ausdruck

  • A // b/*[1]

Wählt das erste Kind ('aus*[1]'), was auch immer sein Name, jedes B -Elements, das selbst ein Kind oder einen anderen, tieferen Nachkomme ist ('//') eines ein Elements, das ein Kind des aktuellen Kontextknotens ist (der Ausdruck beginnt nicht mit einem'/'). Beachten Sie, dass das Prädikat [1] bindet enger als die / Operator. So wählen Sie den ersten Knoten aus, der vom Ausdruck ausgewählt wurde A // b/*, schreiben (A // b/*) [1]. Beachten Sie auch, dass Indexwerte in XPath -Prädikaten (technisch gesehen "Proximity -Positionen" von XPath -Knotensätzen) von 1 beginnen, nicht 0 als häufig in Sprachen wie C und Java.

Erweiterte Syntax

In der vollen, unvergleichlichen Syntax würden die beiden oben genannten Beispiele geschrieben

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

Hier in jedem Schritt des XPaths die Achse (z.B. Kind oder Nachkommen-or-Selbst) wird explizit spezifiziert, gefolgt von :: und dann die Knotentest, wie zum Beispiel A oder Knoten() In den obigen Beispielen.

Hier gleich, aber kürzer: A//B/*[position()=1]

Achsenspezifizierer

Achsenspezifizierer geben die Navigationsrichtung innerhalb der Baumpräsentation des XML -Dokuments an. Die verfügbaren Äxte sind:[b]

Achsenspezifizierer in XPath
Vollständige Syntax Abgekürzte Syntax Anmerkungen
ancestor
ancestor-or-self
attribute @ @abc ist kurz für attribute::abc
child xyz ist kurz für child::xyz
descendant
descendant-or-self // // ist kurz für /descendant-or-self::node()/
following
following-sibling
namespace
parent .. .. ist kurz für parent::node()
preceding
preceding-sibling
self . . ist kurz für self::node()

Als Beispiel für die Verwendung der Verwendung der Attribut Achse in abgekürzten Syntax, // a/@href Wählt das aufgerufene Attribut aus href in a Elemente überall im Dokumentbaum. Der Ausdruck . (eine Abkürzung für Selbst :: node ()) wird am häufigsten innerhalb eines Prädikats verwendet, um sich auf den aktuell ausgewählten Knoten zu beziehen. Zum Beispiel, H3 [. = 'Siehe auch'] wählt ein Element auf, das aufgerufen wurde H3 Im aktuellen Kontext, dessen Textinhalt ist Siehe auch.

Knotentests

Knotentests können aus spezifischen Knotennamen oder allgemeineren Ausdrücken bestehen. Im Falle eines XML -Dokuments, in dem das Namespace -Präfix gs Wurde definiert, // GS: Anfrage wird alle finden Anfrage Elemente in diesem Namespace und // gs:* Findet in diesem Namespace alle Elemente, unabhängig vom lokalen Namen.

Andere Knoten -Testformate sind:

Kommentar()
Findet einen XML -Kommentarknoten, z.
Text()
Findet einen Knoten von Typ Text ohne Kinder, z. das hallo in hallo Welt
Verarbeitungsinstruktion ()
Findet XML Verarbeitungsanweisungen wie zum Beispiel . In diesem Fall, Verarbeitungsinstruktion ('PHP') würde übereinstimmen.
Knoten()
Findet überhaupt einen Knoten.

Prädikate

Prädikate, die als Ausdrücke in quadratischen Klammern geschrieben wurden, können verwendet werden Filter ein Knotensatz gemäß einer Bedingung. Zum Beispiel, a Gibt einen Knotensatz zurück (alle a Elemente, die Kinder des Kontextknotens sind) und a[@href='help.php'] hält nur die Elemente mit einer href Attribut mit dem Wert help.php.

Die Anzahl der Prädikate in einem Schritt ist keine Begrenzung und sie müssen nicht auf den letzten Schritt in einem XPath beschränkt sein. Sie können auch in jede Tiefe verschachtelt werden. Die in Prädikaten angegebenen Pfade beginnen im Kontext des aktuellen Schritts (d. H. dem des unmittelbar vorhergehenden Knotentests) und ändern diesen Kontext nicht. Alle Prädikate müssen zufrieden sein, damit ein Match auftritt.

Wenn der Wert des Prädikats numerisch ist, ist es syntaktisch-sugar zum Vergleich mit der Position des Knotens im Knotensatz (wie durch die Funktion angegeben Position()). So P [1] ist Kurzschrift für p[position()=1] und wählt die erste aus p Element Child während p [last ()] ist Kurzschrift für p[position()=last()] und wählt das letzte aus p Kind des Kontextknotens.

In anderen Fällen wird der Wert des Prädikats automatisch in einen Booleschen umgewandelt. Wenn das Prädikat an einem Knotensatz bewertet wird, ist das Ergebnis wahr, wenn der Knotensatz ist nicht leer[klären]. Daher P [@x] wählt diese aus p Elemente, die ein Attribut namens haben x.

Ein komplexeres Beispiel: der Ausdruck a[/html/@lang='en'][@href='help.php'][1]/@target wählt den Wert der aus Ziel Attribut des ersten a Element unter den Kindern des Kontextknotens, der seine hat href Attribut festgelegt auf help.php, bereitgestellt das Dokument html Top-Level-Element hat auch a Lang Attribut festgelegt auf en. Der Verweis auf ein Attribut des Elements der obersten Ebene im ersten Prädikat beeinflusst weder den Kontext anderer Prädikate noch den des Standortschrittes selbst.

Die Prädikatreihenfolge ist signifikant, wenn Prädikate die Position eines Knotens testen. Jedes Prädikat nimmt einen Knotensatz ein, das ein (möglicherweise) kleinerer Knotensatz zurückgibt. So a[1][@href='help.php'] findet nur ein Match, wenn das erste a Kind des Kontextknotens erfüllt die Bedingung @href = 'help.php', während a[@href='help.php'][1] Ich werde den ersten finden a Kind, das diesen Zustand erfüllt.

Funktionen und Betreiber

XPath 1.0 definiert vier Datentypen: Knotenmengen (Sätze von Knoten ohne intrinsische Reihenfolge), Zeichenfolgen, Zahlen und Booleschen.

Die verfügbaren Betreiber sind:

  • Das /, // und [...] Operatoren, wie oben beschrieben in Pfadausdrücken verwendet.
  • Ein Gewerkschaftsbetreiber, |, was die Vereinigung von zwei Knotenmengen bildet.
  • boolesche Operatoren and und orund eine Funktion not()
  • Rechenzeichen +, -, *, div (teilen) und mod
  • Vergleichsoperatoren =, !=, <, >, <=, >=

Die Funktionsbibliothek umfasst:

  • Funktionen zur Manipulation von Saiten: concat (), substring (), enthält (), substring-beeforen (), substring-achter (), translate (), Normalize-space (), String-Length ()
  • Funktionen zur Manipulation von Zahlen: Sum (), Round (), Floor (), Decke ()
  • Funktionen, um Eigenschaften von Knoten zu erhalten: name (), lokal-name (), namespace-uri ()
  • Funktionen, um Informationen über den Verarbeitungskontext zu erhalten: Position (), last ()
  • Tippen Sie Konvertierungsfunktionen ein: string (), number (), boolean ()

Einige der am häufigsten nützlichen Funktionen sind unten detailliert.[c]

Knotensatzfunktionen

Position()
Gibt eine Zahl zurück, die die Position dieses Knotens in der Folge der derzeit verarbeiteten Knoten darstellt (z. B. die von einem XSL: For-Each-Anweisungen in XSLT ausgewählten Knoten).
zählen(Knotenset)
Gibt die Anzahl der Knoten im Knotensatz zurück, das als Argument geliefert wird.

String -Funktionen

String (Objekt?)
Konvertiert einen der vier XPath-Datentypen gemäß den integrierten Regeln in eine Zeichenfolge. Wenn der Wert des Arguments ein Knotensatz ist, gibt die Funktion den Stringwert des ersten Knotens in Dokumentreihenfolge zurück und ignoriert weitere Knoten.
concat (Saite, Saite, Saite*)
verkettet Zwei oder mehr Saiten
beginnt mit(S1, S2)
kehrt zurück Stimmt wenn S1 beginnt mit S2
enthält (S1, S2)
kehrt zurück Stimmt wenn S1 enthält S2
Substring (Saite, Anfang, Länge?)
Beispiel: Substring ("Abcdef", 2,3) kehrt zurück BCD.
Substring-vor (S1, S2)
Beispiel: Substring-vorne ("1999/04/01", "/") kehrt zurück 1999
Substring (S1, S2)
Beispiel: Substring-After ("1999/04/01", "/") kehrt zurück 04/01
String-Länge (Zeichenfolge?)
Gibt die Anzahl der Zeichen in String zurück
Space normalisieren (Saite?)
alle führend und nachlaufend Whitespace wird entfernt und alle Sequenzen von Whitespace -Zeichen werden durch einen einzelnen Raum ersetzt. Dies ist sehr nützlich, wenn der ursprüngliche XML möglicherweise gewesen ist PrettyPrint formatiert, was eine weitere String -Verarbeitung unzuverlässig machen könnte.

Boolesche Funktionen

nicht(Boolesche)
negiert jeden booleschen Ausdruck.
Stimmt()
bewertet Stimmt.
FALSCH()
bewertet FALSCH.

Zahlenfunktionen

Summe(Knotenset)
Konvertiert die Stringwerte aller vom XPath-Argument gefundenen Knoten gemäß den integrierten Gussregeln in Zahlen und gibt dann die Summe dieser Zahlen zurück.

Verwendungsbeispiele

Ausdrücke können in Prädikaten mit den Operatoren erstellt werden: =,! =, <=, <,> = und >. Boolesche Ausdrücke können mit Klammern kombiniert werden () und die Booleschen Betreiber und und oder ebenso wie nicht() oben beschriebene Funktion. Numerische Berechnungen können verwenden *, +, -, div und Mod. Saiten können aus jedem bestehen Unicode Figuren.

//item[@price > 2*@discount] Wählt Artikel aus, deren Preisattribut größer als doppelt so hoch ist wie der numerische Wert ihres Rabattattributs.

Ganze Knotenmengen können kombiniert werden ("Gewerkschaftlich") unter Verwendung des vertikalen Balkenzeichens |. Knotensätze, die eine oder mehrere von mehreren Bedingungen erfüllen, finden Sie durch die Kombination der Bedingungen innerhalb eines Prädikats mit ''oder'.

v [x oder y] | w [z] Gibt einen einzelnen Knotensatz zurück, der aus allen besteht v Elemente, die haben x oder y Kinderelemente sowie alle die w Elemente, die haben z Kinderelemente, die im aktuellen Kontext gefunden wurden.

Syntax und Semantik (XPath 2.0)

Syntax und Semantik (XPath 3)

Beispiele

Bei einem Beispiel XML -Dokument

      Name ="Wikipedia" starten ="2001-01-05">     Sprache ="Englisch">en.wikipedia.org   Sprache ="Deutsch">De.wikipedia.org   Sprache ="Französisch">fr.wikipedia.org   Sprache ="Polieren">pl.wikipedia.org   Sprache ="Spanisch">Es.wikipedia.org       Name ="Wiktionär" starten ="2002-12-12">     Sprache ="Englisch">en.wiktionary.org   Sprache ="Französisch">fr.wiktionary.org   Sprache ="Vietnamesisch">vi.wiktionary.org   Sprache ="Türkisch">tr.wiktionary.org   Sprache ="Spanisch">Es.wiktionary.org        

Der XPath -Ausdruck

/Wikimedia/Projekte/Projekt/@Name

wählt Namensattribute für alle Projekte aus, und

/Wikimedia // Editionen

wählt alle Ausgaben aller Projekte aus, und

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

Wählt Adressen aller englischen Wikimedia -Projekte aus (Text von allen Auflage Elemente wo Sprache Attribut ist gleich zu Englisch). Und die folgende

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

wählt Adressen aller Wikipedias aus (Text von allen Auflage Elemente, die unter existieren Projekt Element mit einem Namensattribut von Wikipedia).

Implementierungen

Befehlszeilenwerkzeuge

  • Xmlstarlet Einfach zu verwenden, um XPath -Befehle im laufenden Flug zu testen/auszuführen.
  • xmllint (libxml2)
  • Der RaptorxML -Server von Altova unterstützt XPath 1.0, 2.0 und 3.0
  • Xidel

C/C ++

Kostenloser Pascal

  • Das Gerät XPath ist in den Standardbibliotheken enthalten

Implementierungen für Datenbankmotoren

Java

Das Java Paket javax.xml.xpath ist seit Java 5 Teil der Java Standard Edition[8] über die Java -API für die XML -Verarbeitung. Technisch ist dies ein XPath API Anstelle einer XPath -Implementierung und ermöglicht dem Programmierer die Möglichkeit, eine bestimmte Implementierung auszuwählen, die der Schnittstelle entspricht.

JavaScript

.NET Framework

  • Im system.xml und system.xml.xpath Namespaces[9]
  • Sedna XML -Datenbank

Perl

Php

  • Sedna XML -Datenbank
  • DomxPath Über libxml Erweiterung

Python

Rubin

Planen

  • Sedna XML -Datenbank

Sql

  • Mysql Unterstützt ab Version 5.1.5 eine Teilmenge von XPath[11]
  • PostgreSQL Unterstützt XPath und XSLT ab Version 8.4[12]

Tcl

  • Das TDOM -Paket bietet eine vollständige, konforme und schnelle XPath -Implementierung in C.[13]

Verwendung in Schemasprachen

XPath wird zunehmend verwendet, um Einschränkungen in Schemasprachen für XML auszudrücken.

  • Das jetzt ISO -Standard) Schemasprache Schematron Pionierarbeit den Ansatz.
  • Eine Streaming -Teilmenge von XPath wird in W3C XML Schema 1.0 verwendet, um Einzigartigkeit und wichtige Einschränkungen auszudrücken. In XSD 1.1 wird die Verwendung von XPath erweitert, um die bedingte Typzuweisung basierend auf Attributwerten zu unterstützen und um beliebige boolesche Behauptungen gegen den Inhalt der Elemente zu bewerten.
  • XForms verwendet XPath, um Typen an Werte zu binden.
  • Der Ansatz hat sogar in Nicht-XML-Anwendungen verwendet PMD: Die Java wird zu a konvertiert Dom-ähnlich an Parse Tree, dann werden XPath -Regeln über dem Baum definiert.

Siehe auch

Anmerkungen

  1. ^ XPath 2.0 unterstützt Atomtypen, definiert als eingebaute Typen in XML -Schemaund kann auch benutzerdefinierte Typen aus einem Schema importieren.
  2. ^ XML Authority Normal Walsh hat eine hervorragende Online -Visualisierung der Achsenspezifizierer.[7] Es erscheint aus der Abbildung, dass Vorher, Vorfahr, selbst, Nachfahre, und folgen Form einer vollständigen, nicht überlappenden Partition des Dokumentelementbaums.
  3. ^ Eine vollständige Beschreibung finden Sie unter Das W3C -Empfehlungsdokument.

Verweise

  1. ^ a b "XML und Semantic Web W3C Standards Timeline" (PDF). 2012-02-04.
  2. ^ Bergeron, Randy (2000-10-31). "XPath - Erfahren Sie Knoten aus einem XML -Dokument". SQL Server Magazine. Archiviert von das Original Am 2010-07-26. Abgerufen 2011-02-24.
  3. ^ Pierre Geneves (2012). "Kurs: Die XPath -Sprache" (PDF).
  4. ^ "XML Path Language (XPath) 3.0". World Wide Web Consortium (W3C). 2014-04-02. Abgerufen 2021-07-16.
  5. ^ Kay, Michael (2012-02-10). "Was ist neu in 3.0 (XSLT/XPath/XQuery) (plus XML -Schema 1.1)" (PDF). XML Prag 2012. Abgerufen 2021-07-16.
  6. ^ "XML Path Language (XPath) 3.1". World Wide Web Consortium (W3C). 2017-03-21. Abgerufen 2021-07-16.
  7. ^ Walsh, Norman (1999). "Achsenspezifizierer". nwalsh.com. Persönlicher Blog des verehrten XML Sage Graybeard. Abgerufen 2021-02-25.
  8. ^ "javax.xml.xpath (Java SE 10 & JDK 10)". Java® Platform, Standard Edition & Java Development Kit Version 10 API -Spezifikation. Abgerufen 2021-07-17. Da: 1.5
  9. ^ "System.xml Namespace". Microsoft Docs. 2020-10-25. Abgerufen 2021-07-16.
  10. ^ Duke, Justin (2016-09-29). "Wie man eine Webseite mit Scrapy und Python 3 kriecht". Digitaler Ozean. Abgerufen 2017-11-24. Selektoren sind Muster, mit denen wir ein oder mehrere Elemente auf einer Seite finden können, damit wir mit den Daten innerhalb des Elements arbeiten können. Scrapy unterstützt entweder CSS -Selektoren oder XPath -Selektoren.
  11. ^ "MySQL :: Mysql 5.1 Referenzhandbuch :: 12.11 XML Funktionen". dev.mysql.com. 2016-04-06. Archiviert vom Original am 2016-04-06. Abgerufen 2021-07-17.{{}}: CS1 Wartung: Ungeeignete URL (Link)
  12. ^ "xml2". PostgreSQL -Dokumentation. 2014-07-24. Abgerufen 2021-07-16.
  13. ^ Loewer, Jochen (2000). "TDOM - Ein schnelles XML/DOM/XPath -Paket für TCL, das in C geschrieben wurde" (PDF). Proceedings des ersten europäischen TCL/TK -Nutzertreffens. Abgerufen 16. Juli 2021.

Externe Links