如何让PHP simplexml保存<作为自己而不是<

时间:2010-08-05 20:13:40

标签: php xml simplexml

基本上我有一个脚本可以在不同的地方更新xml文档......但是,我需要将文本放在CDATA中......所以我尝试了这个:

                $PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', '<![CDATA[' . $value[0] . ']]>');

不幸的是,当我将XML保存回文件时,&lt;和&gt;在cdata中出现了各自的&lt;和$ gt;代码是否有办法避免这种情况?

注意:我们的解析器不知道如何阅读&lt;&gt;代码,因此这是一个严重的问题

在执行simple_xml对象的print_r之后,&lt;在源代码中显示为自己!

必须将domsave转换为实体代码...任何想法如何禁用它?

        //Convert SimpleXML element to DOM and save
        $dom = new DOMDocument('1.0');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = false;
        $dom->loadXML($xml->asXML());
        $dom->save($filename);

3 个答案:

答案 0 :(得分:3)

就像我在评论中所说的那样,SimpleXML在它为DOM节点提供的控件上非常有限。以下是如何使用DOMText节点替换DOMCDATASection节点的示例。

$dom = new DOMDocument;
$dom->loadXML('<root><a>foo</a></root>');
$a = $dom->documentElement->childNodes->item(0);
$a->replaceChild(
    $dom->createCDATASection('bar'),
    $a->childNodes->item(0)
);
echo $dom->saveXml($a); // <a><![CDATA[bar]]></a>

有关如何使用DOM see my answer heresome more here

的详细示例

答案 1 :(得分:1)

在将它发送给解析器之前,你不能使用html_entity_decode函数吗?它会将&lt&gt转换回<>

答案 2 :(得分:1)

解析器无法处理CDATA部分?在这种情况下,它不是XML解析器,因此您需要编写一个生成类似XML的输出而不是XML工具的工具。 (或修复解析器,使其成为XML解析器)