23.9 XML_Indexing 

Besprochene Version: 0.3.5 | Lizenz: PHP-Lizenz 2.02 |
Klassendatei(en): XML/Reader.php |
Möchten Sie die Inhalte von sehr großen XML-Dateien auslesen, ist das unter Umständen recht langsam. Eine Abhilfe in so einem Fall bietet XML_Indexing. Mit diesem Paket können Sie eine XML-Datei einlesen und sehr schnell auf die Informationen zugreifen, die in den Elementen enthalten sind. Der Zugriff auf die Elemente erfolgt hierbei über eine Pfadangabe, die in XPath definiert wird. Allerdings wird nur ein Teil der XPath-Syntax unterstützt.
Um einen Knoten in einem Baum zu referenzieren, stehen die nachfolgend erläuterten Möglichkeiten zur Verfügung.
Um einen Knoten direkt anzusprechen, können Sie ihn z. B. über /root/knoten ansprechen. Hierbei werden alle Knoten zurückgegeben, auf die dieser Pfad zutrifft. Sind mehrere gleichnamige Elemente hintereinander platziert, können Sie die Nummer des Elements in eckigen Klammern hinter dem Namen des Knotens angeben: /root/knoten[42]. Ein Zugriff auf ein Kind-Element eines Knotens ist leider nicht vorgesehen. Eine Konstruktion wie /root/knoten[42]/daten ist also unzulässig.
Um ein Element mit einem bestimmten Attribut zu finden, können Sie auf /root/knoten[@attribut] zurückgreifen. In diesem Fall würden nur die Knoten mit Namen knoten zurückgeliefert, die über das Attribut attribut verfügen. Sie können den Zugriff noch weiter einschränken, indem Sie definieren, welchen Wert ein Attribut haben soll. Dieser wird mit einem Gleichheitszeichen an den Namen des Attributs angehängt: /root/knoten[@attribut="wert"].
Die folgenden Beispiele beziehen sich auf diese XML-Datei:
<personen> <person /> <person geschl='m'>Meier</person> <person geschl='m'>Jansen</person> <person geschl='f'>Petersen</person> </personen>
Listing 23.17 Die Beispieldatei data.xml
Die Datei ist natürlich deutlich kleiner als die Dateien, für die XML_Indexing gedacht ist, aber für Demonstrationszwecke reicht sie aus.
Um die Inhalte der person-Elemente auszulesen, wäre folgender Code ausreichend:
require_once('XML/Indexing/Reader.php'); // XML-Datei einlesen $reader = new XML_Indexing_Reader ('data.xml'); // Daten finden $reader->find('/personen/person'); // Daten als Strings auslesen $daten = $reader->fetchStrings(); // Daten ausgeben foreach ($daten as $key => $value) { echo "Datensatz Nr. $key: $value<br />"; }
Listing 23.18 Auslesen aller person-Knoten
Die Ausgabe von Listing 23.18 sieht so aus:
Datensatz Nr. 0: Datensatz Nr. 1: Meier Datensatz Nr. 2: Jansen Datensatz Nr. 3: Petersen
Es werden also alle Datensätze inklusive des leeren Elements zurückgegeben. Wären innerhalb der person-Elemente noch weitere Elemente enthalten, so würden diese ignoriert.
Die Methode fetchStrings() gibt immer ein Array zurück. Der Code
// Einbinden der Datei und Objekt-Ableitung $reader->find('/personen/person[2]'); // Daten als Strings auslesen $daten = $reader->fetchStrings(); echo $daten[0];
gibt den Namen Meier aus. Bitte beachten Sie hierbei, dass XPath nicht nullbasierend auf Knoten zugreift, sondern die Elemente mit der Zahl 1 beginnend durchnummeriert.
Mit dem Ausdruck /personen/person[@geschl] würden die Namen Meier, Jansen und Petersen zurückgegeben, und bei /personen/person [@geschl="f"] wäre Petersen der einzige Rückgabewert.
Wenn Sie ein wenig mehr Flexibilität wünschen, können Sie auch ein Array mit DOM-Elementen auslesen. In dem Fall stehen Ihnen alle Methoden zur Verfügung, die PHP kennt, um DOMElement-Objekte zu verarbeiten. (http:// www.php.net/dom).
Um die gefundenen Elemente als DOMElement-Objekte auszulesen, ersetzen Sie die Methode fetchStrings() durch die Methode fetchDomNodes().
require_once('XML/Indexing/Reader.php'); $reader = new XML_Indexing_Reader ('data.xml'); $reader->find('/personen/person[@geschl]'); $daten = $reader->fetchDomNodes(); foreach ($daten as $node) { echo "<p>Element: $node->nodeName<br />"; echo "Name: $node->nodeValue<br />"; echo 'Geschlecht: '.$node->getAttribute('geschl').'</p>'; }
Listing 23.19 Verarbeitung mithilfe von DOM
Die Verarbeitung von Elementen, die zu einem Namensraum gehören, stellt kein Problem dar. Sie geben den Namensraum einfach mit in den XPath-Pfad ein. Sind die Namensräume korrekt deklariert, können Sie diese mit der Methode getNamespaces() auslesen. Sie liefert die Namen und URIs der Namespaces als Array zurück.