Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP SimpleXML修改CDATA元素中的换行符_Php_Xml_Cdata - Fatal编程技术网

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

PHP SimpleXML修改CDATA元素中的换行符,php,xml,cdata,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"); 即使不查看十六进制值,您也可以

我使用的是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");
即使不查看十六进制值,您也可以立即看到SimpleXML解析版本正在从字符串长度将换行符从windows“\r\n”换行符更改为unix“\n”换行符。这是一个问题,因为我想在XML文件中存储
serialize()
ed对象,但是
serialize()
存储它序列化的任何字符串的确切长度,包括换行符。当我在读取XML后尝试
unserialize()
字符串时,字符串长度不再正确,因为行结束已更改,无法正确地取消序列化。可以通过确保清理每个输入字符串以将“\r\n”替换为“\n”来解决此问题,但这似乎不是我应该做的事情


我的印象是,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');

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

我不确定您对PHP有多熟悉,但在PHP中您必须。在我的问题中,我询问SimpleXML如何将转义\r(回车符)和\n(换行符)字符从两个字符更改为单个字符。在您的示例中,字符串有四个字符“\r\n”,这是完全不同的。很抱歉,您对问题所在的位置有一点错误。:-)问题是包含数据的原始字符串。因此,我没有用简单的XML更改某些内容。我只是更准确地准备了源字符串。这意味着您的问题不是由奇怪的SimpleXML行为引起的,而是由发送到xml的错误源数据字符串引起的?换行符和回车符在XML中是否无效?如果你说“只需更改输入字符串”就完全忽略了这个问题,除非你有很好的理由说明输入字符串是无效的XML.do
var\u dump($string)作为代码的第二行,在变量和my中的$string初始化之后,您将看到我所说的错误数据源是什么意思。我已经这样做了。数据源没有问题。如果你有明确的观点,不要说“试试看”。
$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"