close

XPath

Zur Navigation gehen Zur Suche gehen
Diagramm Sederhana XPath.png

XPath ( XML Path Language ) ist eine Sprache, mit der Sie Ausdrücke erstellen können, die ein XML-Dokument durchlaufen und verarbeiten. Die Idee ist ähnlich wie bei regulären Ausdrücken , um Teile eines Textes ohne Attribute ( einfacher Text ) auszuwählen. XPath ermöglicht die Suche und Auswahl unter Berücksichtigung der hierarchischen Struktur des XML. XPath wurde für die Verwendung im XSLT -Standard erstellt , wo es verwendet wird, um die Eingabedokumentstruktur der Transformation auszuwählen und zu untersuchen. XPath wurde vom W3C- Konsortium definiert .

Einführung

Alle mit einer XML-Datei durchgeführten Verarbeitungen basieren auf der Möglichkeit, jeden der Teile, aus denen sie besteht, zu adressieren oder darauf zuzugreifen, so dass wir jedes der Elemente unterschiedlich behandeln können.

Die Behandlung der XML-Datei beginnt mit der Lokalisierung derselben im gesamten Satz bestehender Dokumente in der Welt. Um diese Ortung eindeutig durchzuführen, werden URIs (Uniform Resource Identifiers) verwendet, von denen URLs (Uniform Resource Locators) zweifellos die bekanntesten sind.

Sobald das XML-Dokument gefunden wurde, können darin enthaltene Informationen mithilfe von XPath ausgewählt werden, was die Abkürzung für die sogenannte XML Path Language ist. Mit XPath können wir Text, Elemente, Attribute und alle anderen Informationen, die in einer XML-Datei enthalten sind, auswählen und darauf verweisen.

XPath selbst ist eine anspruchsvolle und komplexe Sprache, unterscheidet sich jedoch von den prozeduralen Sprachen, die wir normalerweise verwenden (C, C++, Basic, Java...). Darüber hinaus befindet es sich, wie fast alles in der Welt von XML, noch in einem Entwicklungsstadium, sodass es nicht einfach ist, Tools zu finden, die alle seine Funktionalitäten beinhalten.

XPath wiederum ist die Basis, auf der neue Tools spezifiziert wurden, die sich diesen für die Behandlung von XML-Dokumenten zunutze machen. Tools wie XPointer, XLink und XQuery (die Sprache, die XML-Dokumente wie eine Datenbank behandelt). So wird XPath verwendet, um zu sagen, wie ein Stylesheet den Inhalt einer XML-Seite verarbeiten soll, aber auch, um in einem Browser Links setzen oder bestimmte Bereiche einer XML-Seite statt der gesamten Seite laden zu können.

Das XPath-Datenmodell

Ein XML-Dokument wird von einem Parser (oder Parser) verarbeitet, der einen Knotenbaum erstellt. Dieser Baum beginnt mit einem Wurzelelement, verzweigt sich durch die daran hängenden Elemente und endet mit Blattknoten, die nur Text, Kommentare, Verarbeitungsanweisungen enthalten oder sogar leer sind und nur Attribute haben.

Die Art und Weise, wie XPath Teile des XML-Dokuments auswählt, basiert genau auf der generierten Baumdarstellung des Dokuments. Tatsächlich erinnern uns die „Operatoren“, aus denen diese Sprache besteht, an die Terminologie, die verwendet wird, wenn man in der Informatik über Bäume spricht: Wurzel, Kind, Vorfahre, Nachkomme usw.

Ein Sonderfall von Knoten sind Attributknoten. Ein Knoten kann beliebig viele Attribute haben, und für jedes wird ein Attributknoten erstellt. Diese Attributknoten werden jedoch NICHT als ihre Kinder betrachtet, sondern als Tags, die dem Elementknoten hinzugefügt werden.

Unten sehen Sie ein Beispiel dafür, wie ein XML-Dokument in einen Baum konvertiert wird. Dasselbe Beispiel wird im gesamten Tutorial verwendet. Das XML-Dokument wird zuerst angezeigt, gefolgt von der Baumstruktur, die es generiert.

