За последние 24 часа нас посетили 16485 программистов и 1677 роботов. Сейчас ищут 914 программистов ...

XML. не создаётся пустой CDATA (гуру PHP, откликнитесь-)

Тема в разделе "Прочие вопросы по PHP", создана пользователем oluckyman, 23 дек 2008.

  1. oluckyman

    oluckyman Активный пользователь

    С нами с:
    23 дек 2008
    Сообщения:
    5
    Симпатии:
    0
    Приветствую, любители магии и мистики!

    Суть проблемы в том, что один и тот же код на разных серваках (с одинаковыми версиями пхп и апаче) работает по-разному.

    PHP:
    1. <?
    2. $dom = new DOMDocument();
    3. $root = $dom->createElement('root');
    4. $cdata = $dom->createCDATASection(''); //  !!!
    5. $root->appendChild($cdata);
    6. $dom->appendChild($root);
    7. print "<textarea rows='20' cols='80'>";
    8. echo $dom->saveXML();
    9. print "</textarea>";
    10. ?>
    11.  

    В результате выполнения скрипта на одном серваке получается такой XML:
    HTML:
    1. <?xml version="1.0"?>
    2. <root></root>
    3.  

    а на другом вот такой:
    HTML:
    1. <?xml version="1.0"?>
    2. <root><![CDATA[]]></root>
    3.  
    Почему не удаётся создать пустую CDATA?

    Заранее благодарен-)
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    винда какая там стоит? пойди XP и Server?
    =)))))))))))
     
  3. oluckyman

    oluckyman Активный пользователь

    С нами с:
    23 дек 2008
    Сообщения:
    5
    Симпатии:
    0
    не, винды такие:
    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

    это из пхпинфо.

    Какие ещё настройки сказать?
     
  4. В пхпинфо
    domDOM/XML enabled
    DOM/XML API Version 20031129
    libxml Version 2.6.31
     
  5. oluckyman

    oluckyman Активный пользователь

    С нами с:
    23 дек 2008
    Сообщения:
    5
    Симпатии:
    0

    посмотрел. на обоих серваках вот так:
    DOM/XML enabled
    DOM/XML API Version 20031129
    libxml Version 2.6.26
     
  6. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Возможно, что разные вендоры Linux и каждый вносит или не вносит свои патчи.
    Внутри объекта cdata однозначно создается, просто при выводе (saveXML) оптимизация происходит.
    У меня другой вопрос: нафига пустая cdata? :)
     
  7. oluckyman

    oluckyman Активный пользователь

    С нами с:
    23 дек 2008
    Сообщения:
    5
    Симпатии:
    0
    Хм.. действительно, saveXML я не подозревал-)
    код примера тогда можно сократить до такого:
    PHP:
    1. print "<textarea rows='20' cols='80'>";
    2. echo DOMDocument::loadXML('<root><![CDATA[]]></root>')->saveXML();
    3. print "</textarea>";
    и по-прежнему на разных серваках выводит разный XML


    Приведённый код я написал для примера, чтоб сконцентрировать внимание на проблеме. На самом деле всё сложнее-) cdata изначально не пустая, но в некоторых случаях её значение заменяется на пустую строку.
     
  8. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну так преобразование объекта в строку все-равно происходит. И алгоритм там явно один.

    Если строка пустая, то зачем cdata. Я вот чего не понимаю: зачем вообще cdata, если пустая строка. cdata нужна когда значение элемента содержит много символов, которые надо экранировать и проще засунуть все это в cdata, чем экранировать. Ну или для большей читабельности, если там внутри javascript, например.
     
  9. oluckyman

    oluckyman Активный пользователь

    С нами с:
    23 дек 2008
    Сообщения:
    5
    Симпатии:
    0
    CDATA у меня для того и используется. Изначально в ней хранятся строки с переменными. А затем переменные заменяются на их значения. Бывают случаи когда значением переменной является пустая строка. Так и появляется пустая cdata. Я конечно могу в своём алгоритме отслеживать пустые строки и вручную удалять CDATA.
    Но речь не об этом, а о том коде который я привёл в пример. Хочу понять почему на одном серваке пустая cdata удаляется, а на другом нет. И как можно на это поведение повлиять?
     
  10. quazare

    quazare Активный пользователь

    С нами с:
    3 июн 2008
    Сообщения:
    88
    Симпатии:
    0
    Адрес:
    Nsk
    а я "вручную" собираю хмл-ки...