Verkürzte XPath-Syntax. Beispiele für XPath-Abfragen an HTML unter Verwendung der folgenden Achse

XPath wird verwendet, um durch die Elemente und Attribute eines XML-Dokuments zu navigieren. XPath ist eines der Kernelemente im W3C XSLT-Standard.

1 Was XPath

XPath-Ausdrücke

XPath verwendet Pfadausdrücke, um einzelne Knoten oder eine Gruppe von Knoten in einem XML-Dokument auszuwählen. Diese Ausdrücke sind den Ausdrücken, die Sie bei der Arbeit mit einem herkömmlichen Computerdateisystem sehen, sehr ähnlich.

Standard-XPath-Funktionen

XPath umfasst über 100 integrierte Funktionen. Es gibt Funktionen für Zeichenfolgen- und numerische Werte, Datum und Uhrzeit, Knotenvergleich und QName-Manipulation, Sequenzverwaltung, boolesche Werte und vieles mehr.

XPath wird in XSLT verwendet

XPath ist eines der Kernelemente im XSLT-Standard. Ohne XPath-Kenntnisse können Sie keine XSLT-Dokumente erstellen.

2 Terminologie XPath

Knoten

Es gibt sieben Arten von Knoten in XPath: Element-, Attribut-, Text-, Namespace-, Verarbeitungsanweisungen-, Kommentar- und Dokumentknoten. XML-Dokumente werden als Knotenbäume verarbeitet. Das oberste Element des Baums wird Wurzelelement genannt. Schauen Sie sich das folgende XML-Dokument an:

Harry Potter JK Rowling 2005 29.99

Beispielknoten im XML-Dokument oben:

(Wurzelelement) JK Rowling (Knoten) lang="en"(Attribut)

Atomwerte

Atomwerte sind Knoten, die keine untergeordneten oder übergeordneten Knoten haben. Beispiel für Atomwerte:

J. K. Rowling „en“

Elemente

Elemente sind atomare Werte oder Knoten.

3 Beziehung Knoten

Elternteil

Jedes Element und Attribut hat ein übergeordnetes Element. Im folgenden Beispiel ist das Buchelement das übergeordnete Element der Elemente „Titel“, „Autor“, „Jahr“ und „Preis“:

Harry Potter JK Rowling 2005 29.99

Nachkommenschaft

Elementknoten können null, ein oder mehrere untergeordnete Elemente haben. Im folgenden Beispiel sind die Elemente „Titel“, „Autor“, „Jahr“ und „Preis“ alle untergeordnete Elemente des Buchelements:

Harry Potter JK Rowling 2005 29.99

Elemente der gleichen Ebene

Dies sind Knoten, die denselben übergeordneten Knoten haben. Im folgenden Beispiel sind die Elemente „Titel“, „Autor“, „Jahr“ und „Preis“ alle Elemente derselben Ebene:

Harry Potter JK Rowling 2005 29.99

Vorfahren

Übergeordneter Knoten, übergeordneter Knoten usw. Im folgenden Beispiel sind die Vorgänger des Titelelements die Elemente „book“ und „bookstore“:

Harry Potter JK Rowling 2005 29.99

Nachkommenschaft

Kinder eines Knotens, Kinder von Kindern eines Knotens usw. Im folgenden Beispiel sind die untergeordneten Elemente des Elements „bookstore“ die Elemente „book“, „title“, „author“, „year“ und „price“:

Harry Potter JK Rowling 2005 29.99

4 Syntax XPath

XPath verwendet Pfadausdrücke, um Knoten oder Knotensätze in einem XML-Dokument auszuwählen. Ein Knoten kann ausgewählt werden, indem einem Pfad oder Schritten gefolgt wird. In den folgenden Beispielen verwenden wir das folgende XML-Dokument.

Harry Potter 29.99 XML lernen 39.95

Knotenauswahl

Durch die Verwendung von XPath-Ausdrücken zum Auswählen von Knoten in einem XML-Dokument können Sie einen Knoten auswählen, indem Sie einem Pfad oder Schritten folgen. Die nützlichsten Pfadausdrücke sind unten aufgeführt:

In der folgenden Tabelle sind einige Ausdruckspfade und das Ergebnis der Ausführung des Ausdrucks aufgeführt:

XPath-Ausdruck Ergebnis
Buchhandlung Wählt alle Knoten mit dem Namen „bookstore“ aus.
/Buchhandlung Wählt das Stammelement des Buchladens aus

