Heim > Backend-Entwicklung > PHP-Tutorial > PHP DOM: Verwenden von XPath

PHP DOM: Verwenden von XPath

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2025-02-26 09:07:16
Original
518 Leute haben es durchsucht

PHP DOM: Using XPath

Kernpunkte

  • xPath ist eine Syntax für die Abfrage von XML -Dokumenten, die eine einfachere und sauberere Möglichkeit zum Schreiben von Funktionen bieten und die Menge an Code reduzieren, die zum Schreiben von Abfragen und Filter -XML -Daten erforderlich ist.
  • xPath -Abfrage kann mit zwei Funktionen ausgeführt werden: query() und evaluate(). Obwohl beide Abfragen ausführen, besteht der Unterschied darin, dass die Art der Ergebnisse, die sie zurückgeben, query() DOMNodeList zurückgibt, während evaluate() die typisierten Ergebnisse so weit wie möglich zurückgibt.
  • Die Verwendung von XPath kann den Code prägnanter und effizienter machen. Beim Vergleichstest ist der Geschwindigkeitsvorteil der Verwendung von Pure XPath ziemlich offensichtlich, wobei die XPath-Version etwa 10% schneller als die Nicht-XPATH-Version ist.
  • Mit
  • PHP DOM können Sie Standard -XPath -Funktionen mit benutzerdefinierten Funktionen erweitern. Dies beinhaltet die Integration der eigenen Funktionen von PHP in XPath -Abfragen und die Registrierung von PHP -Funktionen, die in XPath verwendet werden. Dies erweitert die Funktionalität von XPath, um es zu ermöglichen, komplexere Abfragen durchzuführen.

In diesem Artikel wird XPath eingehend untersucht, einschließlich seiner Funktionen und der Implementierung in PHP. Sie werden feststellen, dass XPath die Menge an Code, die zum Schreiben von Abfragen und zum Filtern von XML -Daten erforderlich ist, erheblich reduzieren kann und die Leistung im Allgemeinen verbessern kann. Ich werde die PHP -DOM -XPath -Funktionalität unter Verwendung des gleichen DTD und XML aus dem vorherigen Beitrag demonstrieren. Für eine kurze Bewertung sehen DTD und XML hier aus:

