关于如何用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 > 2 & 1 < 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_r
、var_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";