Notiz: Wenn ein Pfad mit einem Schrägstrich (/) beginnt, handelt es sich immer um einen absoluten Pfad zum Element!

Buchhandlung/Buch Wählt alle „book“-Elemente aus, die untergeordnete Elemente des „bookstore“-Elements sind
//Buch Wählt alle „Buch“-Elemente aus, unabhängig davon, wo sie sich im Dokument befinden
Buchhandlung // Buch Wählt alle „book“-Elemente aus, die untergeordnete Elemente des „bookstore“-Elements sind, unabhängig davon, wo sie sich unter dem „bookstore“-Element befinden
//@lang Wählt alle Attribute mit dem Namen „lang“ aus

Prädikate

Prädikate werden verwendet, um einen bestimmten Knoten oder einen Knoten zu finden, der einen bestimmten Wert enthält. Prädikate werden immer von eckigen Klammern umgeben. In der folgenden Tabelle sind einige Pfadausdrücke mit Prädikaten und das Ergebnis des Ausdrucks aufgeführt:

XPath-Ausdrücke Ergebnis
/Buchhandlung/Buch Wählt das erste „book“-Element aus, das ein untergeordnetes Element des „bookstore“-Elements ist.

Notiz: In IE 5,6,7,8,9 hat der erste Knoten einen Index von , laut W3C-Richtlinien ist er jedoch . Um dieses Problem im IE zu lösen, legen Sie die Option „SelectionLanguage“ für XPath fest:

In JavaScript: xml.setProperty("SelectionLanguage", "XPath");
/Buchhandlung/Buch Wählt das letzte „book“-Element aus, das ein untergeordnetes Element des „bookstore“-Elements ist
/Buchhandlung/Buch Wählt das vorletzte „book“-Element aus, das ein untergeordnetes Element des „bookstore“-Elements ist
/Buchhandlung/Buch Auswahl der ersten beiden „book“-Elemente, die untergeordnete Elemente des „bookstore“-Elements sind
//title[@lang] Wählt alle „title“-Elemente aus, die ein Attribut namens „lang“ haben.
//title[@lang="de"] Wählt alle „title“-Elemente aus, die über ein „Language“-Attribut mit dem Wert „en“ verfügen.
/Buchhandlung/Buch Wählt alle „book“-Elemente nach dem „bookstore“-Element aus, die ein „price“-Element mit einem Wert größer als 35,00 haben
/bookstore/book/title Wählt alle Buchelemente „title“ des Elements „bookstore“ aus, die ein „price“-Element mit einem Wert größer als 35,00 haben

Auswahl unbekannter Knoten

XPath-Sonderzeichen können zur Auswahl unbekannter XML-Knoten verwendet werden.

In der folgenden Tabelle haben wir einige Ausdruckspfade und Ausdrucksergebnisse aufgelistet:

Auswählen mehrerer Pfade

Verwendung des Operators | In XPath-Ausdrücken können Sie mehrere Pfade auswählen. In der folgenden Tabelle sind mehrere Pfadausdrücke und ihre Ergebnisse aufgeführt:

5 Achsen XPath

Wir werden später im Beispiel das folgende XML-Dokument verwenden.

Harry Potter 29.99 XML lernen 39.95

Achsen definieren Knotensätze relativ zum aktuellen Knoten.

Achsenname Ergebnis
Vorfahr Wählt alle Vorfahren (Eltern, Großeltern usw.) des aktuellen Knotens aus
Vorfahr-oder-Selbst Wählt alle Vorfahren (Eltern, Großeltern usw.) des aktuellen Knotens und den aktuellen Knoten selbst aus
Attribut
Kind
Nachfahre Wählt alle untergeordneten Elemente (Kinder, Enkel usw.) des aktuellen Knotens aus
Nachkomme oder Selbst Wählt alle untergeordneten Elemente (Kinder, Enkel usw.) des aktuellen Knotens und des aktuellen Knotens selbst aus
folgende Wählt alles im Dokument aus, nachdem das Tag des aktuellen Knotens geschlossen wird
folgendes-Geschwister Wählt alle Knoten derselben Ebene nach dem aktuellen Knoten aus
Namensraum Wählt alle Knoten im angegebenen Namespace des aktuellen Knotens aus
Elternteil Wählt den übergeordneten Knoten des aktuellen Knotens aus
vorhergehend Wählt alle Knoten aus, die vor dem aktuellen Knoten im Dokument erscheinen, mit Ausnahme von Vorfahren, Attributknoten und Namespace-Knoten
Vorgänger-Geschwister Wählt alle Geschwister bis zum aktuellen Knoten aus
selbst Wählt den aktuellen Knoten aus

