我使用的是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"

但你的期望是什么?告诉我们应该是什么?

10-04 22:18
查看更多