PHP 8.4.6 Released!

DOMDocument::createCDATASection

(PHP 5, PHP 7, PHP 8)

DOMDocument::createCDATASectionCreate new cdata node

Description

public DOMDocument::createCDATASection(string $data): DOMCdataSection|false

This function creates a new instance of class DOMCDATASection. This node will not show up in the document unless it is inserted with (e.g.) DOMNode::appendChild().

Parameters

data

The content of the cdata.

Return Values

The new DOMCDATASection or false if an error occurred.

See Also

User Contributed Notes

info at troptoek dot com
17 years ago
A common issue seems to be adding javascript to CDATA and the browser throwing a javascript error. To ensure the javascript works use the following code when adding CDATA:

<?php
/**
* Append Caracter Data to a node and check for a javascript node
*
* @param DOMElement $appendToNode
* @param string $text
*/
function appendCdata($appendToNode, $text)
{
if (
strtolower($appendToNode->nodeName) == 'script') { // Javascript hack
$cm = $appendToNode->ownerDocument->createTextNode("\n//");
$ct = $appendToNode->ownerDocument->createCDATASection("\n" . $text . "\n//");
$appendToNode->appendChild($cm);
$appendToNode->appendChild($ct);
} else {
// Normal CDATA node
$ct = $appendToNode->ownerDocument->createCDATASection($text);
$appendToNode->appendChild($ct);
}
}
?>
The result should be:

<script type="text/javascript">
//<![CDATA[
function someJsText() {
document.write('Some js with <a href="#">HTML</a> content');
}
//]]></script>
loathsome
17 years ago
Here's a function that will create a CDATA-section around a string coming from SimpleXML.

<?php
function sxml_cdata($path, $string){
$dom = dom_import_simplexml($path);
$cdata = $dom->ownerDocument->createCDATASection($string);
$dom->appendChild($cdata);
}
?>
jesdisciple dot FOO at gmail dot BAR dot com
14 years ago
If you would like to refer to the documentation for the class of the returned object, see http://www.php.net/manual/en/class.domcharacterdata.php
Marc info[at]braincast.nl
14 years ago
Here's some code that takes an associative array and prints it asXML() but creates CDATA sections for each string

<?php
class SimpleXMLExtended extends SimpleXMLElement{
public function
addCData($string){
$dom = dom_import_simplexml($this);
$cdata = $dom->ownerDocument->createCDATASection($string);
$dom->appendChild($cdata);
}
}
function
assocArrayToXML($root_element_name,$ar){
$xml = new SimpleXMLExtended("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
$f = create_function('$f,$c,$a','
foreach($a as $k=>$v) {
if(is_array($v)) {
if (!is_numeric($k))$ch=$c->addChild($k);
else $ch = $c->addChild(substr($c->getName(),0,-1));
$f($f,$ch,$v);
} else {
if (is_numeric($v)){ $c->addChild($k, $v);
}else{$n = $c->addChild($k); $n->addCData($v);}
}
}'
);
$f($f,$xml,$ar);
return
$xml->asXML();
}

/* sample */
$result = array("title"=>"CDATA Sample");
$result['items'] = array();
$result['items'][] = array('title'=>'Some string', 'number' => 1);
$result['items'][] = array('title'=>'Some string', 'number' => 2);
$result['items'][] = array('title'=>'Some string', 'number' => 3);

echo
assocArrayToXML('result',$result);
?>

The is_numeric check could be changed by a more elaborate regular expression to check if the string is actually xml unsafe but this worked for me.
To Top