6 Ausdrücke Probenahmepfade

Der Standortpfad kann absolut oder relativ sein. Ein absoluter Standortpfad beginnt mit einem Schrägstrich (/), ein relativer Pfad jedoch nicht. In beiden Fällen besteht der Sampling-Pfad aus einem oder mehreren durch Schrägstriche getrennten Schritten:

Absoluter Standortpfad:

/Schritt/Schritt/...

Relativer Standort-Abrufpfad:

Schritt/Schritt/...

Jeder Schritt wird anhand der Knoten im aktuellen Knotensatz bewertet. Der Schritt besteht aus:

  • Achse (definiert die Baumbeziehung zwischen den ausgewählten Knoten und dem aktuellen Knoten);
  • Knotenprüfung (identifiziert einen Knoten innerhalb einer Achse);
  • Null oder mehr Prädikate (um den ausgewählten Knotensatz weiter zu verfeinern)

Die Syntax des Abrufschritts lautet:

Axisname::nodetestAxisname::nodetest[Predictor]

Beispiel Ergebnis
Kind::Buch Wählt alle Buchknoten aus, die dem aktuellen Knoten untergeordnet sind
attribute::lang Wählt das Sprachattribut (lang) des aktuellen Knotens aus
Kind::* Wählt alle Kinder des aktuellen Knotens aus
Attribut::* Wählt alle Attribute des aktuellen Knotens aus
child::text() Wählt alle Textknoten des aktuellen Knotens aus
child::node() Wählt alle unmittelbaren Kinder des aktuellen Knotens aus
Nachkomme::Buch Wählt alle Kinder des aktuellen Knotens aus
Vorfahr::Buch Wählt alle Vorfahren der „Bücher“ des aktuellen Knotens aus
ancestor-or-self::book Wählt alle Buchvorfahren des aktuellen Knotens aus – und den aktuellen Knoten, wenn es sich auch um ein Buch handelt
child::*/child::price Wählt alle untergeordneten Elemente von „price“ eine Ebene vom aktuellen Knoten entfernt aus

7 Betreiber XPath

XPath-Ausdrücke geben eine Reihe von Knoten, Zeichenfolgen, booleschen Werten oder numerischen Werten zurück. Nachfolgend finden Sie eine Liste der in XPath-Ausdrücken verwendeten Operatoren:

Operator Beschreibung Beispiel
| Berechnet zwei Sätze von Knoten //Buch | //CD
+ Zusatz 6 + 4
- Subtraktion 6 - 4
* Multiplikation 6 * 4
div Aufteilung 8. Teil 4
= Gleichwertigkeit Preis=9,80
!= Ungleichheit Preis!=9,80
< Weniger als Preis<9.80
<= Weniger oder gleich Preis≤9,80
> Mehr als Preis>9,80
>= Mehr oder gleich Preis≤9,80
oder Oder Preis=9,80 oder Preis=9,70
Und UND Preis>9,00 und Preis<9.90
Mod Rest der Division 5 Mod 2

8 Beispiele XPath

Lassen Sie uns anhand einiger Beispiele die grundlegende XPath-Syntax durchgehen. In den folgenden Beispielen verwenden wir das folgende XML-Dokument „books.xml“:

Alltagsitalienisch Giada De Laurentiis 2005 30.00 Harry Potter JK Rowling 2005 29.99 XQuery-Kickstart James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 XML lernen Erik T. Ray 2003 39.95

Laden eines XML-Dokuments

Verwenden Sie XMLHttpRequest, um XML-Dokumente herunterzuladen, was von den meisten modernen Browsern unterstützt wird:

Var xmlhttp=new XMLHttpRequest()

Code für ältere Microsoft-Browser (IE 5 und 6):

Var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")

Knotenauswahl

Leider funktioniert XPath im Internet Explorer möglicherweise anders als in anderen Browsern. In unseren Beispielen verwenden wir Code, der in den meisten Browsern funktionieren sollte. Internet Explorer verwendet die Methode „selectNodes()“, um Knoten in einem XML-Dokument auszuwählen:

XmlDoc.selectNodes(xpath);

Firefox, Chrome, Opera und Safari verwenden die Methode „evaluate()“, um Knoten aus einem XML-Dokument auszuwählen:

XmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);

Wählen Sie alle Titel aus

Das folgende Beispiel wählt alle Header-Knoten aus:

/bookstore/book/title

Auswahl des Titels des ersten Buches

Das folgende Beispiel wählt den Titel des ersten „book“-Knotens nach dem „bookstore“-Element aus:

/bookstore/book/title

Wählen Sie alle Preise aus

Das folgende Beispiel wählt den Text aller Preisknoten aus:

/bookstore/book/price

Wählt Knoten mit einem Preis >35 aus

Das folgende Beispiel wählt alle Knoten mit Preisen über 35 aus:

/bookstore/book/price

Auswählen von Header-Knoten mit einem Preis >35

Das folgende Beispiel wählt alle Titelknoten mit einem Preis größer als 35 aus:

/bookstore/book/title

Xpath ist eine Abfragesprache für XML- oder XML-Dokumentelemente. Genau wie SQL ist XPath eine deklarative Abfragesprache. Um die gewünschten Daten zu erhalten, müssen Sie lediglich eine Abfrage erstellen, die diese Daten beschreibt. Der XPath-Sprachinterpreter erledigt die ganze Drecksarbeit für Sie.
Sehr praktisch, nicht wahr? Sehen wir uns an, welche Möglichkeiten xpath für den Zugriff auf Webseitenknoten bietet.

Erstellen einer Anfrage an Webseitenknoten

Ich mache Sie auf eine kleine Laborarbeit aufmerksam, in der ich die Erstellung von XPath-Anfragen an eine Webseite demonstrieren werde. Sie können die von mir gestellten Wünsche wiederholen und, was am wichtigsten ist, versuchen, Ihre eigenen zu erfüllen. Ich hoffe, dass der Artikel dadurch für Anfänger und Programmierer, die mit xpath to xml vertraut sind, gleichermaßen interessant ist.

Für das Labor benötigen wir:
- xhtml-Webseite;
- Mozilla Firefox-Browser mit Add-ons;
- Feuerkäfer;
- firePath ;
(Sie können jeden anderen Browser mit visueller XPath-Unterstützung verwenden)
- Nicht viel Zeit.

