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
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)