Dynamische Erstellung von XML-Dokumenten mit PHP DOM

(http://www.zdnet.de/magazin/39152555/dynamische-erstellung-von-xml-dokumenten-mit-php-dom.htm)

von Gastautor, 13. März 2007

Mit der PHP DOM API kann man von Grund auf vollständige, gut formatierte XML-Dokument erzeugen. Die Einführung erklärt die Arbeit mit der Anwendungsschnittstelle Schritt für Schritt an einem Beispiel.

Wenn Entwickler mit XML-basierten Anwendungen arbeiten, besteht dabei oft die Anforderung, spontan Datenstrukturen im XML-Code[1] zu erstellen. Beispiel hierfür ist etwa ein XML-Bestell-Template, das der Benutzer in Web-Darstellung vorgegeben hat. Ein anderes Beispiel wäre eine XML-Darstellung eines Serverrequests oder einer Antwort des Clientsystems, das auf Laufzeitparametern basiert.

Obwohl diese Aufgabe schwierig erscheint, ist sie in Wirklichkeit ganz einfach, wenn man das ausgefeilte DOM API von PHP[2] für die Erstellung und Bearbeitung von dynamischen Knoten verwendet.

Hinweis: Dieser Artikel setzt eine laufende Apache- und PHP5-Installation mit aktivierten DOM-Funktionen voraus, außerdem Erfahrung mit den XML-Basisstrukturen wie Elementen, Attributen und CDATA-Blöcken.

Eine Doctype-Deklaration anlegen

Am Anfang eines XML-Projekts steht die XML-Deklaration. In PHP sie recht einfach: Man muss nur ein Objekt der "DOMDocument"-Klasse initialisieren und ihm eine Versionsnummer geben. Wie das gemacht wird, ist in Listing A zu sehen.

Es empfiehlt sich, dass man sich die saveXML()-Methode des DOMDocument-Objekts merkt. Darauf wird später eingegangen. Im Moment reicht es zu wissen, dass mit dieser Methode ein aktueller Schnappschuss des XML-Baums in einer Datei oder im Browser erzeugt werden kann. In diesem Fall wurde der Output als ASCII-Text direkt an den Browser geschickt, damit er besser lesbar ist. In der realen Anwendungsumgebung würde man wahrscheinlich den folgenden Content-Type benutzen: text/xml header.

Das Ergebnis im Browser sollte etwa so aussehen:


<?xml version="1.0"?>

Das ist bis jetzt alles recht schön, aber die Mächtigkeit von XML zeigt sich in seinen Elementen und deren Inhalt. Zum Glück wird alles extrem einfach, wenn man erst das Basis-DOMDocument initialisiert hat. Dies geschieht in zwei Schritten:

1. Für jedes Element oder jeden Textknoten, den man hinzufügen möchte, muss die für das DOMDocument-Objekt spezifische createElement()- beziehungsweise createTextNode()-Methode mit dem entsprechenden Elementnamen oder Textinhalt aufgerufen werden. Damit wird ein neues Objekt, Element oder Textknoten erzeugt.
2. Im zweiten Schritt hängt man das Element oder den Textknoten an den Elternknoten im XML-Baum, indem man für diesen Knoten die appendChild()-Methode aufruft und ihr das Objekt aus dem vorangegangenen Schritt übergibt.

An einem Beispiel kann das anschaulicher werden. Dies ist im Skript in Listing B dargestellt.

Hier wurde zunächst ein Root-Element mit Namen <toppings> erzeugt und an den XML-Header angehängt. Danach wurde ein Element <item> erzeugt und an das Root-Element angehängt. Zum Schluss wurde ein Textknoten mit dem Wert "pepperoni" erzeugt und an das Element <item> angehängt. Das Ergebnis sieht folgendermaßen aus:


<?xml version="1.0"?>
<toppings>
<item>pepperoni</item>
</toppings>

Soll ein weiteres "topping"-Element hinzugefügt werden, braucht man nur ein anderes <item> anzulegen und ihm einen anderen Inhalt geben (Listing C).

Hier ist das veränderte Ergebnis:


<?xml version="1.0"?>
<toppings>
<item>pepperoni</item>
<item>tomato</item>
</toppings>

Durch gezielte Benutzung von Attributen können weitere qualifizierende Informationen zu den Elementen hinzugefügt werden. Mit dem PHP DOM API braucht man dafür zwei Schritte. Zuerst wird mit der createAttribute()-Methode des DOMDocument-Objekts ein Attributknoten mit dem Namen des Attributs angelegt. Anschließend wird ein Textknoten darangehängt, der den Attributwert enthält. Listing D ist ein Beispiel dafür.

Und so sieht das Ergebnis aus:


<?xml version="1.0"?>
<toppings>
<item price="4">pepperoni</item>
</toppings>

CDATA-Blöcke und Processing Instructions hinzufügen

Obwohl nicht so oft benutzt, werden CDATA-Blöcke und Processing Instructions (PI) vom PHP API gut durch die createCDATASection()- und createProcessingInstruction()-Methoden des DOMDocument-Objekts unterstützt. Listing E enthält ein Beispiel dafür.

Hier ist das Ergebnis:



pepperoni



Speicherung der Ergebnisse

Wurde die Baumstruktur wie gewünscht erzeugt, kann sie entweder in eine Datei oder in einer PHP-Variablen abgespeichert werden. Ersteres geschieht durch den Aufruf einer save()-Methode mit einem Dateinamen, letzteres durch den Aufruf der saveXML()-Methode mit anschließender Zuweisung des Ergebnisses zu einem String.

URLs in diesem Artikel:
[1] = http://www.w3.org/XML/
[2] = http://de.wikipedia.org/wiki/PHP