Als Webseite zur Durchführung eines Experiments schlage ich die Hauptseite der Website des World Wide Web Consortium („http://w3.org“) vor. Es ist diese Organisation, die die xquery(xpath)-Sprachen, die xhtml-Spezifikation und viele andere Internetstandards entwickelt.

Aufgabe
Rufen Sie mithilfe von XPath-Abfragen Informationen zu Konsortialkonferenzen aus dem XML-Code der w3.org-Hauptseite ab.
Beginnen wir mit dem Schreiben von XPath-Abfragen.
Erste XPath-Anfrage
Öffnen Sie die Registerkarte Firepath in FireBug, wählen Sie mit dem Selektor das zu analysierende Element aus und klicken Sie auf: Firepath hat eine XPath-Anfrage für das ausgewählte Element erstellt.

Wenn Sie den Titel der ersten Veranstaltung ausgewählt haben, sieht die Anfrage wie folgt aus:

Nach dem Entfernen unnötiger Indizes stimmt die Abfrage mit allen Elementen des Header-Typs überein.

Firepath hebt Elemente hervor, die mit der Abfrage übereinstimmen. Sie können in Echtzeit sehen, welche Dokumentknoten zur Abfrage passen.

Informationsanfrage zu Tagungsorten:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

So erhalten wir eine Sponsorenliste:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

xpath-Syntax

Kehren wir zu den von uns erstellten Abfragen zurück und verstehen wir, wie sie strukturiert sind.
Betrachten wir die erste Anfrage im Detail

In dieser Abfrage habe ich drei Teile unterteilt, um die Fähigkeiten von xpath zu demonstrieren. (Die Aufteilung in Teile ist schwierig)

Erster Teil
.// - Rekursiver Abstieg auf null oder mehr Hierarchieebenen aus dem aktuellen Kontext. In unserem Fall ist der aktuelle Kontext das Dokumentstammverzeichnis

Zweiter Teil
* - jedes Element,
[@id="w3c_home_upcoming_events"]– ein Prädikat, auf dessen Grundlage wir nach einem Knoten suchen, der ein ID-Attribut gleich „w3c_home_upcoming_events“ hat. XHTML-Element-IDs müssen eindeutig sein. Daher sollte die Abfrage „jedes Element mit einer bestimmten ID“ den einzigen Knoten zurückgeben, nach dem wir suchen.

Wir können ersetzen * auf den genauen Knotennamen div in dieser Anfrage
div[@id="w3c_home_upcoming_events"]

Daher gehen wir im Dokumentenbaum nach unten zum Knoten div[@id="w3c_home_upcoming_events"], den wir benötigen. Es ist uns völlig egal, aus welchen Knoten der DOM-Baum besteht und wie viele Hierarchieebenen darüber verbleiben.

Der dritte Teil
/ul/li/div/p/a–xpath ist der Pfad zu einem bestimmten Element. Der Pfad besteht aus Adressierungsschritten und Knotenprüfbedingungen (ul, li usw.). Schritte werden durch ein „/“ (Schrägstrich) getrennt.

XPath-Sammlungen
Es ist nicht immer möglich, über ein Prädikat oder Adressierungsschritte auf den gewünschten Knoten zuzugreifen. Sehr oft gibt es auf einer Hierarchieebene viele Knoten des gleichen Typs und es ist notwendig, „nur den ersten“ oder „nur den zweiten“ Knoten auszuwählen. Für solche Fälle werden Kollekten bereitgestellt.

XPath-Sammlungen ermöglichen den Zugriff auf ein Element über seinen Index. Die Indizes entsprechen der Reihenfolge, in der die Elemente im Originaldokument dargestellt wurden. Die Seriennummer in Sammlungen wird ab eins gezählt.

Basierend auf der Tatsache, dass „Veranstaltungsort“ immer der zweite Absatz nach „Konferenzname“ ist, erhalten wir die folgende Abfrage:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Dabei ist p das zweite Element im Satz für jeden Knoten in der Liste /ul/li/div.

Ebenso können wir mit der Anfrage eine Liste der Sponsoren erhalten:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Einige xpath-Funktionen
In XPath gibt es viele Funktionen zum Arbeiten mit Elementen innerhalb einer Sammlung. Ich werde nur einige davon nennen.

zuletzt():
Gibt das letzte Element der Sammlung zurück.
Abfrage ul/li/div/p – gibt die letzten Absätze für jeden „ul“-Listenknoten zurück.
Die Funktion first() wird nicht bereitgestellt. Um auf das erste Element zuzugreifen, verwenden Sie den Index „1“.

Text():
Gibt den Testinhalt eines Elements zurück.
.//a – wir bekommen alle Links mit dem Text „Archive“.

position() und mod:
position() – gibt die Position eines Elements in einer Menge zurück.
mod ist der Rest der Division.

Durch die Kombination dieser Funktionen erhalten wir:
- nicht einmal Elemente ul/li
- gerade Elemente: ul/li

Vergleichsoperationen

  • < - логическое «меньше»
  • > - logisches „größer als“
  • <= - логическое «меньше либо равно»
  • >= – logisch „größer als oder gleich“
ul/li , ul/li – Elemente ab der 3. Zahl auflisten und umgekehrt.

Auf sich allein

Versuchen, zu kriegen:
- sogar URL-Links aus dem linken Menü „Standards“;
- Kopfzeilen aller Nachrichten, außer der ersten von der Hauptseite von w3c.org.

Xpath in PHP5

$dom = neues DomDocument(); $dom->loadHTML($HTMLCode); $xpath = new DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )

Abschließend

Anhand eines einfachen Beispiels haben wir die Möglichkeiten von xpath für den Zugriff auf Webseitenknoten gesehen.
Xpath ist der Industriestandard für den Zugriff auf XML-Elemente und XHTML- und XSLT-Transformationen.
Sie können damit jede HTML-Seite analysieren. Wenn der HTML-Quellcode erhebliche Fehler im Markup enthält, führen Sie ihn durch

Heute werfen wir einen genaueren Blick auf das Thema der Verwendung von XPath mit PHP. In den Beispielen sehen Sie, wie XPath die Codemenge deutlich reduziert. Schauen wir uns die Verwendung von Abfragen und Funktionen in XPath an.

Zu Beginn stelle ich Ihnen zwei Arten von Dokumenten zur Verfügung: DTD und XML, anhand derer wir uns die Funktionsweise von PHP DOM XPath ansehen. So sehen sie aus:

Ein Buch Ein Autor Grusel Kapitel eins Ein weiteres Buch Ein anderer Autor Science-Fiction Kapitel eins

