略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: DOMDocument::createCDATASection

2024-11-14

DOMDocument::createCDATASection

(PHP 5, PHP 7, PHP 8)

DOMDocument::createCDATASectionCreate new cdata node

说明

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

This function creates a new instance of class DOMCDATASection. 此节点出现在文档中,除非是用诸如 DOMNode->appendChild() 等函数来将其插入。

参数

data

The content of the cdata.

返回值

The new DOMCDATASection or false if an error occurred.

参见

add a noteadd a note

User Contributed Notes 4 notes

up
4
info at troptoek dot com
14 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
14 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
0
jesdisciple dot FOO at gmail dot BAR dot com
11 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
-6
Marc info[at]braincast.nl
11 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.

官方地址:https://www.php.net/manual/en/domdocument.createcdatasection.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3