我使用的是PHP5.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“\r\n”换行符从字符串长度更改为unix“\n”换行符。这是一个问题,因为我想在xml文件中存储
serialize()
ed对象,但是serialize()
存储它序列化的任何字符串的确切长度,包括换行符。当我试图在读取XML后unserialize()
字符串时,字符串长度不再正确,因为行结尾已更改,无法正确取消序列化。可以通过确保清除每个输入字符串以将“\r\n”替换为“\n”来解决此问题,但这似乎不是我应该做的事情。在我的印象中,xml解析器不应该以任何方式解析cdata元素的内容。我是不是误解了cdata节是如何指定的,是我在某种程度上误用了simplexml,还是这是simplexml中的一个bug?
最佳答案
我没明白你的意思。
但请注意,您使用了双引号。
在我的变体中:
$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"
但你的期望是什么?告诉我们应该是什么?