PHP 8.5.0 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

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 4 notes

up
3
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>
up
2
loathsome
18 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);
}
?>
up
1
jesdisciple dot FOO at gmail dot BAR dot com
15 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 
up
-5
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.
+add a note

AltStyle によって変換されたページ (->オリジナル) /