使用SimpleXMLElement使用CDATA编辑XML


Edit XML with CDATA using SimpleXMLElement

关于如何用CDATA加载XML字符串,或者如何用CDATAcontent编写元素,我看到了很多问题,都有很好的答案,但我还没有找到一种方法来编辑已经包含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标记值。

谢谢你的帮助。

写出的XML不包含CDATA节点,因为您在传递LIBXML_NOCDATA时告诉SimpleXML去掉它们。为了留住他们,不要通过这个选项!

以下是固定版本的实时演示,如下所示:

<?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语句,会自动执行此操作)。如本例所示:

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