Grundlegende XPath-Abfragen

Die einfache XPath-Syntax ermöglicht Ihnen den Zugriff auf Elemente in einem XML-Dokument. Am einfachsten können Sie den Pfad zum gewünschten Element angeben. Unter Verwendung des oben bereitgestellten XML-Dokuments gibt die folgende XPath-Abfrage die Sammlung der aktuellen Elemente zurück, die im Buchelement gefunden wurden:

//Leihbuch

So! Zwei Schrägstriche definieren das Stammelement des Dokuments und ein Schrägstrich führt zum untergeordneten Buchelement. Es ist einfach und schnell, nicht wahr?

Was aber, wenn Sie ein bestimmtes Buchelement aus einem Set auswählen möchten? Nehmen wir an, Sie möchten Bücher von einem „bestimmten Autor“. Die XPath-Abfrage hierfür wäre:

//Bibliothek/Buch/Autor/..

Sie können verwenden Text() in eckigen Klammern, um den Knotenwert zu vergleichen. Auch «/..» bedeutet, dass wir das übergeordnete Element verwenden möchten (d. h. einen Knoten nach oben zurückgehen).

XPath-Abfragen werden mit einer oder zwei Funktionen durchgeführt: Abfrage() Und auswerten(). Beide bilden eine Anfrage, der Unterschied liegt jedoch im zurückgegebenen Ergebnis. query() wird immer zurückgegeben DOMNodeList, im Gegensatz zu auswerten() Gibt nach Möglichkeit ein Textergebnis zurück. Wenn Ihre XPath-Abfrage beispielsweise die Anzahl der von einem bestimmten Autor geschriebenen Bücher zurückgeben würde, würde query() eine leere DOMNodeList zurückgeben, evaluate() würde einfach eine Zahl zurückgeben, Sie könnten diese direkt verwenden, um die Daten vom Knoten abzurufen .

XPath-Code und Geschwindigkeitsvorteile

Schauen wir uns ein einfaches Beispiel an, das die Anzahl der von einem bestimmten Autor geschriebenen Bücher zurückgibt. Wir betrachten die erste Methode wie immer, ohne XPath zu verwenden. Jetzt werden Sie verstehen, wie das ohne XPath geht und wie viel einfacher es mit XPath ist.

domDocument->getElementsByTagName("author"); foreach ($elements as $element) ( if ($element->nodeValue == $author) ( $total++; ) ) return $number; )

Die nächste Methode gibt das gleiche Ergebnis zurück, verwendet jedoch XPath, um die Bücher auszuwählen, die von einem bestimmten Autor geschrieben wurden.

domDocument); $result = $xpath->query($query); return $result->length; )

Beachten Sie, dass wir den Wert jedes Elements nicht erneut überprüfen müssen, um festzustellen, welcher Autor das jeweilige Buch geschrieben hat. Mit der XPath-Funktion können wir den Code jedoch noch weiter vereinfachen zählen() um den Inhalt der Elemente in diesem Pfad zu zählen.

domDocument); return $xpath->evaluate($query); )

Wir können die benötigten Informationen mit einer einzeiligen XPath-Abfrage erhalten. Es ist nicht erforderlich, viele PHP-Filter zu erstellen. Dies ist der einfachste und schnellste Weg, diese Funktionalität zu schreiben!

Beachten Sie, dass im letzten Beispiel evalu() verwendet wurde. Dies liegt daran, dass die Funktion count() ein Textergebnis zurückgibt. Die Verwendung von query() gibt eine DOMNodeList zurück, die jedoch leer ist.

Die Verwendung von XPath lohnt sich, da es nicht nur Ihren PHP-Code einfacher macht, sondern auch einen Geschwindigkeitsvorteil bietet. Mir ist aufgefallen, dass die erste Version im Vergleich zur zweiten im Durchschnitt 30 % schneller war. Aber der dritte ist 10 % schneller als der erste. Dies hängt natürlich von Ihrem Server und den von Ihnen verwendeten Abfragen ab. Die Verwendung von XPath in seiner reinen Form führt zu den besten Ergebnissen in Bezug auf Geschwindigkeit und Einfachheit beim Schreiben von Code.

XPath-Funktionen

Hier sind einige Funktionen, die mit XPath verwendet werden können. Außerdem finden Sie zahlreiche Ressourcen, die detailliert auf die einzelnen verfügbaren Funktionen eingehen. Wenn Sie DOMNodeList berechnen oder nodeValue (Knotenwert) vergleichen müssen, können Sie eine geeignete XPath-Funktion finden, die die Verwendung von unnötigem PHP-Code überflüssig macht.