XML-Dokument  :

  <Buch>
  
    <title>Zwei mal drei Straßen</title>
  
    <Autor>Josefa Santos</Autor>
  
    <Kapitelnummer="1">
       Die erste Straße
   
      <Absatz>
        Es war eine düstere Nacht im August...
      </paragraph>
    
      <paragraph highlight="ja">
         Sie, unschuldig wie
         <link href="link">Schmetterling</link>
         der den Himmel auf der Suche nach Trankopfern durchquert ...
      </paragraph>
  
    </Kapitel>
  
    <Kapitel num="2" public="ja">
      Die zweite Straße
  
      <Absatz>
         Es war eine dunkle Nacht im September...
      </paragraph>
  
      <Absatz>
         Sie, unschuldig wie
         <link href="link">Biene</link>
         die den Wind durchquert auf der Suche nach dem Nektar der Blumen...
      </paragraph>
  
    </Kapitel>
  
    <Anhang num="a" public="ja">
      die dritte Straße
  
      <Absatz>
         Es war eine dichte Dezembernacht...
      </paragraph>
  
      <Absatz>
         Sie, offen wie
         <link href="link">Biene</link>
         die den Raum durchquert auf der Suche nach Lebewesen zum Fressen...
      </paragraph>
    </anhang>
  </Buch>

Generierter Baum :

/
 +---buchen
       |
       +---Titel
       | |
       | +---(Text)Zwei mal drei Fahrspuren
       |
       +---Autor
       | |
       | +---(Text) Josefa Santos
       |
       +---Kapitel [num=1]
       | |
       | +---(text)Die erste Straße
       | |
       | +---Absatz
       | | |
       | | +---(text)Es war eine düstere Nacht...
       | |     
       | +---Absatz [highlight=yes]
       | |
       | +---(text) Sie, wie unschuldig
       | |
       | +---link [href=link]
       | | |
       | | +---(Text)Schmetterling
       | |
       | +---(Text), der auf der Suche nach Trankopfern den Himmel durchquert...
       |
       +---Kapitel [num=2, öffentlich=ja]
              |
              +---(Text)Zweite Straße
              |
              +---Absatz
              | |
              | +---(text)Es war eine dunkle Nacht...
              |     
              +---Absatz
                    |
                    +---(text) Sie, wie eine unschuldige Biene...


Knotentypen

Es gibt verschiedene Arten von Knoten in einem Baum aus einem XML-Dokument, nämlich: Wurzel, Element, Attribut, Text, Kommentar und Verarbeitungsanweisung (bzw. Wurzel, Elemente, Attribut, Text, Kommentar und Verarbeitungsanweisung). All dies ist sehr vorteilhaft.

Root-Knoten

Es wird durch / gekennzeichnet. Der Wurzelknoten sollte nicht mit dem Wurzelelement des Dokuments verwechselt werden. Wenn also das XML-Dokument in unserem Beispiel book als Root-Element hat, ist dies der erste Knoten, der am Root-Knoten des Baums hängt, also: /.

Ich bestehe darauf: / bezieht sich auf den Wurzelknoten des Baums, aber nicht auf das Wurzelelement des XML-Dokuments, obwohl ein XML-Dokument nur ein Wurzelelement haben kann. Tatsächlich können wir sagen, dass der Wurzelknoten des Baums das Wurzelelement des Dokuments enthält.

Elementknoten

Jedes Element in einem XML-Dokument wird zu einem Elementknoten innerhalb des Baums. Jedes Element hat seinen übergeordneten Knoten. Der Elternknoten jedes Elements ist selbst ein Element, mit Ausnahme des Wurzelelements, dessen Elternteil der Wurzelknoten ist. Die Elementknoten wiederum haben Kinder, nämlich: Elementknoten, Textknoten, Kommentarknoten und Verarbeitungsanweisungsknoten. Elementknoten haben auch Eigenschaften wie ihren Namen, ihre Attribute und Informationen über die "Namespaces", die sie aktiv haben.

