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

Статус
В этой теме нельзя размещать новые ответы.

Terin'yar

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

Я имею ввиду, что если во входном файле убрать CDATA, то содержимое тега, например <name></name> отлично отображается.
А если <name><![CDATA[Содержимое]]></name>, то ничего - пусто!
Подскажите в чем загадка? Раньше я помню CDATA просто игнорировалась, а содержимое отображалось, а сейчас содержимого нет. Может я и путаю что-то, но факт остается фактом, что внутри CDATA увидеть не могу! Два дня гуглил, так и не обнаружил проблему. Может быть проблема в моем виртуальном сервере - openserver, какое-то расширение не так работает, или его нет? Потому что причин не отображать содержимое этого CDATA я не вижу! Может вы знаете, подозреваете в чем кроется причина и как с этом бороться :) ?
 
str_replace?
PHP:
str_replace(array('<![CDATA[',']]>'), '', $text);
 
Не помогает, пробовал в characterData, вместо $text, соответственно и $data, потом пробовал $elements, и $collection[$elements]. До characterData в startElements так же пытался (мало ли), но увы не помогает.
Файл такого вида:
Скрытое содержимое доступно для зарегистрированных пользователей!

Что не так делаю с str_replace(array('<![CDATA[',']]>'), '', $text); Тут особо вариантов то не много, тем не менее. Мне бы любой вариант подошел и этот в том числе, я не знаю уж как с этим бороться, но очень надо. Если есть что сказать, скажите...
 
Последнее редактирование:
Логика в функциях у вас где-то страдает:
Упростил код до минимального:
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($handle, 4096)) // читаем по кусочкам
{
  xml_parse($parser, $data); // и стравливаем парсеру
}
xml_parser_free($parser);

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