• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DOMDocument::createCDATASection()

    (PHP 5, PHP 7)

    Create new cdata node

    说明

    publicDOMDocument::createCDATASection(string $data): DOMCDATASection

    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.

    参见

    • DOMNode::appendChild() Adds new child at the end of the children
    • DOMDocument::createAttribute() Create new attribute
    • DOMDocument::createAttributeNS() Create new attribute node with an associated namespace
    • DOMDocument::createComment() Create new comment node
    • DOMDocument::createDocumentFragment() Create new document fragment
    • DOMDocument::createElement() Create new element node
    • DOMDocument::createElementNS() Create new element node with an associated namespace
    • DOMDocument::createEntityReference() Create new entity reference node
    • DOMDocument::createProcessingInstruction() Creates new PI node
    • DOMDocument::createTextNode() Create new text node
    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);
    }
    ?>
    
    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>
    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
    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.