Eine interessante Eigenschaft von Elementknoten ist, dass sie eindeutige Bezeichner haben können (dazu müssen sie von einer DTD begleitet werden, die angibt, dass diese Attribute eindeutige Werte annehmen), wodurch auf diese Elemente viel direkter verwiesen werden kann.

Textknoten

Mit Text beziehen wir uns auf alle Zeichen im Dokument, die nicht mit einem Tag gekennzeichnet sind. Ein Textknoten hat keine Kinder, das heißt, die verschiedenen Zeichen, die ihn bilden, werden nicht als seine Kinder betrachtet.

Attributknoten

Wie wir bereits angedeutet haben, sind die Attributknoten nicht so sehr Kinder des Elementknotens, der sie enthält, als Labels, die zu diesem Elementknoten hinzugefügt werden. Jeder Attributknoten besteht aus einem Namen, einem Wert (der immer eine Zeichenkette ist) und einem möglichen „Namensraum“.

Diejenigen Attribute, deren Wert der in der DTD zugewiesene Standardwert ist, werden so behandelt, als wäre ihnen der Wert beim Schreiben des XML-Dokuments zugewiesen worden. Im Gegensatz dazu wird kein Knoten für Attribute erstellt, die nicht im XML-Dokument angegeben sind und für die die #IMPLIED- Eigenschaft in ihrer DTD definiert ist. Auch werden keine Attributknoten für Namespace-Definitionen erstellt. All dies ist normal, wenn wir berücksichtigen, dass es nicht notwendig ist, eine DTD zu haben, um ein XML-Dokument zu verarbeiten.

Kommentar- und Prozessanweisungsknoten

Neben den angegebenen Knoten werden im Baum zu jedem Knoten auch Knoten mit Kommentaren und mit Verarbeitungshinweisen generiert. Auf den Inhalt dieser Knoten kann mit der Zeichenfolgenwert- Eigenschaft zugegriffen werden .

Syntax und Semantik (XPath 1.0)

Der wichtigste Ausdruckstyp in XPath ist ein Standortpfad . Ein Standortpfad besteht aus einer Folge von Standortschritten . Für jeden Lokalisierungsschritt gibt es 3 Komponenten:

Ein XPath-Ausdruck wird anhand eines Kontextknotens ausgewertet . Ein Achsenbezeichner wie „Kind“ oder „Nachkomme“ gibt die Richtung an, in die vom Kontextknoten aus navigiert werden soll. Der 'Test'-Knoten und das Prädikat werden verwendet, um bestimmte 'Knoten' gemäß der spezifischen Achse zu filtern: Beispielsweise erfordert der Testknoten 'A', dass alle Knoten zum Navigieren das Label ('Label') 'A' haben. Ein Prädikat kann verwendet werden, um anzugeben, dass die ausgewählten Knoten eine bestimmte Eigenschaft haben, diese werden durch den XPath-Ausdruck angegeben.

Die XPath-Syntax hat zwei Formen: Die Kurzschrift-Syntax ist kompakter und ermöglicht das einfache und intuitive Schreiben und Lesen von XPaths, wobei in vielen Fällen vertraute Zeichen und eine bekannte Konstruktionsweise verwendet werden. Die vollständige Syntax ist ausgefallener, erlaubt Ihnen aber, mehr Optionen anzugeben, und ist aussagekräftiger zu lesen, solange Sie sorgfältig lesen.

Kurze Syntax

Die kompakte Schreibweise erlaubt viele Vorgabewerte und Abkürzungen für die gängigsten Fälle. Angenommen, das XML enthält das folgende Beispiel:

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

Eine einfache Auswahl mit abgekürzter XPath-Syntax sieht folgendermaßen aus:

  • /A/B/C

es wählt Element C an der Adresse des „Kindes“ von Element B aus, das ein Kind von Element A ist, und wählt somit das Element aus, das sich am weitesten außerhalb des XML-Dokuments befindet. Die XPath-Syntax ahmt einen URI ( Uniform Resource Identifier ) ​​und eine Dateipfadsyntax im Unix-Stil nach .

