Приветствую, любители магии и мистики! Суть проблемы в том, что один и тот же код на разных серваках (с одинаковыми версиями пхп и апаче) работает по-разному. PHP: <? $dom = new DOMDocument(); $root = $dom->createElement('root'); $cdata = $dom->createCDATASection(''); // !!! $root->appendChild($cdata); $dom->appendChild($root); print "<textarea rows='20' cols='80'>"; echo $dom->saveXML(); print "</textarea>"; ?> В результате выполнения скрипта на одном серваке получается такой XML: HTML: <?xml version="1.0"?> <root></root> а на другом вот такой: HTML: <?xml version="1.0"?> <root><![CDATA[]]></root> Почему не удаётся создать пустую CDATA? Заранее благодарен-)
не, винды такие: System Linux www 2.6.18-4-686 #1 SMP Fri Feb 2 15:10:49 UTC 2007 i686 и System Linux test 2.6.18-4-686 #1 SMP Fri Feb 2 15:10:49 UTC 2007 i686 это из пхпинфо. Какие ещё настройки сказать?
посмотрел. на обоих серваках вот так: DOM/XML enabled DOM/XML API Version 20031129 libxml Version 2.6.26
Возможно, что разные вендоры Linux и каждый вносит или не вносит свои патчи. Внутри объекта cdata однозначно создается, просто при выводе (saveXML) оптимизация происходит. У меня другой вопрос: нафига пустая cdata?
Хм.. действительно, saveXML я не подозревал-) код примера тогда можно сократить до такого: PHP: print "<textarea rows='20' cols='80'>"; echo DOMDocument::loadXML('<root><![CDATA[]]></root>')->saveXML(); print "</textarea>"; и по-прежнему на разных серваках выводит разный XML Приведённый код я написал для примера, чтоб сконцентрировать внимание на проблеме. На самом деле всё сложнее-) cdata изначально не пустая, но в некоторых случаях её значение заменяется на пустую строку.
Ну так преобразование объекта в строку все-равно происходит. И алгоритм там явно один. Если строка пустая, то зачем cdata. Я вот чего не понимаю: зачем вообще cdata, если пустая строка. cdata нужна когда значение элемента содержит много символов, которые надо экранировать и проще засунуть все это в cdata, чем экранировать. Ну или для большей читабельности, если там внутри javascript, например.
CDATA у меня для того и используется. Изначально в ней хранятся строки с переменными. А затем переменные заменяются на их значения. Бывают случаи когда значением переменной является пустая строка. Так и появляется пустая cdata. Я конечно могу в своём алгоритме отслеживать пустые строки и вручную удалять CDATA. Но речь не об этом, а о том коде который я привёл в пример. Хочу понять почему на одном серваке пустая cdata удаляется, а на другом нет. И как можно на это поведение повлиять?