我已经看到很多关于如何使用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 > 2 & 1 < 9, and 10 is a 10% of 100. </mytag></myxml>
如您所见,此输出XML字符串不再具有CDATA标记值。使用此输出加载另一个simplexml_load_string
并不会失败,但现有的CDATA标记已经消失,特殊字符也会被相应的html实体替换。
我需要知道是否有办法读取任何包含任何数量的CDATA节点值的XML,并且在使用$xml->asXML()
之后,输出字符串仍然包含以前的CDATA标记值。
感谢您的帮助。
答案 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_r
,var_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";