
Die Extensible Markup Language (XML) ist ein vom World Wide Web Consortium (W3C) definierter Standard für strukturierte Dokumente als Basis für Webseiten sowie für den Austausch von strukturierten Daten im Web. PHP verfügt über Schnittstellen zu mehreren Softwarepaketen, die XML-Daten analysieren, erzeugen und verarbeiten können.
Für das einfache Parsen von XML-Dokumenten bietet sich die Verwendung des in PHP 4 integrierten XML-Parsers expat an (Voraussetzung beim Kompilieren ist die Option -with-xml). Wem dessen Event-basierte Verarbeitung nicht ausreicht, dem stellt die DOM-XML-Erweiterung eine Baumrepräsentation der Daten zur Verfügung. Die Funktionen der DOM-XML-Erweiterung basieren auf libxml, einer Bibliothek die unter anderem im Gnome-Projekt zum Einsatz kommt. Mit diesen Funktionen ist es auch möglich, XML-Strukturen einfach zu erzeugen. Diejenigen, die die API von Qt für den Zugriff auf XML-Daten mit Hilfe des Document Object Model (DOM) der von Gnome (libxml) vorziehen, finden in PHP 4 auch eine Schnittstelle zu Qt-DOM.
Neben den bereits genannten Funktionen zum Erstellen und Parsen von XML bietet PHP 4 dank der Integration von Sablotron Funktionen zur Transformation von Dokumenten aus einem XML-Format in ein anderes entsprechend der Transformationssprache für XML. XSLT - kurz für XSL-Transformationen - ist die vom W3C entwickelte Sprache für die Konvertierung von XML-Dat(ei)en in ein anderes Format. Die Links zu den soeben angesprochenen Tools finden sich im Kasten Online-Ressourcen.
Die in diesem Artikel vorgestellten Beispiele basieren auf der von OASIS verwalteten DocBook-DTD, einer Dokumenttypdefinition, die den De-facto-Standard für die Erstellung technischer Dokumentation und Bücher mit XML darstellt. Zum Beispiel wird die PHP-Dokumentation in DocBook geschrieben.
Zunächst zu expat. Das in Listing 1 wiedergegebene Skript demonstriert das Grundprinzip des Event-basierten Parsens von XML-Dokumenten mit PHP - das sich, was expat angeht, nicht wesentlich von der Vorgehensweise mit Perl unterscheidet (siehe dazu [1]). Der erste Teil des Skripts definiert drei Funktionen, wobei jede der Funktionen für ein bestimmtes Ereignis (Event) verantwortlich ist: start_element() soll später durchlaufen werden, wenn der Parser auf einen öffnenden Element-Tag trifft, end_element() bei schließenden Tags und daten() im Falle von CDATA-Datenbereichen (in sich nicht weiter strukturierte Textdaten). Im zweiten Teil des Skripts wird zunächst der Parser erzeugt und mit den drei genannten Funktionen für die entsprechenden Ereignisse initialisiert. Danach liest der XML-Parser die zu analysierende Datei expat_beispiel.xml (Listing 2) zeilenweise aus und verarbeitet sie, was in diesem Beispiel nur eine einfache Ersetzung der DocBook-Tags durch HTML-Tags bedeutet. Was der Parser wodurch ersetzen soll, enthält die zu Anfang von Listing 1 erzeugte $tag_tabelle. Für die CDATA-Bereiche ist einfach der Inhalt auszugeben (print $data;).
Aus der Datei expat_beispiel.xml generiert das Skript expat_beispiel.php die Ausgabe in Listing 3. Dabei müssen hier alle Elementnamen in Großbuchstaben erscheinen (siehe die $tag_tabelle), weil in xml_parser_set_option XML_OPTION_CASE_FOLDING auf true gesetzt ist. Wer sich auf XHTML als Zielformat vorbereitet - dort müssen die Elemente in Kleinbuchstaben gehalten sein -, braucht true nur durch false zu ersetzen.
Ganz anders sieht die Herangehensweise aus, wenn es um DOM-XML gehen soll. expat und xmllib lassen sich parallel in PHP vorhalten; sie beißen sich nicht, weil alle expat-Funktionen das Präfix xml_ und viele der Gnome-Bibliothek das Präfix domxml_ enthalten. Einzubinden ist DOM-XML beim Kompilieren von PHP 4 durch die Option -with-dom=/usr/lib/, die besagt, wo die Gnome-Bibliothek liegt. Benötigt wird mindestens Version 2.2.7.
Hier seien zunächst die Funktionen new_xmldoc(), add_root() und new_child() der DOM-XML-Erweiterung betrachtet, mit denen man leicht XML-Strukturen aufbauen kann. Die Zeilen
$doc = new_xmldoc( "1.0" ); $root = $doc->add_root( "article" ); $artheader = $root->new_child( "artheader", "" ); $art_title = $artheader->new_child( "title", "Ein Artikel in DocBook" );
in Listing 3 erzeugen, ausgehend von $doc, das ein XML-Dokument der Version 1.0 initialisiert, ein Wurzelelement (article) sowie darin einen artheader, der seinerseits anschließend einen Titel zugewiesen bekommt. Dies lässt sich naturgemäß beliebig tief weiterführen.
Listing 4 zeigt die Ausgabe von Listing 3. Im weiteren Verlauf des Artikels sei vorausgesetzt, dass die Datei artikel.xml wie Listing 2 aussieht.
Nicht alle Funktionen in DOM-XML besitzen das oben genannte Präfix. xmltree (siehe Listing 5) erzeugt aus der Datei artikel.xml eine Baumdarstellung und gibt diese mit Hilfe der PHP-Funktion print_r() aus. Anhand der Ausgabe von print_r() kann man die Baumstruktur erkennen, auf der sich recht einfach arbeiten lässt, indem man die Array-Struktur der XML-Objekte rekursiv durchläuft.
|
xmltree: Auf einfache Weise lässt sich der Dokumentbaum darstellen (Abb. 1). |
Leider ist der XSLT-Prozessor Sablotron in der aktuellen Version nicht in der Lage, die offiziellen DocBook-XSLT-Stylesheets zu verarbeiten. Aus diesem Grund dient für XSL-Transformationen mit PHP ein eigenes Stylesheet, der obiges Beispiel in HTML wandelt (siehe Listing 6).
Listing 7 wiederum enthält das PHP-Skript, das den Inhalt der Datei artikel.xml mit der XSL-Stylesheet-Datei artikel.xsl transformiert. Die Integration von Sablotron in den Output-Buffering-Mechanismus von PHP ermöglicht, was Listing 9 andeutet: die ganze Transformation in xslt_output_begintransform(artikel.xsl) und xslt_output_endtransform() zu kapseln.
Diese Methode der Transformation ist nützlich, wenn man ein PHP-Skript hat, das - zum Beispiel mit Hilfe der DOM-XML-Funktionen - eine XML-Struktur zur Laufzeit erzeugt, die transformiert ausgegeben werden soll.
Die erste Generation von Internetseiten bot nur statische Inhalte, die in der zweiten Generation um kleinere dynamische Elemente erweitert wurden. Momentan trifft man im Internet, vor allem bei E-Commerce-orientierten Angeboten auf die dritte Generation: vollständig dynamische generierte Inhalte. Doch schon zeichnet sich der nächste Evolutionsschritt am Horizont ab: Die Tendenz geht hin zu richtigen Webanwendungen, das bisherige Frontend Internet wird in die Backend-Architektur der Firmen integriert und so unter anderem mit der Warenwirtschaft verbunden.
Techniken wie BMEcat-XML, RDF oder XML-RPC ermöglichen die Kommunikation zwischen Internetseiten und die Distribution von Inhalten, wie Katalogdaten oder Nachrichten. Ebenfalls auf XML basierend ermöglicht WDDX den Austausch von Datenstrukturen zwischen unterschiedlichen Programmiersprachen. Während PHP 4 das Bereitstellen und Verarbeiten von WDDX-Datenpaketen mit nativen Funktionen beherrscht, muss man sich um die Verarbeitung der anderen Formate selbst kümmern.
Sebastian Bergmann
studiert Informatik in Bonn, ist sowohl in der deutschsprachigen PHP-Gemeinde aktiv als auch an der Entwicklung von PHP selbst beteiligt und entwickelt die Software phpOpenTracker.
Literatur
[1] Christian Kirsch; Perl-Know-how; Elemente mit System; XML-Parser für Perl-Scripts
Dieser Text ist der Zeitschriften-Ausgabe 04/2001 von iX entnommen.
Parallelprogrammierung - die Kunst der Multi-Core-Nutzung
Agile ALM - agile Praktiken im Application Lifecycle Management
Webentwicklung - Applikationen für mobile Clients