Start · Sprachen · PHP · Referenz · XMLWriter

XMLWriter

Klasse

Bietet eine objektorientierte (und prozedurale) Schnittstelle zum effizienten Erzeugen wohlgeformter XML-Dokumente.

seit PHP 5.1.2 Kategorie: xml

Signatur

class XMLWriter

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 version="1.0" encoding="UTF-8"?> <bibliothek> <buch id="1"> <titel>PHP Handbuch</titel> <autor>Max Mustermann</autor> </buch> <buch id="2"> <titel>XML für Profis</titel> <autor>Erika Musterfrau</autor> </buch> </bibliothek>

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";
XML-Datei erfolgreich geschrieben.

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();
<?xml version="1.0" encoding="UTF-8"?> <root> <!--Dieses Element enthält HTML-Inhalt--> <inhalt><![CDATA[<p>Hallo <strong>Welt</strong></p>]]></inhalt> </root>

// 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.