Komplexere Ausdrücke können mit einer anderen Achse als der standardmäßigen „untergeordneten“ Achse, einem Knotentest, der keinen einfachen Namen hat, oder Prädikaten, wie z. B. dem Schreiben in Klammern nach einem Schritt, erstellt werden. Zum Beispiel der Ausdruck:

  • A//B/*[1]

wählt das erste untergeordnete Element (' *[1]'), unabhängig von seinem Namen, jedes Elements B und seiner untergeordneten Elemente aus. Dieses Symbol (' //') bezieht sich darauf, einen Abkömmling von Element A zu nehmen, d. h. ein Kind des aktuellen Kontextknotens (der Ausdruck beginnt nicht mit einem ' /'). Beachten Sie, dass das Prädikat [1]enger bindet als der Operator /. Um den ersten mit dem Ausdruck ausgewählten Knoten auszuwählen A//B/*, geben Sie ein (A//B/*)[1]. Beachten Sie, dass der Wert des Index im XPath-Prädikat (technisch „nächste Position“ des XPath-Knotensatzes) bei 1 beginnt, nicht bei 0, wie es in Sprachen wie Javascript, C und Java üblich ist.

Erweiterte Syntax

Wir können die beiden obigen Beispiele in der erweiterten (ungekürzten) Syntax wie folgt schreiben:

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

Hier wird bei jedem Schritt des XPath die Achse (Beispiel: childo descendant-or-self) explizit angegeben, gefolgt von , ::und dann dem Knoten test , genau wie Ao node()in den vorherigen Beispielen.

In diesem gleichen, aber kürzer:

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

Achsenspezifizierer

Der Achsenbezeichner gibt die Navigationsrichtung innerhalb des Darstellungsbaums des XML-Dokuments an. Die verfügbaren Achsen sind:

Achsenbezeichner in XPath
Vollständige Syntax Abgekürzte Syntax Anmerkungen
ancestor
ancestor-or-self
attribute (SimboloArroba) (SimboloArroba)abcist die Kurzform fürattribute::abc
child xyzist eine Abkürzung fürchild::xyz
descendant
descendant-or-self // //ist eine Abkürzung für/descendant-or-self::node()/
following
following-sibling
namespace
parent .. ..ist eine Abkürzung fürparent::node()
preceding
preceding-sibling
self . .ist eine Abkürzung fürself::node()

Als Beispiel für die Verwendung der Attributachse in der Kurzsyntax wählt sie das //a/(SimboloArroba)hrefAttribut aus, das hreffür das Element aauf beiden Seiten des Dokumentbaums aufgerufen wird. Der Ausdruck " ." (Es ist eine Abkürzung für self::node() ) wird häufig innerhalb eines Prädikats verwendet, um auf den aktuell ausgewählten Knoten zu verweisen. Wählen Sie beispielsweise h3[.='See also']ein im aktuellen Kontext benanntes Element h3aus, dessen Textinhalt See also.

Knotentest

Der Knotentest kann aus einem bestimmten Knotennamen oder einem allgemeineren Ausdruck bestehen. Im Fall eines XML-Dokuments, in dem das Namespace-Präfix gsdefiniert wurde, sucht es //gs:enquirynach allen Elementen enquiryin diesem Namespace und //gs:*findet alle Elemente, unabhängig vom lokalen Namen in diesem Namespace.

Andere Knotentestformate sind:

Kommentar()
Durchsuchen Sie das XML nach einem Kommentarknoten, Beispiel.<!-- Comment -->
Text()
Suchen Sie nach einem ganzen Typ Text, Beispiel el hello worlden<k>hello<m> world</m></k>
Verarbeitungsanweisung()
XML finden Sie zum Beispiel in Verarbeitungsanweisungen<?php echo $a; ?> . In diesem Fall wird es processing-instruction('php')übereinstimmen.
Gib nicht()
Finden Sie überhaupt einen beliebigen Knoten.

Prädikate

