PHP. XML. пустая CDATA удаляется автоматически
От: oluckyman  
Дата: 23.12.08 11:15
Оценка:
Приветствую, любители магии и мистики!

Суть проблемы в том, что один и тот же код на разных серваках (с одинаковыми версиями пхп и апаче) работает по-разному.
В интересующем нас контексте код заменяет содержимое секции CDATA на пустую строку ($val=='')
            if ($item->nodeType == XML_TEXT_NODE) {
                $cdata = $dom->createCDATASection($item->nodeValue);
                $item->parentNode->replaceChild($cdata, $item);
                $item = $cdata;
            }
            $item->nodeValue = str_replace($var,$val,$item->nodeValue);



В результате в одном XML получается вот это:
  <node>
    <one><![CDATA[one]]></one>
    <two><![CDATA[two]]></two>
    <emptynode><![CDATA[]]></emptynode>
  </node>


а в другом вот это:
  <node>
    <one><![CDATA[one]]></one>
    <two><![CDATA[two]]></two>
    <emptynode></emptynode>
  </node>


Почему удаляется пустая CDATA, или, наоборот, почему не удаляется ?

Заранее благодарен-)
Re: PHP. XML. пустая CDATA удаляется автоматически
От: . Великобритания  
Дата: 23.12.08 14:42
Оценка:
oluckyman wrote:

> Почему удаляется пустая CDATA, или, наоборот, почему не удаляется ?

От погоды зависит.
А вообще говоря, оба документа эквивалентны. Так что должно быть без разницы.
Если нужно посимвольное равенство документов, то можно посмотреть c14n, правда
не знаю как оно в php.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: PHP. XML. пустая CDATA удаляется автоматически
От: oluckyman  
Дата: 23.12.08 15:24
Оценка:
Здравствуйте, ., Вы писали:

.>От погоды зависит.

.>А вообще говоря, оба документа эквивалентны. Так что должно быть без разницы.

Нет, разница есть. Например, XPath запрос //emptynode[text()] возвращает только тот нод, у которого внутри пустая CDATA

.>Если нужно посимвольное равенство документов, то можно посмотреть c14n, правда

.>не знаю как оно в php.

В принципе я могу отслеживать пустую CDATA и вручную удалять её. Но хотелось бы разобраться почему оно так работает?
Написал тестовый скрипт, чтоб убедиться что ничего лишнего на его работу не влияет:
<?
$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 version="1.0"?>
<root></root>


на другом эдак:
<?xml version="1.0"?>
<root><![CDATA[]]></root>


Почему??
Re[3]: PHP. XML. пустая CDATA удаляется автоматически
От: meandr  
Дата: 24.12.08 10:05
Оценка:
Re[2]: PHP. XML. пустая CDATA удаляется автоматически
Возможно разница в версиях LibXML.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: PHP. XML. пустая CDATA удаляется автоматически
От: oluckyman  
Дата: 24.12.08 13:35
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re[2]: PHP. XML. пустая CDATA удаляется автоматически

M>Возможно разница в версиях LibXML.

отнюдь. И там и там пхпинфо выдаёт это:
DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.6.26
Re: PHP. XML. пустая CDATA удаляется автоматически
От: oluckyman  
Дата: 24.12.08 13:41
Оценка:
В процессе расследования появилась версия, что виноват saveXML, который в целях оптимизации удаляет пустую CDATA

Так что пример можно упростить:
print "<textarea rows='20' cols='80'>";
echo DOMDocument::loadXML('<root><![CDATA[]]></root>')->saveXML();
print "</textarea>";


на разных серваках даёт результаты:
<?xml version="1.0"?>
<root></root>

и

<?xml version="1.0"?>
<root><![CDATA[]]></root>


Как отключить или включить эту оптимизацию?

libxml и там и там одинаковые:
DOM/XML API Version 20031129
libxml Version 2.6.26
Re[2]: PHP. XML. пустая CDATA удаляется автоматически
От: meandr  
Дата: 24.12.08 18:41
Оценка:
Re: PHP. XML. пустая CDATA удаляется автоматически
Едниственное что приходит на ум это вот эта константа LIBXML_NOEMPTYTAG По идее на ваших серверах она должна быть разная.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: PHP. XML. пустая CDATA удаляется автоматически
От: oluckyman  
Дата: 24.12.08 19:04
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re: PHP. XML. пустая CDATA удаляется автоматически

M>Едниственное что приходит на ум это вот эта константа LIBXML_NOEMPTYTAG По идее на ваших серверах она должна быть разная.

Спасибо за наводку, завтра порою в этом направлении..
Но константа и там и там = 4
И, как мне показалось, константы LIBXML_* используются в качестве параметров для ДОМовских функций и их значения везде одинаковые
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.