Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 23 XML
  gp 23.1 XML_Util
  gp 23.2 XML_Beautifier
  gp 23.3 XML_RSS
  gp 23.4 XML_Tree
  gp 23.5 XML_DTD
  gp 23.6 XML_Parser
  gp 23.7 XML_Wddx
  gp 23.8 XML_Serializer
  gp 23.9 XML_Indexing


Rheinwerk Computing

23.9 XML_Indexing  toptop


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.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de