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

时间:2015-01-10 00:39:38

标签: php xml cdata

我使用的是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中的错误?

1 个答案:

答案 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"

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