Start · Sprachen · PHP · Referenz · Dom\CDATASection

Dom\CDATASection

Klasse

Repräsentiert einen CDATA-Abschnitt (<code>&lt;![CDATA[...]]&gt;</code>) in einem XML-Dokument und ermöglicht das Einbetten von Rohtext ohne XML-Escaping.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\CDATASection extends Dom\Text

Beschreibung

Dom\CDATASection ist Teil der modernen, namespaced DOM-Erweiterung (PHP 8.4+) und repräsentiert einen CDATA-Abschnitt in einem XML-Dokument. CDATA-Abschnitte ermöglichen das Einbetten von beliebigem Text – einschließlich Zeichen wie <, > und & – ohne dass diese XML-kodiert werden müssen. Der Parser behandelt alles innerhalb von <![CDATA[...]]> als reinen Textinhalt.

Dom\CDATASection erbt von Dom\Text und damit auch von Dom\CharacterData und Dom\Node. Neue Instanzen werden nicht direkt über new erstellt, sondern über die Methode Dom\Document::createCDATASection() erzeugt und anschließend mit appendChild() oder insertBefore() in den Dokumentbaum eingefügt.

CDATA-Abschnitte sind ausschließlich in XML-Dokumenten gültig – in HTML5 werden sie nicht unterstützt und sollten daher nur in Kombination mit Dom\XMLDocument verwendet werden. Typische Anwendungsfälle sind das Einbetten von JavaScript oder CSS in XML-basierten Formaten wie SVG oder XSLT, ohne Sonderzeichen escapen zu müssen.

  • Zugriff auf den Textinhalt über die geerbte Eigenschaft data.
  • Manipulation über geerbte Methoden wie appendData(), insertData(), deleteData() und replaceData().
  • Die Zeichenkette ]]> darf innerhalb eines CDATA-Abschnitts nicht vorkommen, da sie den Abschnitt vorzeitig schließt.

Beispiele

CDATA-Abschnitt in ein XML-Dokument einfügen

<?php
$doc = Dom\XMLDocument::createEmpty();
$root = $doc->createElement('root');
$doc->appendChild($root);

$cdata = $doc->createCDATASection('<Hallo> & "Welt"');
$root->appendChild($cdata);

echo $doc->saveXML();
<?xml version="1.0" encoding="UTF-8"?> <root><![CDATA[<Hallo> & "Welt"]]></root>

CDATA-Inhalt auslesen und verändern

<?php
$xmlString = '<?xml version="1.0"?><script><![CDATA[if (a < b && b > 0) { alert(1); }]]></script>';
$doc = Dom\XMLDocument::createFromString($xmlString);

$scriptNode = $doc->getElementsByTagName('script')->item(0);
$cdataNode = $scriptNode->firstChild;

if ($cdataNode instanceof Dom\CDATASection) {
    echo 'Typ: CDATASection' . PHP_EOL;
    echo 'Inhalt: ' . $cdataNode->data . PHP_EOL;

    // Inhalt ersetzen
    $cdataNode->data = 'console.log("Ersetzt");';
    echo $doc->saveXML();
}
Typ: CDATASection Inhalt: if (a < b && b > 0) { alert(1); } <?xml version="1.0" encoding="UTF-8"?><script><![CDATA[console.log("Ersetzt");]]></script>

// Wichtig · Fallstricke

Nur für XML: CDATA-Abschnitte sind kein gültiges HTML5-Konstrukt. Verwende Dom\CDATASection ausschließlich mit Dom\XMLDocument, niemals mit Dom\HTMLDocument.

Verbotene Zeichenfolge: Die Sequenz ]]> darf nicht im Inhalt eines CDATA-Abschnitts vorkommen, da sie den Abschnitt vorzeitig schließt und zu einem Parsing-Fehler führt. PHP prüft dies nicht automatisch – es liegt in der Verantwortung des Entwicklers, solche Eingaben zu validieren oder aufzuteilen.

Klasse vs. Legacy-API: Diese Klasse gehört zur modernen Dom\-Namespace-API (PHP 8.4+). Die ältere DOMCdataSection-Klasse aus der ext/dom-Erweiterung bleibt weiterhin verfügbar, ist aber nicht identisch.