PHP SimpleXML 修改 CDATA 元素中的换行符


PHP SimpleXML modifies line break characters in CDATA elements

我使用的是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 "''r'" 换行符更改为字符串长度的 unix "'" 换行符。这是一个问题,因为我想在我的 XML 文件中存储serialize() ed 对象,但serialize()存储它序列化的任何字符串的确切长度,包括换行符。当我在 XML 中读取后尝试unserialize()字符串时,由于行尾更改,字符串长度不再正确,并且无法正确反序列化。可以通过确保我清理每个输入字符串以将"''r'"替换为"'"来解决此问题,但这似乎不是我应该做的事情。

我的印象是XML解析器不应该以任何方式解析CDATA元素的内容。我是否误解了CDATA部分的指定方式,我是否以某种方式滥用了SimpleXML,或者这是SimpleXML中的一个错误?

我不明白你的意思。

但请注意,您使用了双引号。

在我的变体中:

$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"

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