如何使用SimpleXmlElement编写CDATA?

qua*_*tme 49 php xml simplexml cdata

我有这个代码来创建和更新xml文件:

<?php
$xmlFile    = 'config.xml';
$xml        = new SimpleXmlElement('<site/>');
$xml->title = 'Site Title';
$xml->title->addAttribute('lang', 'en');
$xml->saveXML($xmlFile);
?>
Run Code Online (Sandbox Code Playgroud)

这会生成以下xml文件:

<?xml version="1.0"?>
<site>
  <title lang="en">Site Title</title>
</site>
Run Code Online (Sandbox Code Playgroud)

问题是:有没有办法用这种方法/技术添加CDATA来创建下面的xml代码?

<?xml version="1.0"?>
<site>
  <title lang="en"><![CDATA[Site Title]]></title>
</site>
Run Code Online (Sandbox Code Playgroud)

qua*_*tme 88

得到它了!我从这个伟大的解决方案中调整了代码:

<?php
// http://coffeerings.posterous.com/php-simplexml-and-cdata
class SimpleXMLExtended extends SimpleXMLElement {
  public function addCData($cdata_text) {
    $node = dom_import_simplexml($this); 
    $no   = $node->ownerDocument; 
    $node->appendChild($no->createCDATASection($cdata_text)); 
  } 
}

$xmlFile    = 'config.xml';
// instead of $xml = new SimpleXMLElement('<site/>');
$xml        = new SimpleXMLExtended('<site/>');
$xml->title = NULL; // VERY IMPORTANT! We need a node where to append
$xml->title->addCData('Site Title');
$xml->title->addAttribute('lang', 'en');
$xml->saveXML($xmlFile);
?>
Run Code Online (Sandbox Code Playgroud)

生成的XML文件:

<?xml version="1.0"?>
<site>
  <title lang="en"><![CDATA[Site Title]]></title>
</site>
Run Code Online (Sandbox Code Playgroud)

谢谢Petah

  • http://www.posterous.com/已不再可用.幸运的是你发布在这里! (6认同)
  • `public function addChildcdata($ element_name,$ cdata){$ this - > $ element_name = NULL; $这 - > $ element_name-> addCData($ CDATA); 添加到扩展类的这个函数允许你直接追加CData. (4认同)

Ron*_*obi 26

这是我的这个类的版本,它有一个快速的addChildWithCDATA方法,根据你的答案:

    Class SimpleXMLElementExtended extends SimpleXMLElement {

  /**
   * Adds a child with $value inside CDATA
   * @param unknown $name
   * @param unknown $value
   */
  public function addChildWithCDATA($name, $value = NULL) {
    $new_child = $this->addChild($name);

    if ($new_child !== NULL) {
      $node = dom_import_simplexml($new_child);
      $no   = $node->ownerDocument;
      $node->appendChild($no->createCDATASection($value));
    }

    return $new_child;
  }
}
Run Code Online (Sandbox Code Playgroud)

只需使用它:

$node = new SimpleXMLElementExtended();
$node->addChildWithCDATA('title', 'Text that can contain any unsafe XML charachters like & and <>');
Run Code Online (Sandbox Code Playgroud)


Pat*_*fey 13

如果您不想扩展SimpleXMLElement,也可以为此创建一个辅助函数:

 /**
  * Adds a CDATA property to an XML document.
  *
  * @param string $name
  *   Name of property that should contain CDATA.
  * @param string $value
  *   Value that should be inserted into a CDATA child.
  * @param object $parent
  *   Element that the CDATA child should be attached too.
  */
 $add_cdata = function($name, $value, &$parent) {
   $child = $parent->addChild($name);

   if ($child !== NULL) {
     $child_node = dom_import_simplexml($child);
     $child_owner = $child_node->ownerDocument;
     $child_node->appendChild($child_owner->createCDATASection($value));
   }

   return $child;
 };
Run Code Online (Sandbox Code Playgroud)