Xpath-Abfragen mit PHP

(http://www.zdnet.de/magazin/39132322/xpath-abfragen-mit-php.htm)

von Philip Perkins, 19. April 2005

Xpath ist eine Sprache, mit der auf einzelne Teile eines XML-Dokuments zugegriffen werden kann, wodurch XSLT-Transformationen praktisch überflüssig werden. Damit ist es auch ein unschätzbares Tool zur Verwaltung von XML-Daten in Webanwendungen.

Microsoft stellt die Xpath-Funktionalität über die Methoden selectSingleNode() und selectNodes() für DOM-Knoten und -Dokumente bereit. PHP hingegen verwendet Funktionen, welche die Xpath-Funktionalität über Kontexte bereitstellen. Das folgende Beispiel zeigt XML-Daten und PHP-Code, um auf unterschiedliche Teile des XML-Dokuments zuzugreifen. Auch wird erklärt, wie der PHP-Code funktioniert.

Der Beispielcode verwendet die folgenden XML-Daten zur Bereitstellung der Funktionalität. (Anmerkung: Dieser Code wurde unter PHP 4.3.4, Windows XP und IIS 5.1 entwickelt und erfolgreich getestet.)

Diese XML-Daten enthalten einige Elemente und ein paar Attribute, inklusive einer Namespace-Deklaration – also etwas schlichtes XML. Damit lassen sich unterschiedliche Abfragen ausprobieren.

Zuerst wird eine lokale Variable erstellt, welche den XML-String aufnimmt. Diese Information könnte zum Beispiel als Teil eines POST HTTP-Request übergeben worden sein. Für dieses Beispiel sind die Daten einfach im Code enthalten. Der nächste Schritt besteht darin, ein DOM-Dokument mithilfe der Funktion domxml_open_mem() zu erstellen. Diese Funktion erstellt aus einem gültigen XML-String ein DOM Document-Objekt im Speicher. Es erwartet einen Parameter: den XML-String. Eine andere Möglichkeit besteht darin, den XML-Code in einer separaten Datei zu speichern und mit der Funktion domxml_open_file() aus der Datei zu laden. Diese Funktion erwartet als Parameter den Namen der XML-Datei. Sobald das DOM Document-Objekt erzeugt wurde, kann mit diesem Objekt und der Funktion Xpath_new_context() ein Xpath-Kontext erzeugt werden, welcher als Parameter das aktuelle DOM Document-Objekt übernimmt. Dieser Kontext wird zur Auswertung des Xpath-Ausdrucks verwendet und gegebenenfalls auch zum Registrieren von Namespaces verwendet. Da das Beispiel-XML einen Namespace enthält, wird dieser mit der Funktion Xpath_register_ns() registriert. Damit können Xpath-Abfragen erstellt werden, die Präfixe enthalten. Die Funktion Xpath_register_ns() erwartet drei Parameter: den Xpath-Kontext, das Präfix und den Namespace.

Nun kann man Xpath-Abfragen ausführen. Dies geschieht mithilfe der Funktion Xpath_eval(), deren erster Parameter der Xpath-Kontext und der zweite der Xpath-Ausdruck ist. Die Funktion gibt ein Array von DOM Nodes zurück. Im Beispielcode wird dieses Node-Set durchlaufen und eine entsprechende Ausgabe erzeugt.

Im ersten Xpath-Beispiel werden alle x:dog text-Elemente unterhalb der x:row-Knoten ausgelesen, bei denen das Attribut "color" gleich "yellow" ist. An dieser Stelle unterscheidet sich der Xpath-Ausdruck in PHP etwas von einem Xpath-Ausdruck in MSXML. Der "/text()"-Teil des Ausdrucks wurde eingefügt, um nur die Textknoten zurückzugeben. Bei MSXML greift man auf die Textknoten über die Eigenschaft "text" zu. Über die Eigenschaft "content" des zurückgegebenen Textknotens kann man dessen Inhalt auslesen.

Im zweiten Beispiel werden alle x:dog-Elemente unterhalb der x:row-Knoten ausgelesen. Diesmal wird allerdings die Methode dump_node() auf das DOM Document-Objekt angewandt, um den vollständigen XML-Code des entsprechenden Knotens auszudrucken. Die Methode dump_node() erwartet einen Parameter: den DOM Node, dessen Inhalt man ausgeben möchte.

Im letzten Beispiel werden alle x:cat-Textknoten und alle x:dog-Textknoten ausgelesen, bei denen das "color"-Attribut entweder "white" oder "grey" ist. Auch hier werden alle Knoten durchlaufen und der Inhalt jedes Textknotens ausgegeben. Und ganz zum Schluss sollte man das DOM Document-Objekt wieder aus dem Speicher entfernen.