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