PHP/XML mit Xpath abfragen
Die Integration der Abfragesprache Xpath ist in PHP5 Bestandteil der Bibliothek "xmllib2" und entsprechend leicht zu verwenden.
Xpath praktisch verwenden
Das folgende Beispiel zeigt die Wirkung der Xpath-Achsenbezeichner. Zum Testen aller erdenklichen Kombinationen wird eine XML-Datei mit entsprechenden Achsen entworfen.
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Name XPathTest.xml -->
<a>
<b></b>
<c>
<d></d>
<e>
<h></h>
<i></i>
</e>
<f></f>
<g></g>
</c>
<x></x>
<y>
<z></z>
</y>
</a>
|
Das folgende Skript wendet darauf alle XPath-Achsenbezeichner an und gibt eine Tabelle mit den Knoten aus.
<?php
function PrintNodeList($nodes)
{
print "{$nodes->length} Knoten: ";
foreach ($nodes as $node)
{
print "<" . strtoupper($node->tagName) . "> ";
# echo var_export($node);
}
}
$dom = new DomDocument();
## Laden des XML-Dokuments.
$dom->load("data/XPathTest.xml");
## Aus dem geladenen Dokument wird eine XPath-Instanz erstellt, die
## dann abgefragt werden kann.
$xp = new DomXPath($dom);
## Das Array "$expressions" definiert alle Achsennamen, die danach mit
## "foreach" durchlaufen werden, um eine Tabelle mit den Reaktionen zu
## erstellen.
$expressions = array("self",
"child",
"parent",
"descendant",
"descendant-or-self",
"ancestor",
"ancestor-or-self",
"preceding",
"preceding-sibling",
"following",
"following-sibling");
echo "<table border=\"1\">\n";
echo "<tr>\n";
echo "<th colspan=\"2\">Element-Beziehungen, ausgehend von \"c\"</th>\n";
echo "</tr>\n";
foreach ($expressions as $expression)
{
## Die Abfrage wird auf Grundlage der Elemente vervollständigt. Hier
## wird als Ausgangsknoten das Element "<c>" benutzt und der ent-
## sprechende Ausdruck angehängt, was dann z. B. folgenden Ausdruck
## ergibt: //c/child::*
## In XPath werden damit alle Kinder des Elements "<c>" abgefragt.
$nodes = $xp->query("//c/$expression::*");
echo "<tr>\n<td>$expression</td>\n";
echo "<td>\n";
PrintNodeList($nodes);
echo "</td>\n</tr>\n";
}
echo "</table>\n";
?>
|
|
DOM-Klassen und -Methoden im Zusammenhang mit Xpath
Wenn eine Xpath-Abfrage erfolgreich war, wird eine Liste aus Knoten zurückgegeben, dargestellt durch die Klasse "DOMNodeList". Diese Liste kann nun mit "foreach" verarbeitet oder ein bestimmter Knoten ausgewählt werden. Die folgende Tabelle zeigt die möglichen Methoden und Eigenschaften.
Name | Typ | Beschreibung |
---|---|---|
item(index) | Methode | Gibt das betreffende Element, adressiert durch den Index, als Objekt vom Typ "DomNode" zurück. |
length | Eigenschaft | Gibt die Anzahl der Elemente in der Auflistung zurück. |
Der eigentliche Zugriff erfolgt nun über "DomNode", wo folgende Methoden eingesetzt werden können.
Name | Beschreibung |
---|---|
insertBefore | Fügt vor einem anderen Knoten ein. |
replaceChild | Ersetzt ein Kindelement. |
removeChild | Entfernt ein Kindelement. |
appendChild | Hängt ein Kindelement an. |
hasChildNodes | Prüft, ob Kindelemente vorhanden sind. |
isSameNode | Vergleicht zwei Knoten auf Identität. |
isDefaultNamespace | Prüft, ob der Knoten im Standardnamensraum ist. |
isEqualNode | Vergleicht zwei Knoten auf Gleichheit. |
cloneNode | Kopiert (klont) einen Knoten. |
isSupported | Prüft, ob eine bestimmte Funktion von dieser DOM-Implementierung unterstützt wird. |
lookupPrefix | Ermittelt das Präfix des Elements (das ist der Alias eines gegebenenfalls genutzten Namensraums). |
lookupNamespaceUri | Ermittelt den Namensraum des Elements (das ist der vollständige URI). |
Neben den Methoden stehen auch eine Reihe von Eigenschaften zur Verfügung, die den Umgang mit XML im Zusammenhang mit Xpath erleichtern.
Name | Beschreibung |
---|---|
nodeName tagName |
Name des Elements, das durch den Knoten dargestellt wird. |
nodeValue textContent |
Der Inhalt (Text) des Knotens. "textContent" entspricht nicht dem Standard. |
nodeType | Knotentyp. Hier kann eine der PHP/DOM#Konstanten Konstanten von DOM stehen. |
parentNode | Der Elternknoten vom Typ "DomNode". |
childNodes | Auflistung der Kindknoten vom Typ "DomNodeList". |
firstChild | Der erste Kindknoten vom Typ "DomNode". |
lastChild | Der letzte Kindknoten vom Typ "DomNode". |
nextSibling | Der nächste Geschwisterknoten vom Typ "DomNode". |
Attributes | Auflistung der Attribute. |
ownerDocument | Das "DomDocument"-Objekt, dem dieser Knoten entstammt. |