Php 如何使用SimpleXmlElement编写CDATA?

Php 如何使用SimpleXmlElement编写CDATA?,php,xml,simplexml,cdata,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); ?> <?xml version="1.0"?>

我有以下代码来创建和更新xml文件:

<?php
$xmlFile    = 'config.xml';
$xml        = new SimpleXmlElement('<site/>');
$xml->title = 'Site Title';
$xml->title->addAttribute('lang', 'en');
$xml->saveXML($xmlFile);
?>
<?xml version="1.0"?>
<site>
  <title lang="en">Site Title</title>
</site>

这将生成以下xml文件:

<?php
$xmlFile    = 'config.xml';
$xml        = new SimpleXmlElement('<site/>');
$xml->title = 'Site Title';
$xml->title->addAttribute('lang', 'en');
$xml->saveXML($xmlFile);
?>
<?xml version="1.0"?>
<site>
  <title lang="en">Site Title</title>
</site>

网站名称
问题是:有没有一种方法可以使用此方法/技术添加CDATA来创建下面的xml代码

<?xml version="1.0"?>
<site>
  <title lang="en"><![CDATA[Site Title]]></title>
</site>

明白了!我将代码改编自():


生成的XML文件:

<?xml version="1.0"?>
<site>
  <title lang="en"><![CDATA[Site Title]]></title>
</site>


谢谢你

这是我的这个类的版本,它有一个quick addChildWithCDATA方法,基于:

只需像这样使用它:

$node = new SimpleXMLElementExtended();
$node->addChildWithCDATA('title', 'Text that can contain any unsafe XML charachters like & and <>');
$node=new simplexmlementextended();
$node->addChildWithCDATA('title','Text,可包含任何不安全的XML字符,如&and');

如果不想扩展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;
 };
类MySimpleXMLElement扩展了SimpleXMLElement{ 公共函数addChildWithCData($name,$value){ $new=parent::addChild($name); $base=dom\u import\u simplexml($new); $docOwner=$base->ownerDocument; $base->appendChild($docOwner->createCDATA节($value)); } } $simplexmlemntobj=新的mysimplexmlement(“”); /*用法*/ /*标准*/ $simplexmlemntobj->addChild('Postcode','1111'); /*带CDATA*/ $simplexmlemntobj->addChildWithCData('State','Processing'); /*结果*/ /* 1111 */
这是我的组合解决方案,可以使用CDATA添加子节点或将CDATA添加到节点

class SimpleXMLElementExtended extends SimpleXMLElement
{
    /**
    * Add value as CData to a given XML node
    *
    * @param SimpleXMLElement $node SimpleXMLElement object representing the child XML node
    * @param string $value A text to add as CData
    * @return void
    */
    private function addCDataToNode(SimpleXMLElement $node, $value = '')
    {
        if ($domElement = dom_import_simplexml($node))
        {
            $domOwner = $domElement->ownerDocument;
            $domElement->appendChild($domOwner->createCDATASection("{$value}"));
        }
    }

    /**
    * Add child node with value as CData
    *
    * @param string $name The child XML node name to add
    * @param string $value A text to add as CData
    * @return SimpleXMLElement
    */
    public function addChildWithCData($name = '', $value = '')
    {
        $newChild = parent::addChild($name);
        if ($value) $this->addCDataToNode($newChild, "{$value}");
        return $newChild;
    }

    /**
    * Add value as CData to the current XML node 
    *
    * @param string $value A text to add as CData
    * @return void
    */
    public function addCData($value = '')
    {
        $this->addCDataToNode($this, "{$value}");
    }
}

// Usage example:

$xml_doc = '<?xml version="1.0" encoding="utf-8"?>
<offers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1">
</offers>';

$xml = new SimpleXMLElementExtended($xml_doc);

$offer = $xml->addChild('o');
$offer->addAttribute('id', $product->product_id);
$offer->addAttribute('url', 'some url');

$cat = $offer->addChildWithCData('cat', 'Category description as CDATA');

// or

