Start · Sprachen · PHP · Referenz · xmlwriter_start_cdata

xmlwriter_start_cdata

Funktion

Beginnt einen CDATA-Abschnitt im XML-Dokument, der mit <code>xmlwriter_end_cdata()</code> abgeschlossen werden muss.

seit PHP 5.1.2 Kategorie: xml

Signatur

xmlwriter_start_cdata(XMLWriter $writer): bool

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

Typ
bool
Beschreibung
Gibt 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);
<?xml version="1.0" encoding="UTF-8"?> <content><![CDATA[<p>Hallo <strong>Welt</strong> & Co.</p>]]></content>

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);
<?xml version="1.0" encoding="UTF-8"?> <query id="getUsersQuery"><![CDATA[SELECT id, name FROM users WHERE age > 18 AND status = 'active']]></query>

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