21. August 2007 XSLT als Template Engine in PHP - Teil 2
Tags: DOM, PHP, Template Engine, XML & Co, XSLT
Im zweiten Teil dieser Reihe geht es heute um die dynamische Generierung von XML–Daten, damit wir sie später für die Template Engine nutzen können. Du solltest bereits den ersten Teil dieser Reihe gelesen haben.
Voraussetzungen
Seit PHP5 stellt die DOM Extension alle Funktionen bereits, die wir benötigen um mit XML–Daten zu arbeiten oder welche selbst zu erzeugen. Die DOM Extension ist standardmäßig aktiviert und sollte deshalb in den allermeisten Fällen auch verfügbar sein.
Array to XML
Für die Template Engine kann es später ganz praktisch sein, wenn wir unsere Daten, die wir zum Beispiel aus einer Datenbank ausgelesen haben, in einem Array ablegen und am Ende dieses Array in XML umwandeln. Genau so gut könnte man auch eine spezielle Klassen schreiben, die als eine Art Container für sämtliche Daten fungiert. Der Einfachheit halber beschränke ich mich aber in diesem Beispiel auf ein einfaches PHP Array.
Wir wollen Arrays mit beliebig vielen Verschachtelungen zulassen um später auch alle Daten gut strukturieren zu können:
$data = array( 'node1' => array('node1.1' => 'value1.1'), 'node2' => 'value2' );
Mit dem folgenden Script erstellen wir unser XML–Dokument:
$xml = new DomDocument('1.0', 'UTF-8'); $root = $xml->createElement('root'); $root = $xml->appendChild($root); generateXMLNode($data, $root, $xml); echo $xml->saveXML();
$xml ist ein Objekt der Klasse DomDocument, deren Konstruktor zwei Parameter erwartet. Einmal die gewünschte XML–Version (hier 1.0) und die Kodierung (hier UTF-8). Ein XML–Dokument besitzt immer exakt ein oberstes Element, weshalb wir dieses gleich mit »createElement()« erzeugen und anschließen mit »appendChild()« in das XML–Dokument einfügen. Alle weiteren Elemente fügen wir dann $root hinzu. Bevor wir mit »saveXML()« das XML generieren und es dann ausgeben rufen wir die Funktion »generateXMLNode()« auf.
generateXMLNode wird aus dem $data–Array die XML–Daten erzeugen:
function generateXMLNode($data, $root, $document) { if(is_array($data)) { foreach($data as $key => $value) { $node = $document->createElement($key); $node = $root->appendChild($node); generateXMLNode($value, $node, $document); } } else { $node = $document->createTextNode($data); $node = $root->appendChild($node); } }
Diese Funktionen arbeitet das Array rekursiv ab. Die Funktion ruft sich deshalb solange selbst auf bis $data kein Array mehr ist sondern nur noch einen Wert enthält den wir in das aktuelle Element einfügen möchten. Dies geschieht mit Hilfe der Methode »createTextNode()« die ein TextNode erzeugt ansonsten aber genau gleich funktioniert wie »createElement()«.
Nun können wir aus einem Array on–the–fly ein XML–Dokument erzeugen. Das ganze PHP–Script gibt es hier: dom_example.phps
Ausblick
Im dritten Teil erkläre ich dann wie die XSLT–Stylesheets aufgebaut werden, um sie möglichst flexibel einsetzen zu können.
weiter zum dritten Teil dieser Beitragsreihe »
Ähnliche Artikel
Der Beitrag wurde am Dienstag, den 21. August 2007 um 14:17 Uhr veröffentlicht und wurde unter PHP, XML & Co abgelegt. du kannst die Kommentare zu diesen Eintrag durch den RSS 2.0 Feed verfolgen. du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

Hallo Mario,
leider überprüft die Funktion generateXMLNode() nicht den Wert $key in der foreach()-Schleife. Dies führt bei Arrays mit Integer-Keys zu einer Exception im DOMdocument, denn eine XMLnode muss laut Spezifikation mit einem Buchstaben beginnen. Mit einer einfachen If-Abfrage in der Schleife funktioniert es dann aber trotzdem:
Viele Grüße,
Cedric
PS: Schöne Seite und gute Tutorials übrigens. Besonders die über XSLT :-)
Dein Blog hat meinen Quellcode entfernt, na dann nochmal:
if (is_numeric($key))
{
$key = “unbenannt_” + (string) $key;
}
Danke für den Hinweis, dieser Bug ist mir in der Tat noch nicht aufgefallen.