<!DOCTYPE library [
  <!ELEMENT library (book*)>
  <!ELEMENT book (title, author, genre, chapter*)>
  <!ATTLIST book isbn ID #REQUIRED>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT genre (#PCDATA)>
  <!ELEMENT chapter (chaptitle,text)>
  <!ATTLIST chapter position NMTOKEN #REQUIRED>
  <!ELEMENT chaptitle (#PCDATA)>
  <!ELEMENT text (#PCDATA)>
]>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
<?xml version="1.0" encoding="utf-8"?>
<library>
  <book isbn="isbn1234">
    <title>A Book</title>
    <author>An Author</author>
    <genre>Horror</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text></text>
    </chapter>
  </book>
  <book isbn="isbn1235">
    <title>Another Book</title>
    <author>Another Author</author>
    <genre>Science Fiction</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text>Sit Dolor Amet...</text>
    </chapter>
  </book>
</library>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Basic XPath Query

xPath ist eine Syntax für die Abfrage von XML -Dokumenten. Die einfachste Form besteht darin, den Pfad zu dem Element zu definieren, auf das Sie zugreifen möchten. Mit dem obigen XML -Dokument gibt die folgende XPath -Abfrage eine Sammlung aller vorhandenen book Elemente zurück:

//library/book
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das war's. Zwei Vorwärts -Schrägstriche geben an, dass library die Wurzelelemente des Dokuments sind, und ein einzelner Schrägstrich zeigt book an, sind seine untergeordneten Elemente. Sehr einfach, nicht wahr? Aber was ist, wenn Sie ein bestimmtes Buch angeben möchten? Angenommen, Sie möchten jedes von "einem Autor" geschriebene Buch zurückgeben. Der XPath wird:

//library/book/author[text() = "An Author"]/..
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Sie können text() verwenden, um einen Vergleich über den Wert eines Knotens in quadratischen Klammern durchzuführen, und das nachverfolgende "/.." bedeutet, dass wir das übergeordnete Element wollen (d. H. Einen Knoten nach oben bewegen). XPath -Abfrage kann mit einer von zwei Funktionen ausgeführt werden: query() und evaluate(). Beide führen Abfragen aus, aber der Unterschied ist die Art der Ergebnisse, die sie zurückgeben. query() wird immer DOMNodeList zurückgegeben und evaluate() typisierte Ergebnisse so weit wie möglich zurück. Wenn Ihre XPath -Abfrage beispielsweise die Anzahl der von einem bestimmten Autor geschriebenen Bücher und nicht das tatsächliche Buch selbst zurückgibt, wird query() ein leeres DOMNodeList zurückgegeben. evaluate() gibt die Nummer direkt zurück, sodass Sie sie sofort verwenden können, ohne Daten aus dem Knoten extrahieren zu müssen.

XPaths Code und Geschwindigkeitsvorteile

Lassen Sie uns eine kurze Demonstration vornehmen und die Anzahl der von einem bestimmten Autor verfassten Bücher zurückgeben. Wir werden uns zunächst einen praktikablen Ansatz ansehen, aber er verwendet XPath nicht. Dies soll Ihnen zeigen, wie Sie dies tun können, ohne XPath zu verwenden und warum XPath so mächtig ist.

<!DOCTYPE library [
  <!ELEMENT library (book*)>
  <!ELEMENT book (title, author, genre, chapter*)>
  <!ATTLIST book isbn ID #REQUIRED>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT genre (#PCDATA)>
  <!ELEMENT chapter (chaptitle,text)>
  <!ATTLIST chapter position NMTOKEN #REQUIRED>
  <!ELEMENT chaptitle (#PCDATA)>
  <!ELEMENT text (#PCDATA)>
]>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die nächste Methode erzielt dasselbe Ergebnis, verwendet jedoch XPath, um Bücher auszuwählen, die nur von einem bestimmten Autor geschrieben wurden:

<?xml version="1.0" encoding="utf-8"?>
<library>
  <book isbn="isbn1234">
    <title>A Book</title>
    <author>An Author</author>
    <genre>Horror</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text></text>
    </chapter>
  </book>
  <book isbn="isbn1235">
    <title>Another Book</title>
    <author>Another Author</author>
    <genre>Science Fiction</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text>Sit Dolor Amet...</text>
    </chapter>
  </book>
</library>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Bitte beachten Sie, dass wir die Notwendigkeit von PHP beseitigt haben, Autorenwerte diesmal zu testen. Wir können jedoch noch einen Schritt weiter gehen und die XPath -Funktion count() verwenden, um die Anzahl der Vorkommen dieses Pfades zu berechnen.

//library/book
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wir benötigen nur eine XPath -Zeile, um die erforderlichen Informationen abzurufen, ohne dass sie PHP verwenden müssen, um eine mühsame Filterung durchzuführen. Tatsächlich ist dies eine einfachere und prägnantere Art, diese Funktion zu schreiben! Beachten Sie, dass evaluate() im letzten Beispiel verwendet wird. Dies liegt daran, dass die Funktion count() ein typisiertes Ergebnis zurückgibt. Die Verwendung von query() wird DOMNodeList zurückgeben, aber Sie werden feststellen, dass es sich um eine leere Liste handelt. Dies macht Ihren Code nicht nur prägnanter, sondern hat auch den Vorteil der Geschwindigkeit. Ich fand, dass Version 1 eine durchschnittliche Geschwindigkeit von 30% schneller als Version 2 hat, aber Version 3 ist etwa 10% schneller als Version 2 (ca. 15% schneller als Version 1). Während diese Messungen je nach Server und Abfrage variieren, bringt die Verwendung von Pure XPath häufig erhebliche Geschwindigkeitsvorteile und erleichtert gleichzeitig Ihr Code zu lesen und zu warten.

xPath -Funktion

xPath kann viele Funktionen verwenden, und es gibt viele hervorragende Ressourcen, in denen die verfügbaren Funktionen beschrieben werden. Wenn Sie sich über DOMNodeLists iteriert oder nodeValues vergleichen, finden Sie möglicherweise eine XPath -Funktion, die viel PHP -Code beseitigt. Sie haben die Verwendung der count() -Funktion gesehen. Verwenden wir die Funktion id(), um den Titel des Buches mit dem angegebenen ISBN zurückzugeben. Der XPath -Ausdruck, den Sie verwenden müssen, ist:

//library/book/author[text() = "An Author"]/..
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Beachten Sie, dass die hier zu durchsuchenden Werte in Anführungszeichen beigefügt und durch Räume getrennt sind.

<?php
public function getNumberOfBooksByAuthor($author) {
    $total = 0;
    $elements = $this->domDocument->getElementsByTagName("author");
    foreach ($elements as $element) {
        if ($element->nodeValue == $author) {
            $total++;
        }
    }
    return $total; // 修正:这里应该是 $total,而不是 $number
}
?>
Nach dem Login kopieren
Nach dem Login kopieren

Ausführen komplexer Funktionen in XPath ist relativ einfach.

Verwenden von PHP -Funktionen in XPath

Manchmal benötigen Sie möglicherweise einige leistungsstärkere Funktionen, die Standard -XPath -Funktionen nicht liefern können. Glücklicherweise ermöglicht PHP DOM auch, dass Sie die eigenen Funktionen von PHP in XPath -Abfragen integrieren. Überlegen wir, ob wir die Anzahl der Wörter im Titel des Buches zurückgeben. Die einfachste Funktion, wir können die Methode wie folgt schreiben:

<!DOCTYPE library [
  <!ELEMENT library (book*)>
  <!ELEMENT book (title, author, genre, chapter*)>
  <!ATTLIST book isbn ID #REQUIRED>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT genre (#PCDATA)>
  <!ELEMENT chapter (chaptitle,text)>
  <!ATTLIST chapter position NMTOKEN #REQUIRED>
  <!ELEMENT chaptitle (#PCDATA)>
  <!ELEMENT text (#PCDATA)>
]>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

können wir jedoch auch die Funktion str_word_count() direkt in die XPath -Abfrage integrieren. Dafür müssen mehrere Schritte ausgeführt werden. Zunächst müssen wir einen Namespace mit dem XPath -Objekt registrieren. Die PHP -Funktion in der XPath -Abfrage beginnt mit "php:functionString", gefolgt vom Namen der in Klammern eingeschlossenen Funktion, die Sie verwenden möchten. Zusätzlich ist der zu definierte Namespace http://php.net/xpath. Der Namespace muss darauf eingestellt werden. Dann müssen wir registerPHPFunctions() aufrufen, was PHP mitteilt, dass wenn wir eine Funktion mit "php:" als Namespace begegnen, von PHP behandelt werden sollte. Die tatsächliche Syntax zum Aufrufen einer Funktion ist:

<?xml version="1.0" encoding="utf-8"?>
<library>
  <book isbn="isbn1234">
    <title>A Book</title>
    <author>An Author</author>
    <genre>Horror</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text></text>
    </chapter>
  </book>
  <book isbn="isbn1235">
    <title>Another Book</title>
    <author>Another Author</author>
    <genre>Science Fiction</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text>Sit Dolor Amet...</text>
    </chapter>
  </book>
</library>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Stellen Sie all dies zusammen und erhalten Sie die folgende Neuauflagen von getNumberOfWords():

//library/book
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Beachten Sie, dass Sie die XPath -Funktion text() nicht aufrufen müssen, um den Text des Knotens anzugeben. Die registerPHPFunctions() -Methode erledigt dies automatisch. Das Folgende ist jedoch auch gültig:

//library/book/author[text() = "An Author"]/..
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Register -PHP -Funktionen sind nicht auf Funktionen beschränkt, die mit PHP ausgestattet sind. Sie können Ihre eigenen Funktionen definieren und sie in XPath zur Verfügung stellen. Der einzige Unterschied besteht darin, dass Sie beim Definieren einer Funktion "php:function" anstelle von "php:functionString" verwenden. Darüber hinaus können nur die Funktion selbst oder statische Methoden bereitgestellt werden. Anrufinstanzmethoden werden nicht unterstützt. Lassen Sie uns die grundlegende Funktionalität anhand einer regulären Funktion demonstrieren, die über den Rahmen der Klasse hinausgeht. Die Funktion, die wir verwenden werden, wird nur die Bücher von "George Orwell" zurückgeben. Für jeden Knoten, den Sie in die Abfrage aufnehmen möchten, muss er true zurückgeben.

<?php
public function getNumberOfBooksByAuthor($author) {
    $total = 0;
    $elements = $this->domDocument->getElementsByTagName("author");
    foreach ($elements as $element) {
        if ($element->nodeValue == $author) {
            $total++;
        }
    }
    return $total; // 修正:这里应该是 $total,而不是 $number
}
?>
Nach dem Login kopieren
Nach dem Login kopieren

Das an die Funktion übergebene Argument ist ein Array von DOMElements. Die Funktion ist dafür verantwortlich, das Array zu iterieren und festzustellen, ob der zu testende Knoten in DOMNodeList zurückgegeben werden sollte. In diesem Beispiel ist der zu testende Knoten /book, den wir zum Bestimmen verwenden. Jetzt können wir die Methode /author: getGeorgeOrwellBooks() erstellen

<?php
public function getNumberOfBooksByAuthor($author) {
    $query = "//library/book/author[text() = '$author']/..";
    $xpath = new DOMXPath($this->domDocument);
    $result = $xpath->query($query);
    return $result->length;
}
?>
Nach dem Login kopieren
Wenn

eine statische Methode ist, müssen Sie die XPath -Abfrage zum Lesen ändern: compare()

<?php
public function getNumberOfBooksByAuthor($author) {
    $query = "count(//library/book/author[text() = '$author']/..)";
    $xpath = new DOMXPath($this->domDocument);
    return $xpath->evaluate($query);
}
?>
Nach dem Login kopieren
In der Tat können alle diese Funktionen einfach nur in XPath geschrieben werden, aber dieses Beispiel zeigt, wie eine XPath -Abfrage erweitert wird, um sie komplexer zu machen. Die Objektmethode kann nicht in XPath aufgerufen werden. Wenn Sie feststellen, dass Sie auf bestimmte Objekteigenschaften oder -methoden zugreifen müssen, um die XPath -Abfrage abzuschließen .

DOMNodeList

Zusammenfassung

xPath ist eine großartige Möglichkeit, die Menge des geschriebenen Codes zu reduzieren und die Codeausführung bei der Verarbeitung von XML -Daten zu beschleunigen. Zusätzlich nicht Teil der offiziellen DOM -Spezifikation, ermöglichen Ihnen zusätzliche Funktionen, die von PHP DOM bereitgestellt wurden, Standard -XPath -Funktionen mit benutzerdefinierten Funktionen. Dies ist eine sehr leistungsstarke Funktion, und wenn Sie sich mit der XPath -Funktion vertraut machen, können Sie sich möglicherweise immer weniger darauf verlassen.

(Bild aus Fotolien)

FAQs (FAQ) über PHP DOM mit XPath

Was ist XPath und wie funktioniert es in PHP DOM?

xPath (XML -Pfadsprache) ist eine Abfragesprache, mit der Knoten aus einem XML -Dokument ausgewählt werden. In PHP DOM wird XPath verwendet, um Elemente und Eigenschaften in einem XML -Dokument zu durchqueren. Sie können auf verschiedene Weise bestimmte Teile eines XML -Dokuments finden und auswählen, z. Dies macht es zu einem leistungsstarken Werkzeug zum Parsen und Manipulieren von XML -Daten in PHP.

Wie erstelle ich eine Instanz von DomxPath?

Um eine Instanz von DomxPath zu erstellen, müssen Sie zunächst eine Instanz der Domdocument -Klasse erstellen. Sobald Sie das Domdocument -Objekt erhalten haben, können Sie ein neues DomxPath -Objekt erstellen, indem Sie das Domdocument -Objekt an den DomxPath -Konstruktor übergeben. Hier ist ein Beispiel:

<!DOCTYPE library [
  <!ELEMENT library (book*)>
  <!ELEMENT book (title, author, genre, chapter*)>
  <!ATTLIST book isbn ID #REQUIRED>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT genre (#PCDATA)>
  <!ELEMENT chapter (chaptitle,text)>
  <!ATTLIST chapter position NMTOKEN #REQUIRED>
  <!ELEMENT chaptitle (#PCDATA)>
  <!ELEMENT text (#PCDATA)>
]>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie kann ich XPath verwenden, um einen Knoten auszuwählen?

Sie können Knoten mit der query() -Methode des DomxPath -Objekts auswählen. Die query() -Methode nimmt den XPath -Ausdruck als Parameter und gibt ein Domnodelist -Objekt zurück, das alle Knoten enthält, die mit dem Ausdruck übereinstimmen. Zum Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<library>
  <book isbn="isbn1234">
    <title>A Book</title>
    <author>An Author</author>
    <genre>Horror</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text></text>
    </chapter>
  </book>
  <book isbn="isbn1235">
    <title>Another Book</title>
    <author>Another Author</author>
    <genre>Science Fiction</genre>
    <chapter position="first">
      <chaptitle>chapter one</chaptitle>
      <text>Sit Dolor Amet...</text>
    </chapter>
  </book>
</library>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Dies wählt alle <book> Elemente aus, die untergeordnete Elemente des <title> -Elements sind.

Was ist der Unterschied zwischen

und query() Methoden in evaluate() domxPath?

Sowohl die Methoden

query() als auch evaluate() werden verwendet, um XPath -Ausdrücke zu bewerten. Der Unterschied ist die Art der Ergebnisse, die sie zurückgeben. Die query() -Methode gibt den Domnodelisten aller Knoten zurück, die mit dem XPath -Ausdruck übereinstimmen. Auf der anderen Seite gibt evaluate() ein typisiertes Ergebnis wie eine Boolesche, Zahl oder Zeichenfolge zurück, abhängig vom XPath -Ausdruck. Wenn das Ausdrucksergebnis ein Knotensatz ist, gibt evaluate() einen Domnodelist zurück.

Wie gehe ich mit Namespaces in XPath -Abfrage um?

Um Namespaces in XPath -Abfrage zu verarbeiten, müssen Sie den Namespace mit der Methode registerNamespace() mit dem DomxPath -Objekt registrieren. Diese Methode hat zwei Parameter: das Präfix und den Namespace URI. Nach der Registrierung des Namespace können Sie Präfixe in Ihrer XPath -Abfrage verwenden. Zum Beispiel:

//library/book
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie kann ich XPath verwenden, um Eigenschaften auszuwählen?

Sie können das Symbol @, gefolgt vom Eigenschaftsnamen, verwenden, um Eigenschaften in XPath auszuwählen. Um beispielsweise alle <a></a> Eigenschaften des href Elements auszuwählen, können Sie den folgenden XPath -Ausdruck verwenden: //a/@href.

Wie verwendet ich die XPath -Funktion in PHP DOM?

xPath bietet viele Funktionen, die in XPath -Ausdrücken verwendet werden können. Diese Funktionen können verwendet werden, um Zeichenfolgen, Zahlen, Knotensätze und mehr zu manipulieren. Um die XPath -Funktion in PHP -DOM zu verwenden, geben Sie einfach die Funktion in den XPath -Ausdruck ein. Um beispielsweise alle <book> Elemente mit einem Preiselement mit einem Wert von mehr als 30 auszuwählen, können Sie die Funktion number() wie unten gezeigt verwenden: //book[number(price) > 30].

Kann ich XPath mit HTML -Dokumenten in PHP DOM verwenden?

Ja, Sie können XPath mit HTML -Dokumenten in PHP DOM verwenden. Da HTML jedoch nicht immer gut geformtes XML ist, haben Sie möglicherweise Probleme, XPath mit HTML zu verwenden. Um diese Probleme zu vermeiden, können Sie die loadHTML() -Methode der Domdocument -Klasse verwenden, um das HTML -Dokument zu laden. Diese Methode analysiert die HTML und korrigiert alle Formatierungsfehler, sodass Sie XPath mit dem generierten Domdocument -Objekt verwenden können.

Wie behandle ich Fehler, wenn Sie XPath in PHP DOM verwenden?

Bei Verwendung von XPath in PHP -DOM können Fehler aus mehreren Gründen auftreten, z. Um diese Fehler zu bewältigen, können Sie Benutzerfehlerbehandlungen mithilfe der Funktion libxml_use_internal_errors() aktivieren. Diese Funktion führt dazu, dass LIBXML -Fehler intern gespeichert werden, sodass Sie diese in Ihrem Code verarbeiten können. Sie können dann die Funktion libxml_get_errors() verwenden, um die Fehler abzurufen und nach Bedarf zu verarbeiten.

Kann ich ein XML -Dokument mit XPath in PHP DOM ändern?

Während XPath selbst keine Möglichkeit bietet, XML -Dokumente zu ändern, können Sie XPADH mit der DOM -API verwenden, um XML -Dokumente zu ändern. Sie können mit XPath den Knoten auswählen, den Sie ändern möchten, und dann die von der DOM -API bereitgestellten Methoden zur Änderung verwenden. Beispielsweise können Sie die removeChild() -Methode der Domnode -Klasse verwenden, um einen Knoten zu löschen, oder die setAttribute() -Methode der Domelement -Klasse verwenden, um den Wert des Attributs zu ändern.

Das obige ist der detaillierte Inhalt vonPHP DOM: Verwenden von XPath. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage