Signatur
Beschreibung
xmlwriter_start_cdata() öffnet einen CDATA-Abschnitt (<![CDATA[) im aktuellen XML-Ausgabestrom. CDATA-Abschnitte ermöglichen es, Zeichenfolgen zu übertragen, die XML-Sonderzeichen wie <, > oder & enthalten, ohne dass diese escaped werden müssen.
Nach dem Aufruf dieser Funktion wird der eigentliche Inhalt des CDATA-Blocks mit xmlwriter_text() geschrieben. Der Abschnitt muss anschließend zwingend mit xmlwriter_end_cdata() geschlossen werden, um wohlgeformtes XML zu erzeugen.
CDATA-Abschnitte sind besonders nützlich, wenn größere Textblöcke mit vielen Sonderzeichen – beispielsweise HTML-Code, JavaScript oder SQL-Abfragen – als XML-Inhalt eingebettet werden sollen. Dadurch entfällt die aufwendige manuelle Maskierung aller Sonderzeichen.
Die Funktion arbeitet mit dem prozeduralen XMLWriter-Stil. Das objektorientierte Äquivalent ist XMLWriter::startCdata().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $writer Pflicht | XMLWriter | Die XMLWriter-Instanz, auf der der CDATA-Abschnitt geöffnet werden soll. Diese wird zuvor mit xmlwriter_open_memory() oder xmlwriter_open_uri() erstellt. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn der Writer-Kontext ungültig ist oder kein offenes Element vorhanden ist, in das der CDATA-Block eingefügt werden könnte).Beispiele
HTML-Code in einem CDATA-Block einbetten
<?php
$writer = xmlwriter_open_memory();
xmlwriter_set_indent($writer, true);
xmlwriter_set_indent_string($writer, ' ');
xmlwriter_start_document($writer, '1.0', 'UTF-8');
xmlwriter_start_element($writer, 'content');
// CDATA-Block starten
xmlwriter_start_cdata($writer);
// Inhalt mit Sonderzeichen schreiben – kein Escaping nötig
xmlwriter_text($writer, '<p>Hallo <strong>Welt</strong> & Co.</p>');
// CDATA-Block schließen
xmlwriter_end_cdata($writer);
xmlwriter_end_element($writer);
xmlwriter_end_document($writer);
echo xmlwriter_output_memory($writer);
SQL-Abfrage als CDATA in XML speichern
<?php
$writer = xmlwriter_open_memory();
xmlwriter_set_indent($writer, true);
xmlwriter_set_indent_string($writer, ' ');
xmlwriter_start_document($writer, '1.0', 'UTF-8');
xmlwriter_start_element($writer, 'query');
xmlwriter_write_attribute($writer, 'id', 'getUsersQuery');
xmlwriter_start_cdata($writer);
xmlwriter_text($writer, "SELECT id, name FROM users WHERE age > 18 AND status = 'active'");
xmlwriter_end_cdata($writer);
xmlwriter_end_element($writer);
xmlwriter_end_document($writer);
echo xmlwriter_output_memory($writer);
// Wichtig · Fallstricke
Wichtig: Der Inhalt eines CDATA-Blocks darf die Zeichenfolge ]]> nicht enthalten, da diese das Ende des CDATA-Abschnitts signalisiert. Enthält der zu schreibende Text diese Sequenz, muss er aufgeteilt oder anderweitig behandelt werden.
CDATA-Abschnitte sind kein Sicherheitsmechanismus – sie verhindern kein XML-Injection, wenn die Eingabe nicht zuvor validiert wurde. Benutzereingaben sollten vor dem Einbetten in CDATA-Blöcke stets auf die Sequenz ]]> geprüft werden.
Ab PHP 8.0 wird der XMLWriter-Kontext als echtes Objekt übergeben; in älteren Versionen war es eine Ressource.