25.12 xmlwriter 

Version: 0.2 | Lizenz: PHP-Lizenz 3.0 |
Der xmlwriter ist ein Paket, mit dem Sie sehr einfach und schnell XML-Dokumente erstellen können. Ähnlich wie der xmlreader verzichtet das Paket auf überflüssige Funktionalitäten und ist bereits für PHP 5 geschrieben. Ein wichtiger Unterschied zwischen den beiden Paketen ist allerdings, dass xmlwriter nicht objektorientiert, sondern prozedural arbeitet.
Um ein neues Dokument zu erstellen, initialisieren Sie den xmlwriter erst mit der Funktion xmlwriter_open_memory(). Die Funktion initialisiert einen Speicherbereich und liefert eine Referenz darauf zurück, die Sie später an die anderen Funktionen übergeben müssen.
Die Funktion xmlwriter_start_document() bekommt die Referenz, die xmlwriter_open_memory() zurückgeliefert hat, als ersten Parameter übergeben und fügt die XML-Deklaration <?xml version="1.0" ?> in das Dokument ein. Optional können Sie der Methode als zweiten Parameter noch eine Versionsnummer übergeben, die dann an Stelle der 1.0 genutzt wird.
Nachdem Sie diese Funktion aufgerufen haben, können Sie die XML-Elemente einfügen. Im einfachsten Fall nutzen Sie die Funktion xmlwriter_write_element(). Diese bekommt nach der Speicherreferenz den Namen des Tags sowie den eigentlichen Inhalt des Elements übergeben.
$mem = xmlwriter_open_memory(); if (false == $mem) { die ("Konnte keinen Speicher reservieren"); } xmlwriter_start_document($mem,"1.1"); xmlwriter_write_element($mem,"daten","Hallo Welt ;-)"); xmlwriter_end_document($mem); $xml_data=xmlwriter_output_memory($mem); file_put_contents('daten.xml',$xml_data);
Listing 25.15 Schreiben von Daten mit dem xmlwriter
Nachdem die Daten geschrieben worden sind, rufen Sie die Funktion xmlwriter_end_document() zum Finalisieren des Vorgangs und die Funktion xmlwriter_output_memory() auf, die Ihnen die XML-Daten als String zurückgibt. Diese können Sie dann auf dem Bildschirm ausgeben, in einer Datei speichern oder anderweitig nutzen. Listing 25.15 erzeugt diese Datei:
xmlwriter_write_element() erzeugt ein Element, das einen Wert enthält. Damit ist es also nicht möglich, Elemente ineinander zu verschachteln. Um ein Element zu öffnen, das erst später geschlossen wird, nutzen Sie die Funktion xmlwriter_start_element() und übergeben ihr die Speicherreferenz und danach den Namen des Elements. Um das Tag wieder zu schließen, ist die Funktion xmlwriter_end_element() vorgesehen. Sie bekommt nur die Referenz übergeben. Sollten mehrere Tags geöffnet sein, so schließt die Funktion immer das Tag, das zuletzt geöffnet wurde. Sollten Sie vergessen, ein Element zu schließen, so erledigt das Paket das selbstständig. Mit den folgenden Zeilen würden die Elemente vorname und nachname in das Tag person verschachtelt:
xmlwriter_start_element($mem,"person"); xmlwriter_write_element($mem,"vorname","Jake"); xmlwriter_write_element($mem,"nachname","Ganymede"); xmlwriter_end_element($mem);
Haben Sie ein Element auf diesem Weg geöffnet, können Sie jederzeit einen Text oder eine CDATA-Section hinzufügen. xmlwriter_text() gibt einen Text direkt aus. Um eine CDATA-Section zu erzeugen, gibt es zwei Möglichkeiten. Zum Ersten können Sie die Daten direkt ausgeben, indem Sie die Funktion xmlwriter_write_cdata() nutzen. Diese bekommt die schon bekannte Speicher-Ressource als ersten Parameter übergeben und als zweiten die Daten, die ausgegeben werden sollen. Die zweite Variante ist, die CDATA-Section mit xmlwriter_start_cdata() zu öffnen und mit xmlwriter_end_cdata() wieder zu schließen. Dazwischen können Sie die eigentlichen Daten dann mit der Funktion xmlwriter_text() ausgeben.
Einem Tag ein Attribut hinzuzufügen stellt kein Problem dar. Die Methode xmlwriter_write_attribute() bekommt nach der Speicher-Ressource den Namen und den Wert des Attributs übergeben. Wenn Sie nach einem xmlwriter_start_element() die Zeile
xmlwriter_write_attribute($mem,"attr","wert");
aufrufen, wird attr="wert" mit in das öffnende Tag eingefügt.
Mithilfe von xmlwriter_write_comment() können Sie einen Kommentar ausgeben, der der Funktion als zweiter Parameter übergeben wird.
Die Klasse sieht auch Möglichkeiten vor, DTDs, Processing Instructions und Name-Spaces zu nutzen. Allerdings funktionieren diese zurzeit noch nicht perfekt, so dass ich nicht darauf eingehe. Die Funktionsweise ist jedoch sehr stark an die erläuterten Funktionen angelehnt.