Start · Sprachen · PHP · Referenz · xmlwriter_write_cdata

xmlwriter_write_cdata

Funktion

Schreibt einen vollständigen <code>CDATA</code>-Block in den XML-Ausgabestrom des <code>XMLWriter</code>-Objekts.

seit PHP 5.1.2 Kategorie: xml

Signatur

xmlwriter_write_cdata(XMLWriter $writer, string $content): bool

Beschreibung

xmlwriter_write_cdata() fügt einen kompletten CDATA-Abschnitt in das XML-Dokument ein, das über den übergebenen XMLWriter aufgebaut wird. Ein CDATA-Abschnitt hat die Form <![CDATA[...]]> und ermöglicht es, beliebigen Text einzubetten, ohne dass darin enthaltene Sonderzeichen wie <, > oder & einzeln maskiert werden müssen.

Diese Funktion ist die prozedurale Entsprechung der objektorientierten Methode XMLWriter::writeCdata(). Sie kombiniert intern die drei Schritte StartCdata, Text und EndCdata in einem einzigen Aufruf und ist damit die bequemste Variante, wenn der gesamte Inhalt des CDATA-Blocks bereits als String vorliegt.

CDATA-Abschnitte eignen sich besonders für eingebetteten HTML-Code, JavaScript oder andere Inhalte, die XML-Sonderzeichen enthalten können, aber unverändert an den XML-Parser-Konsumenten weitergegeben werden sollen. Innerhalb eines CDATA-Abschnitts darf jedoch die Zeichenkette ]]> nicht vorkommen, da sie den Abschnitt vorzeitig beendet.

Seit PHP 8.0 wird XMLWriter als eigener Typhinweis unterstützt; in früheren Versionen wurde stattdessen eine resource übergeben.

Parameter

Name Typ Default Beschreibung
$writer Pflicht XMLWriter Das XMLWriter-Objekt (bzw. vor PHP 8.0 die entsprechende resource), in dessen Ausgabestrom der CDATA-Block geschrieben wird.
$content Pflicht string Der Textinhalt des CDATA-Abschnitts. Darf keine Zeichenfolge ]]> enthalten, da diese den Abschnitt vorzeitig beendet.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der CDATA-Block erfolgreich geschrieben wurde, andernfalls false.

Beispiele

Eingebetteten HTML-Code als CDATA in XML schreiben

<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('description');

// HTML-Inhalt mit Sonderzeichen direkt als CDATA einbetten
xmlwriter_write_cdata($writer, '<p>Dies ist <strong>fett</strong> & kursiv.</p>');

$writer->endElement();
$writer->endDocument();

echo $writer->outputMemory();
<?xml version="1.0" encoding="UTF-8"?> <description><![CDATA[<p>Dies ist <strong>fett</strong> & kursiv.</p>]]></description>

RSS-Feed mit CDATA-gesichertem Artikel-Inhalt erzeugen

<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('rss');
$writer->writeAttribute('version', '2.0');
$writer->startElement('channel');

$writer->startElement('item');
$writer->writeElement('title', 'Mein Artikel');

// Artikeltext kann beliebige HTML-/Sonderzeichen enthalten
$articleHtml = '<p>Preis: 5 &lt; 10 &euro; &ndash; <a href="http://example.com">mehr</a></p>';
$writer->startElement('description');
xmlwriter_write_cdata($writer, $articleHtml);
$writer->endElement(); // description

$writer->endElement(); // item
$writer->endElement(); // channel
$writer->endElement(); // rss
$writer->endDocument();

echo $writer->outputMemory();
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"><channel><item><title>Mein Artikel</title><description><![CDATA[<p>Preis: 5 &lt; 10 &euro; &ndash; <a href="http://example.com">mehr</a></p>]]></description></item></channel></rss>

// Wichtig · Fallstricke

Achtung: Der Inhalt des CDATA-Abschnitts darf die Zeichenkette ]]> nicht enthalten, da sie den Abschnitt vorzeitig schließt. PHP prüft dies nicht automatisch — prüfen Sie den Eingabe-String ggf. selbst mit str_contains($content, ']]>') und splitten Sie den Block notfalls auf.

Die Funktion xmlwriter_write_cdata() ist äquivalent zur Sequenz aus xmlwriter_start_cdata(), xmlwriter_text() und xmlwriter_end_cdata(). Wenn nur ein Teil des Inhalts in einen CDATA-Block gehört oder der Inhalt schrittweise aufgebaut wird, sind die separaten Funktionen flexibler.

Ab PHP 8.0 wurde die resource-basierte API durch eine echte XMLWriter-Klasse ersetzt. Die prozedurale Funktion funktioniert weiterhin, nimmt aber nun ein XMLWriter-Objekt entgegen.