При парсинге .xml не выводится содержимое CDATA. Как его вывести?

Тема в разделе "Как сделать...", создана пользователем Terin'yar, 13 апр 2015.

Статус темы:
Закрыта.
  1. Terin'yar

    Terin'yar Постоялец

    Регистр.:
    20 июл 2010
    Сообщения:
    65
    Симпатии:
    5
    Уже второй день голову себе ломаю и понять не могу по какой причине я не могу увидеть содержимое CDATA? При чем когда то, когда только начал знакомство с php смотрел разные парсеры
    пробовал адаптировать под определенный name.xml и тогда как я помню проблем с выводом содержимого CDATA не было. Сейчас уже немного разбираться начал в php, нашел тот парсер, так незадача с CDATA!
    вот парсер:

    Я имею ввиду, что если во входном файле убрать CDATA, то содержимое тега, например <name></name> отлично отображается.
    А если <name><![CDATA[Содержимое]]></name>, то ничего - пусто!
    Подскажите в чем загадка? Раньше я помню CDATA просто игнорировалась, а содержимое отображалось, а сейчас содержимого нет. Может я и путаю что-то, но факт остается фактом, что внутри CDATA увидеть не могу! Два дня гуглил, так и не обнаружил проблему. Может быть проблема в моем виртуальном сервере - openserver, какое-то расширение не так работает, или его нет? Потому что причин не отображать содержимое этого CDATA я не вижу! Может вы знаете, подозреваете в чем кроется причина и как с этом бороться :) ?
     
  2. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    380
    Симпатии:
    236
    str_replace?
    PHP:
    str_replace(array('<![CDATA[',']]>'), ''$text);
     
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    В characterData данные из CDATA попадают, на моём xml.
    Если у вас иначе, покажите ваш файл.

    не самый лучший способ
     
  4. Terin'yar

    Terin'yar Постоялец

    Регистр.:
    20 июл 2010
    Сообщения:
    65
    Симпатии:
    5
    Не помогает, пробовал в characterData, вместо $text, соответственно и $data, потом пробовал $elements, и $collection[$elements]. До characterData в startElements так же пытался (мало ли), но увы не помогает.
    Файл такого вида:

    Что не так делаю с str_replace(array('<![CDATA[',']]>'), '', $text); Тут особо вариантов то не много, тем не менее. Мне бы любой вариант подошел и этот в том числе, я не знаю уж как с этим бороться, но очень надо. Если есть что сказать, скажите...
     
    Последнее редактирование: 14 апр 2015
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    Логика в функциях у вас где-то страдает:
    Упростил код до минимального:
    PHP:
    <pre><?php

    function startElements($parser$name$attrs) {
    var_dump($name);
    var_dump($attrs);
    }

    function 
    endElements($parser$name) {
    var_dump($name);
    }

    // Вызывается для текста, заполняем массив
    function characterData($parser$data) {
    var_dump($data);
    }

    // Собственно, подготавливаем парсер
    $parser xml_parser_create();

    xml_set_element_handler($parser"startElements""endElements");
    xml_set_character_data_handler($parser"characterData");

    // открываем файл
    if (!($handle fopen('cdata.xml'"r"))) {
      die(
    "could not open XML input");
    }

    while(
    $data fread($handle4096)) // читаем по кусочкам
    {
      
    xml_parse($parser$data); // и стравливаем парсеру
    }
    xml_parser_free($parser);
    Данные из CDATA успешно выводятся...
     
    Terin'yar нравится это.
  6. Terin'yar

    Terin'yar Постоялец

    Регистр.:
    20 июл 2010
    Сообщения:
    65
    Симпатии:
    5
    Понял! Очень благодарен за помощь, сейчас буду разбираться.
     
  7. Terin'yar

    Terin'yar Постоялец

    Регистр.:
    20 июл 2010
    Сообщения:
    65
    Симпатии:
    5
    В общем все решил, думаю дай зайду отпишусь... Принципов работы немного не понимал, вот и с логикой неувязочки выходили :cool:
    Оказалось, что необходимо в data обрабатывать полученные данные и готовые переменные с ними уже отправлять в endElements, конечно это не оказалось, просто мне показалось это проще и правильно. В итоге вышло 8 глобальных переменных:-]. И все работает быстро и как нужно!
     
Статус темы:
Закрыта.