$cat = $offer->addChild('cat');
$cat->addCData('Category description as CDATA');
类SimpleXMLElementExtended扩展了SimpleXMLElement { /** *将值作为CData添加到给定的XML节点 * *@param simplexmlement$node表示子XML节点的simplexmlement对象 *@param string$value作为CData添加的文本 *@返回无效 */ 私有函数addCDATA节点(SimpleXMLElement$node,$value='') { 如果($DOMELENT=dom\U import\U simplexml($node)) { $domOwner=$domeElement->ownerDocument; $doElement->appendChild($domOwner->createCDATASection(“{$value}”); } } /** *添加值为CData的子节点 * *@param string$name要添加的子XML节点名称 *@param string$value作为CData添加的文本 *@return simplexmlement */ 公共函数addChildWithCData($name='',$value='') { $newChild=parent::addChild($name); 如果($value)$this->addCDATA节点($newChild,“{$value}”); 返回$newChild; } /** *将值作为CData添加到当前XML节点 * *@param string$value作为CData添加的文本 *@返回无效 */ 公共函数addCData($value='') { $this->addCDataNode($this,“{$value}”); } } //用法示例: $xml\u doc='1 '; $xml=新的simplexmlementextended($xml\u doc); $offer=$xml->addChild('o'); $offer->addAttribute('id',$product->product\u id); $offer->addAttribute('url','someurl'); $cat=$offer->addChildWithCData('cat','Category description as CDATA'); //或 $cat=$offer->addChild('cat'); $cat->addCData(“类别描述为CDATA”);
看起来SimpleXML不支持创建CDATA节点。试试看,你为什么在乎<“代码>站点标题和
完全相同,只是其中一个使用了更多的字节,并且作为一个人更难阅读。@昆汀说得很好。这只是客户机的要求。@Quentin-CDATA的使用使编写更容易,因为您不必担心在数据中转义任何内容或使其成为严格的XML。例如,如果您编写了
Site
Title
,它将破坏XML解析器(打开br标记而不关闭不是严格的XML),而
Title]]>
则不会。因此,在处理客户机时,只使用CDATA通常更具可读性,而不是所有不可靠的转义,即非CDATA节点可能必须包含以避免CDATA。@JimboJonny-如果您是手工编写,这很好,但问题是如何从PHP生成它。
公共函数addChildcdata($element\u name,$CDATA){$this->$element\u name=NULL;$this->$element\u name->addCData($cdata);}
这个添加到扩展类中的函数允许您直接附加cdata。我可以添加我的2c,当您加载它的文件时
simplexml\u load\u file/string()
您可以简单地为它提供一个选项“LIBXML\u NOCDATA”?
class SimpleXMLElementExtended extends SimpleXMLElement
{
    /**
    * Add value as CData to a given XML node
    *
    * @param SimpleXMLElement $node SimpleXMLElement object representing the child XML node
    * @param string $value A text to add as CData
    * @return void
    */
    private function addCDataToNode(SimpleXMLElement $node, $value = '')
    {
        if ($domElement = dom_import_simplexml($node))
        {
            $domOwner = $domElement->ownerDocument;
            $domElement->appendChild($domOwner->createCDATASection("{$value}"));
        }
    }

    /**
    * Add child node with value as CData
    *
    * @param string $name The child XML node name to add
    * @param string $value A text to add as CData
    * @return SimpleXMLElement
    */
    public function addChildWithCData($name = '', $value = '')
    {
        $newChild = parent::addChild($name);
        if ($value) $this->addCDataToNode($newChild, "{$value}");
        return $newChild;
    }

    /**
    * Add value as CData to the current XML node 
    *
    * @param string $value A text to add as CData
    * @return void
    */
    public function addCData($value = '')
    {
        $this->addCDataToNode($this, "{$value}");
    }
}

// Usage example:

$xml_doc = '<?xml version="1.0" encoding="utf-8"?>
<offers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1">
</offers>';

$xml = new SimpleXMLElementExtended($xml_doc);

$offer = $xml->addChild('o');
$offer->addAttribute('id', $product->product_id);
$offer->addAttribute('url', 'some url');

$cat = $offer->addChildWithCData('cat', 'Category description as CDATA');

// or

$cat = $offer->addChild('cat');
$cat->addCData('Category description as CDATA');