php export xml CDATA转义

时间:2017-09-11 10:05:41

标签: php xml

我正在尝试使用CDATA标记导出xml。我使用以下代码:

$xml_product = $xml_products->addChild('product');
$xml_product->addChild('mychild', htmlentities("<![CDATA[" . $mytext . "]]>"));

问题在于,CDATA代码<>转发&lt;&gt;如下:

 <mychild>&lt;![CDATA[My some long long long text]]&gt;</mychild>

但我需要:

<mychild><![CDATA[My some long long long text]]></mychild> 

如果我使用htmlentities()我会收到很多错误,例如tag raquo is not defined等等......虽然我的文字中没有任何此类标记。可能htmlentities()尝试在CDATA中解析我的文本并将其转换,但我也不想要它。

任何想法如何解决?谢谢。

UPD_1 我的xml保存到文件的功能:

public static function saveFormattedXmlFile($simpleXMLElement, $output_file) {
    $dom = new DOMDocument('1.0', 'UTF-8');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->loadXML(urldecode($simpleXMLElement->asXML()));
    $dom->save($output_file);

}

1 个答案:

答案 0 :(得分:1)

如何添加CData部分的简短示例,请注意它跳过使用DOMDocument添加CData部分的方式。代码构建<product>元素,$xml_product有一个新元素<mychild>在其中创建。然后使用dom_import_simplexml将此newNode导入DOMElement。然后,它使用DOMDocument createCDATASection方法正确创建适当的位并将其添加回节点。

$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><Products />');

$xml_product = $xml->addChild('product');
$newNode = $xml_product->addChild('mychild');
$mytext = "<html></html>";
$node = dom_import_simplexml($newNode);
$cdata = $node->ownerDocument->createCDATASection($mytext);
$node->appendChild($cdata);
echo $xml->asXML();

此示例输出......

<?xml version="1.0" encoding="UTF-8"?>
<Products><product><mychild><![CDATA[<html></html>]]></mychild></product></Products>