我使用的是PHP版本5.3.9。我在使用 SimpleXML 时遇到了问题,因为它在解析 xml 文件时会更改 CDATA 部分中的行结束字符。
例如:
$string = "<value><![CDATA[hellornworld]]></value>";
$xml = simplexml_load_string($string);
var_dump((string)$xml);
var_dump("hellornworld");
输出:
string(11) "hello world"
string(12) "hello world"
即使不查看十六进制值,您也可以立即看到 SimpleXML 解析版本正在将换行符从 Windows "\r" 换行符更改为字符串长度的 unix "" 换行符。这是一个问题,因为我想在我的 XML 文件中存储serialize()
ed 对象,但serialize()
存储它序列化的任何字符串的确切长度,包括换行符。当我在 XML 中读取后尝试unserialize()
字符串时,由于行尾更改,字符串长度不再正确,并且无法正确反序列化。可以通过确保我清理每个输入字符串以将"\r"替换为""来解决此问题,但这似乎不是我应该做的事情。
我的印象是XML解析器不应该以任何方式解析CDATA元素的内容。我是否误解了CDATA部分的指定方式,我是否以某种方式滥用了SimpleXML,或者这是SimpleXML中的一个错误?
我不明白你的意思。
但请注意,您使用了双引号。
在我的变体中:
$string = '<value><![CDATA[hellornworld]]></value>';
$xml = simplexml_load_string($string);
var_dump($xml->__toString());
var_dump((string)$xml);
$xml = new SimpleXMLElement($string);
var_dump($xml->__toString());
var_dump('hellornworld');
输出
string(14) "hellornworld"
string(14) "hellornworld"
string(14) "hellornworld"
string(14) "hellornworld"
但是你的期望是什么?告诉我们它应该是什么?