使用SimpleXMLElement使用CDATA编辑XML

时间:2014-09-15 17:03:40

标签: php simplexml cdata

我已经看到很多关于如何使用CDATA加载XML字符串的好答案,或者如何编写带有CDATA内容的元素,但我还没有找到办法编辑已包含CDATA的XML,并在使用$xml->asXML()后保留以前的CDATA。

有没有办法编辑已包含CDATA的XML并在使用$xml->asXML()后保留以前的CDATA?

看看这个场景:

<?php
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>";

try {
    echo "XML with CDATA: \n\n";
    $xml = simplexml_load_string($str_xml, null, LIBXML_NOCDATA);
    echo $xml->asXML() ."\n\n";
} catch(Exception $e){
    echo "XML with CDATA: \n\n";
    echo $e->getMessage() ."\n\n";
}
?>

运行此示例后,输出为:

<?xml version="1.0"?>
<myxml><mytag>In this content, 8 &gt; 2 &amp; 1 &lt; 9, and 10 is a 10% of 100. </mytag></myxml>

如您所见,此输出XML字符串不再具有CDATA标记值。使用此输出加载另一个simplexml_load_string并不会失败,但现有的CDATA标记已经消失,特殊字符也会被相应的html实体替换。

我需要知道是否有办法读取任何包含任何数量的CDATA节点值的XML,并且在使用$xml->asXML()之后,输出字符串仍然包含以前的CDATA标记值。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

写出的XML不包含CDATA节点,因为当你通过LIBXML_NOCDATA时,你告诉SimpleXML摆脱它们。要保留它们,只是不要通过该选项!

Here's a live demo of the fixed version,如下所示:

<?php
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>";

try {
    echo "XML with CDATA: \n\n";
    $xml = simplexml_load_string($str_xml);
    echo $xml->asXML() ."\n\n";
} catch(Exception $e){
    echo "XML with CDATA: \n\n";
    echo $e->getMessage() ."\n\n";
}

您阅读的所有答案和评论都告诉您,为了将CDATA节点与SimpleXML一起使用,您需要通过该选项非常简单错误。唯一的问题是print_rvar_dump等的输出不能完整表示SimpleXML可访问的数据; 并不意味着它不在那里

要获取示例XML中的文本,只需将元素转换为字符串(某些上下文,例如echo语句,自动执行此操作)。与this example中一样:

$xml = simplexml_load_string($str_xml);
$tag_content = (string)$xml->mytag;
echo "Here is the content of the <mytag> node: $tag_content";