如何使用SimpleXmlElement编写CDATA?
我有这个代码来创build和更新XML文件:
<?php $xmlFile = 'config.xml'; $xml = new SimpleXmlElement('<site/>'); $xml->title = 'Site Title'; $xml->title->addAttribute('lang', 'en'); $xml->saveXML($xmlFile); ?>
这将生成以下xml文件:
<?xml version="1.0"?> <site> <title lang="en">Site Title</title> </site>
问题是:有没有办法用这种方法添加CDATA来创build下面的xml代码?
<?xml version="1.0"?> <site> <title lang="en"><![CDATA[Site Title]]></title> </site>
得到它了! 我改编了这个伟大的解决scheme的代码:
<?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); ?>
生成的XML文件:
<?xml version="1.0"?> <site> <title lang="en"><![CDATA[Site Title]]></title> </site>
谢谢佩塔
这是我的这个类的版本,有一个快速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; } }
简单地使用它就像那样:
$node = new SimpleXMLElementExtended(); $node->addChildWithCDATA('title', 'Text that can contain any unsafe XML charachters like & and <>');
你也可以为此创build一个辅助函数,如果你不想扩展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; };
class MySimpleXMLElement extends SimpleXMLElement{ public function addChildWithCData($name , $value) { $new = parent::addChild($name); $base = dom_import_simplexml($new); $docOwner = $base->ownerDocument; $base->appendChild($docOwner->createCDATASection($value)); } } $simpleXmlElemntObj = new MySimpleXMLElement('<site/>'); /* USAGE */ /* Standard */ $simpleXmlElemntObj->addChild('Postcode','1111'); /* With CDATA */ $simpleXmlElemntObj->addChildWithCData('State','Processing'); /* RESULT */ /* <?xml version="1.0"?> <site> <Postcode>1111</Postcode> <State><![CDATA[Processing]]></State> </site> */
这里是我joinCDATA的子项或添加CDATA到节点的组合解决scheme。
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');