Signatur
Beschreibung
XMLWriter ist eine PHP-Klasse, die das schrittweise Erzeugen von XML-Dokumenten ermöglicht. Im Gegensatz zu DOM-basierten Ansätzen arbeitet XMLWriter als Push-Writer – die XML-Ausgabe wird sequenziell generiert, ohne dass der gesamte Dokumentbaum im Speicher vorgehalten werden muss. Dies macht die Klasse besonders geeignet für große XML-Dokumente oder Streams.
Die Klasse kann sowohl in einen internen Puffer (openMemory()) als auch direkt in eine Datei (openURI()) schreiben. Typische Anwendungsfälle sind das Erzeugen von RSS-Feeds, SOAP-Nachrichten, Office-Open-XML-Dateien, Sitemap-Dateien oder beliebiger strukturierter XML-Daten für APIs und Datenaustauschformate.
Die wichtigsten Methoden lassen sich in Gruppen einteilen: Dokument-Initialisierung (openMemory, openURI, startDocument), Element-Erzeugung (startElement, endElement, writeElement), Attribut-Erzeugung (startAttribute, writeAttribute), Textinhalte (text, writeCdata) sowie Namensraum-Unterstützung (startElementNs, writeAttributeNs).
Neben der objektorientierten API existiert eine äquivalente prozedurale Schnittstelle (z. B. xmlwriter_open_memory()). Für neue Projekte empfiehlt sich jedoch die OOP-Variante. Die Klasse erzeugt stets wohlgeformtes XML; eine Schema-Validierung muss separat erfolgen, z. B. mit DOMDocument::schemaValidate().
Beispiele
Einfaches XML-Dokument in den Speicher schreiben
<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->setIndentString(' ');
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('bibliothek');
$writer->startElement('buch');
$writer->writeAttribute('id', '1');
$writer->writeElement('titel', 'PHP Handbuch');
$writer->writeElement('autor', 'Max Mustermann');
$writer->endElement(); // buch
$writer->startElement('buch');
$writer->writeAttribute('id', '2');
$writer->writeElement('titel', 'XML für Profis');
$writer->writeElement('autor', 'Erika Musterfrau');
$writer->endElement(); // buch
$writer->endElement(); // bibliothek
$writer->endDocument();
echo $writer->outputMemory();
XML mit Namensräumen direkt in eine Datei schreiben
<?php
$writer = new XMLWriter();
$writer->openURI('/tmp/ausgabe.xml');
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
// Root-Element mit Namensraum
$writer->startElementNs('ns', 'katalog', 'https://example.com/ns/1.0');
$writer->startElementNs('ns', 'produkt', null);
$writer->writeAttributeNs('ns', 'sku', null, 'P-0042');
$writer->writeElement('ns:name', 'PHP-Buch');
$writer->writeElement('ns:preis', '29.99');
$writer->endElement(); // ns:produkt
$writer->endElement(); // ns:katalog
$writer->endDocument();
// Datei schließen / Puffer leeren
$writer->flush();
echo "XML-Datei erfolgreich geschrieben.\n";
CDATA-Abschnitt und Kommentare einfügen
<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('root');
$writer->writeComment('Dieses Element enthält HTML-Inhalt');
$writer->startElement('inhalt');
$writer->writeCdata('<p>Hallo <strong>Welt</strong></p>');
$writer->endElement();
$writer->endElement(); // root
$writer->endDocument();
echo $writer->outputMemory();
// Wichtig · Fallstricke
Speicherverwaltung: Bei sehr großen Dokumenten sollte openURI() statt openMemory() verwendet werden, um Speicherüberläufe zu vermeiden. Mit outputMemory(true) kann der interne Puffer nach dem Auslesen geleert werden.
Wohlgeformtheit: XMLWriter stellt keine automatische Validierung sicher — es liegt in der Verantwortung des Entwicklers, öffnende und schließende Tags korrekt zu verschachteln. Ein fehlendes endElement() führt zu ungültigem XML.
Sonderzeichen: Text, der über text() oder writeElement() eingefügt wird, wird automatisch XML-kodiert (z. B. &, <). Soll roher Markup-Inhalt eingefügt werden, muss writeCdata() verwendet werden.
PHP 8.0+: Ab PHP 8.0 ist XMLWriter als vollständige Klasse implementiert; davor war sie intern als Ressource aufgebaut. Die prozedurale API (xmlwriter_*-Funktionen) ist weiterhin verfügbar, gilt aber als veraltet für neue Projekte.