Das kennen Sie bereits aus dem Beispiel der Funktion count(). Lassen Sie uns die Funktion id() verwenden, um die Titel von Büchern mit den angegebenen ISBNs abzurufen. Dazu müssen Sie den folgenden XPath-Ausdruck verwenden:

id("isbn1234 isbn1235")/title

Beachten Sie, dass die gesuchten Werte nicht in Klammern stehen, sondern nur durch Leerzeichen getrennt werden sollten. Denken Sie auch nicht einmal daran, ein Komma hinzuzufügen:

domDocument); $result = $xpath->query($query); $books = array(); foreach ($result as $node) ( $book = array("title" => $booknode->nodeValue); $books = $book; ) return $books; )

Der Umgang mit komplexen Funktionen in XPath ist unglaublich einfach.

Verwendung von PHP-Funktionen mit XPath

Manchmal benötigen Sie mehr Funktionalität, die die Standard-XPath-Funktionen nicht bieten können. Glücklicherweise ermöglicht das PHP-DOM die Interaktion nativer PHP-Funktionen mit XPath-Abfragen.

Schauen wir uns ein Beispiel an, das die Anzahl der Wörter in einem Buchtitel zurückgibt. In dieser einfachsten Funktion schreiben wir Folgendes:

domDocument); $result = $xpath->query($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; return str_word_count($title); )

Wir können die Funktion str_word_count() aber auch direkt in die XPath-Anfrage einbinden. Dies kann in wenigen Schritten erfolgen. Zunächst müssen wir den Namespace bei einem XPath-Objekt registrieren. PHP-Funktionen in XPath-Anfragen werden mit der Zeichenfolge „php:functionString“ aufgerufen, nach der der Name der gewünschten Funktion geschrieben wird. Außerdem wird der Namespace unter http://php.net/xpath ausführlicher besprochen. Andere Namespace-Werte lösen einen Fehler aus. Danach müssen wir registerPHPFunctions() aufrufen. Diese Funktion teilt PHP mit, dass PHP diesen Aufruf verarbeiten wird, wenn ein Aufruf über den Namespace „php:“ erfolgt.

Eine Beispielsyntax zum Aufrufen von Funktionen wäre:

php:functionString("nameoffunction", arg, arg...)

Fassen wir alles im folgenden Funktionsbeispiel getNumberOfWords() zusammen:

domDocument); //php-Namespace registrieren $xpath->registerNamespace("php", "http://php.net/xpath"); //Jetzt können PHP-Funktionen in XPath-Anfragen aufgerufen werden $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))"; return $xpath->evaluate($query); )

Beachten Sie, dass Sie die XPath-Funktion text() nicht aufrufen müssen, um den Text des Knotens abzurufen. Die Methode registerPHPFunctions() macht dies automatisch. Allerdings ist auch die folgende Beispielcodezeile gültig:

php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))

Die Registrierung von PHP-Funktionen ist nicht auf Funktionen beschränkt, die in PHP enthalten sind. Sie können Ihre eigenen Funktionen definieren und diese in XPath verwenden. Der einzige Unterschied besteht darin, dass Sie „php:function“ anstelle von „php:functionString“ verwenden müssen.

Schreiben wir eine Funktion außerhalb der Klasse, um die Grundfunktionalität zu demonstrieren. Die von uns verwendete Funktion gibt die Bücher des Autors „George Orwell“ zurück. Es sollte für jeden Knoten, den Sie in die Abfrage einbeziehen möchten, „true“ zurückgeben.

nodeValue == "George Orwell"; } !}

Das an die Funktion übergebene Argument ist ein Array von DOM-Elementen. Diese Funktion durchsucht das Array, ermittelt die erforderlichen Elemente und fügt sie dann in die DOMNodeList ein. In diesem Beispiel war der getestete Knoten /book, und wir haben auch /author verwendet, um die erforderlichen Elemente zu bestimmen.

Jetzt können wir die Funktion getGeorgeOrwellBooks() erstellen:

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//library/book1"; $result = $xpath->query($query); $books = array(); foreach($result as $node) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) return $books; )

Wenn die Funktion „compare()“ statisch ist, müssen Sie die XPath-Abfrage ändern:

//Leihbuch

