Я использую PHP версии 5.3.9. Я сталкиваюсь с проблемами при использовании SimpleXML, потому что он изменяет символы конца строки в разделах CDATA при разборе XML-файлов.
Например:
$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 \ n \ \ в новую строку \ n \ unix из длин строк. Это проблема, потому что я хотел бы хранить serialize()
объекты ed в моем файле XML, но serialize()
хранит точную длину любых сериализованных строк, включая символы новой строки. Когда я пытаюсь unserialize()
строки после чтения в XML длина строки больше не является правильной из-за измененного окончания строки, и она не может быть правильно десериализована. Можно обойти это, убедившись, что я очищаю каждую входную строку, чтобы заменить «\ 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');
выходы
string(14) "hello\r\nworld"string(14) "hello\r\nworld"string(14) "hello\r\nworld"string(14) "hello\r\nworld"
но каковы ваши ожидания? просто скажите нам, что это должно быть?
Других решений пока нет …