Prädikate, die als Ausdrücke in eckige Klammern geschrieben werden, können verwendet werden, um eine Menge von allen nach einer bestimmten Bedingung zu filtern. Beispielsweise gibt es aeine Menge von allem zurück (alle Elemente a, die Kinder des Kontextknotens sind) und a[(SimboloArroba)href='help.php']speichert nur die Elemente, die das Attribut hrefmit dem Wert haben help.php.

Die Anzahl der Prädikate in diesem Schritt ist unbegrenzt, und sie müssen nicht auf den letzten Schritt eines XPath beschränkt sein. Sie können auch beliebig tief verschachtelt werden. In Prädikaten angegebene Pfade beginnen im Kontext des aktuellen Schritts (d. h. des unmittelbar vorangehenden Knotentests) und ändern diesen Kontext nicht. Alle Prädikate müssen erfüllt sein, damit eine Übereinstimmung auftritt.

Wenn der Wert des Prädikats numerisch ist, ist es syntaktischer Zucker, es mit der Position des Knotens in der Knotenmenge zu vergleichen (wie durch die Funktion angegeben position()). Es ist also p[1]eine Kurzform für p[position()=1]y, um das erste untergeordnete Element auszuwählen p, während p[last()]es eine Kurzform für p[position()=last()]y ist, um das letzte untergeordnete Element pdes aktuellen Kontextknotens auszuwählen.

Im anderen Fall wird der Wert des Prädikats automatisch in einen booleschen Wert umgewandelt. Wenn das Prädikat zu einem Knotensatz ausgewertet wird, ist das Ergebnis wahr, wenn der Knotensatz nicht leer ist. Daher p[(SimboloArroba)x]wählt pdie Elemente aus, die ein Attribut haben x.

Ein komplexeres Beispiel ist der Ausdruck: a[/html/(SimboloArroba)lang='en'][(SimboloArroba)href='help.php'][1]/(SimboloArroba)targetwählt den Attributwert des targetersten Elements aunter den Kindern des Kontextknotens aus, die das Attribut hrefmit dem Wert help.phphaben, vorausgesetzt, dass das Elternelement htmldas Attribut langmit dem Wert hat en. Der Verweis auf ein Attribut des obersten Elements im ersten Prädikat beeinflusst weder den Kontext anderer Prädikate noch den des Lokalisierungsschritts selbst.

Die Reihenfolge der Prädikate ist signifikant, wenn die Prädikate die Position eines Knotens testen. Jedes Prädikat nimmt eine Menge von Knoten und gibt (möglicherweise) eine kleinere Menge zurück. Es findet dann a[1][(SimboloArroba)href='help.php']Übereinstimmungen nur dann, wenn das erste Kind ades Kontextknotens die Bedingung erfüllt (SimboloArroba)href='help.php', solange es a[(SimboloArroba)href='help.php'][1]das erste Kind findet a, das die Bedingung erfüllt.

Funktionen und Operatoren

XPath 1.0 definiert 4 Datentypen: Die Menge der Knoten (Knotenmengen ohne intrinsische Ordnung), Strings (Zeichenkette), Zahlen (Numbers) und Booleans (Booleans).

Die verfügbaren Operatoren sind:

  • Die Operatoren "/", "//" und "[...]" werden, wie oben beschrieben, in xpath-Ausdrücken verwendet.
  • Union-Operator "|", der die Vereinigung zweier Knotensätze bildet.
  • Die booleschen Operatoren „and“ und „or“ zusammen mit der „not()“-Funktion
  • Arithmetische Operatoren "+", "-", "*", "div" (Division) und "mod" (Modul)
  • Vergleichsoperator "=", "!=", "<", ">", "<=", ">="

Die Funktionsbibliothek umfasst:

  • Funktionen zum Manipulieren von Strings: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
  • Funktionen zum Manipulieren von Zahlen: sum(), round(), floor(), ceiling()
  • Funktionen zum Abrufen der Eigenschaften eines Knotens: name(), local-name(), namespace-uri()
  • Funktionen zum Abrufen der Informationen über den Verarbeitungskontext: position(), last()
  • Konvertierungsfunktionen: string(), number(), boolean()