Um ehrlich zu sein, hätte all diese Funktionalität auch mit reinem XPath-Code implementiert werden können. Das Beispiel zeigt aber, wie Sie XPath-Abfragen erweitern und komplexer gestalten können.

Abschließend

XPath ist eine großartige Möglichkeit, die Codemenge zu reduzieren und die Verarbeitung bei der Arbeit mit XML zu erhöhen. Durch die zusätzliche PHP-DOM-Funktionalität können Sie XPath-Funktionen erweitern. Dies ist eine wirklich nützliche Sache. Wenn Sie sie verwenden und sich mit den Einzelheiten befassen, müssen Sie immer weniger Code schreiben.


XPath verwendet Pfadausdrücke, um Knoten in einem XML-Dokument oder einer Gruppe von Knoten auszuwählen. Durch Knoten entlang des Pfades (Pfad) oder der Stufe (Schritte) zum ausgewählten.

Instanz-XML-Dokumente

Wir werden dieses XML-Dokument in den folgenden Beispielen verwenden.


Harry Potter
29.99


XML lernen
39.95

Knoten auswählen

XPath verwendet Pfadausdrücke, um Knoten in einem XML-Dokument auszuwählen. Oder entlang des Pfades durch einen Knoten, um einen Schritt auszuwählen. Im Folgenden sind die nützlichsten Pfadausdrücke aufgeführt:

In der folgenden Tabelle zeigen wir einige der Ausdruckspfade und das Ergebnis des Ausdrucks:

Ausdruck PfadErgebnis
BücherladenWählen Sie alle untergeordneten Knoten des Buchelements aus.
/ Bücherladen

Wählen Sie das Stammelement Buchhandlung aus.

Hinweis: Wenn ein Pfad mit einem Schrägstrich (/) beginnt, ist der Pfad immer repräsentativ für den absoluten Pfad des Elements!

Buchhandlung/BuchWählen Sie die zur Buchhandlung gehörenden Unterartikel Alle Buchartikel aus.
// BuchWählen Sie alle Buchunterelemente aus, unabhängig von ihrer Position im Dokument.
Buchhandlung // BuchWählt alle Buchelemente aus, die keine Nachkommen der Buchhandlung des Elements sind, unabhängig von ihrer Position in und unter der Buchhandlung.
// @LangWählen Sie alle Eigenschaften mit dem Namen Lang aus.

Prädikat(e)

Ein Prädikat wird verwendet, um einen bestimmten Knoten oder Knoten zu finden, der den angegebenen Wert enthält.

Das Prädikat steht in eckigen Klammern.

In der folgenden Tabelle haben wir einige Pfadausdrücke mit Prädikaten und das Ergebnis des Ausdrucks aufgelistet:

Ausdruck PfadErgebnis
/ Buchhandlung / BuchWählen Sie die Unterelemente aus, die zum ersten Arbeitsmappenelement gehören.
/Bookstore/book [last()]Wählen Sie die Unterelemente aus, die zum letzten Buchelement Buch gehören.
/ Buchhandlung / Buch [last () - 1]Wählen Sie die Unterelemente aus, die sich auf die gemeinsame Buchhandlung des zweiten Buchelements beziehen.
/Bookstore/book [position()<3] Wählen Sie die ersten beiden Buchelemente des zu den Unterelementen gehörenden Buchelements aus.
// Titel [@lang]Das Attribut „Alles auswählen“ mit dem Namen „Lang“ hat einen Elementtitel.
// Titel [@ LANG = "eng"]Wählen Sie alle Elementnamen aus und diese Elemente haben den englischen Attributwert.
/Buchhandlung/BuchWählen Sie alle Buchelemente des Buchelements und den Wert des Preiselements aus, der größer als 35,00 sein muss.
/bookstore/book/titleWählen Sie alle Buchelement-Kopfelemente des Buchelements aus, bei denen der Wert des Preiselements größer als 35,00 sein muss.

Wählen Sie unbekannte Knoten aus

XPath-Platzhalter können verwendet werden, um unbekannte XML-Elemente auszuwählen.

In der folgenden Tabelle haben wir einige Pfadausdrücke sowie die Ergebnisse dieser Ausdrücke aufgelistet:

Wählen Sie mehrere Pfade

Verwendung des Pfadausdrucks „|“ Betreiber können Sie mehrere Pfade wählen.

In der folgenden Tabelle haben wir einige Pfadausdrücke sowie die Ergebnisse dieser Ausdrücke aufgelistet.