Einige der häufig verwendeten Funktionen werden im Folgenden beschrieben. [ 1 ]

Knotensatzfunktionen

Position()
Gibt eine Zahl zurück, die die Position des Knotens in der aktuell verarbeiteten Knotenfolge darstellt (z. B. der Knoten, der durch die xsl:for-each-Anweisung in XSLT ausgewählt wurde).
count( Knotenmenge )
gibt die Anzahl der Knoten im Knotensatz zurück, die mit dem Argument übereinstimmen.

String-Funktionen

Zeichenfolge ( Objekt ?)
wandelt jeden der 4 XPath-Datentypen gemäß den Konstruktionsregeln in einen String um. Wenn der Argumentwert eine Gruppe von Knoten ist, gibt die Funktion einen Zeichenfolgenwert zurück, der dem ersten Knoten entspricht (gemäß der Dokumentreihenfolge), wobei alle zukünftigen Knoten ignoriert werden.
concat( Zeichenkette , Zeichenkette , Zeichenkette *)
Verketten Sie 2 oder mehr Zeichenfolgen
beginnt-mit( s1 , s2 )
kehrt zurück true, wenn es s1mit beginnts2
enthält( s1 , s2 )
zurückgeben, truewenn s1enthälts2
Teilzeichenfolge ( Zeichenkette , Anfang , Länge ?)
Beispiel: substring("ABCDEF",2,3)zurück "BCD".
Teilzeichenfolge-vor( s1 , s2 )
Beispiel: substring-before("1999/04/01","/")zurück1999
Teilstring-nach( s1 , s2 )
Beispiel: substring-after("1999/04/01","/")zurück04/01
Zeichenfolgenlänge (Zeichenfolge?)
gibt die Anzahl der Zeichen in einer Zeichenfolge zurück
normalize-space( string ?)
Alle führenden und abschließenden Leerzeichen werden entfernt und jede Folge von Leerzeichen wird durch ein einzelnes Leerzeichen ersetzt. Dies ist sehr nützlich, wenn das ursprüngliche XML möglicherweise für Pretty-Printing formatiert wurde, was die weitere Zeichenfolgenverarbeitung unzuverlässig machen könnte.

Boolesche Funktionen

nicht ( boolesch )
negiert den booleschen Ausdruck.
Stimmt()
wird als wahr ausgewertet .
FALSCH()
wird als falsch ausgewertet .

Zahlenfunktionen

summe( Knotenmenge )
konvertiert die Zeichenfolgenwerte aller vom XPath-Argument gefundenen Knoten gemäß den integrierten Casting-Regeln in Zahlen und gibt dann die Summe dieser Zahlen zurück.

Anwendungsbeispiel

Ausdrücke können innerhalb von Prädikaten mit den Operatoren erstellt werden: =, !=, <=, <, >=und >. Boolesche Ausdrücke können mit Klammern ()und den Booleschen Operatoren andund orsowie der not()oben beschriebenen Funktion kombiniert werden. Numerische Berechnungen können *, +, -, divund verwenden mod. Strings können aus Unicode- Zeichen bestehen .

//item[(SimboloArroba)price > 2*(SimboloArroba)discount]wählt die Artikel aus, deren Preisattribut größer als der doppelte numerische Wert des Rabattattributs ist.

Ganze Knotenmengen können mit dem Operator ( 'unioned' ) kombiniert werden, der aus dem Pipe-Zeichen | besteht. Knotenmengen, die mehrere Bedingungen erfüllen, können gefunden werden, indem die Bedingungen innerhalb eines Prädikats mit ' or' kombiniert werden.

v[x or y] | w[z]kann eine einzelne Knotenmenge zurückgeben, die aus allen Elementen besteht v, die ein untergeordnetes Element xoder yhaben, sowie alle Elemente w, die ein untergeordnetes Element zhaben, die im aktuellen Kontext gefunden wurden.

Externe Links

  1. Die vollständige Beschreibung finden Sie im W3C-Empfehlungsdokument .