Разбор большого XML файла с помощью PHP12.11.2009 сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиКак сделать разбор большого XML файла, без нагрузки на ресурсы сервера.
Комментарии
RSS комментарии
23.08.2011 ПХПгуру
ну вы и далбичи, ваш код никуда не годится. Ни у одного из вас. Хорошо написанный сакс парсер делает всё гораздо быстрее. Тут писали про перл, так вот у перла действительно есть теоретическое преимущество в обработке больших файлов, так как этот язык изначально создавался для распознавания текста больших размеров. Но на практике ощутимой разницы нет. Всё очень сильно зависит от реализации, и на пхп реализация с приемлемым временем возможна. Hint: Быстрее всего будет писать автомат, динамически меняющий состояния и не забывающий чистить память.
22.09.2011 Макс
Приведенный парсер работает хорошо.Но проблема все же есть.Например у меня скрипт сервиса,который вытягивает из базы URL с которого потом берется XML файл.Все это работает по циклу,до тех пор пока в считанной строке массива есть данные.Если данные есть,то они передаются как параметры вызова функции данного парсера.Только вот после обработки первого файла,парсер вылетает с ошибкой в восьмой строке (вот в этой: function data ($parser, $data)),и выводит сообщение: Fatal error: Cannot redeclare data() .
Тестируется это все на локальном сервере Denwer 3, PHP 5.2 .
Не мог бы автор пояснить,что тут не так,и как исправить?
17.10.2011 Виктор
Макс, эта ошибка говорит о том, что функция data() уже была объявлена ранее.
То есть где то в вашем скрипте есть еще функция с таким же именем.
Измените имя функции date() в вашем скрипте или в этом, чтобы они не пересекались.
17.10.2011 Макс
Виктор,благодарю за пояснение,и приношу извинения,что не отписал ранее.Проблему я решил еще в 20 числах сентября.Просто был занят,и сюда в тему не заходил.
Сделал следующим образом.Их приведенного парсера вытянул отдельно функции обработки тегов и данных,обявил их в начале скрипта.В цикле поместил остальной текст парсера,в строке где идет вызов парсинга,поместил необходимые мне переменные.И все завелось как часы.
По времени обработки,только с индикацией в браузере,с занесения в БД распарсеных данных,9 баз,по 15-20 мегабайт,обрабатываются примерно 4-5 минут.
Заключение,парсер самое то,что доктор прописал,использовать рекомендуется.
Благодарнось автору,теперь в моей библиотеке появился прекрасный пример :)
01.12.2011 Сергей Н.
Подскажите, при обращении к элементам массива все время вылезает ошибка Undefined index. Для начала на строке
***
// добавляем данные в массив с указанием вложенности и открытого в данный момент тега
$webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]['data'].=$data;
***
индекс 'data' и далее по тексту уже индексы из атрибутов.
Можно как-то этого избежать?
08.12.2011 виктор
Сергей Н., ну так заблокируйте вывод предупреждений.
в начало скрипта вставьте
error_reporting(0);
10.12.2011 Вячеслав
Здравствуйте.
Нужно сделать автоматический импорт объектов с другого сайта (объекты загружаются на данный сайт при помощи программой установленной на компьютере) в базу данных EstateAgent.
Разработчики программы сообщили, что могут предоставить XML файл или CSV файл.
Помогите, пожалуйста. Так как нужно сэкономить время на ввод объектов в разные сайты.
Принцип работы: добавляем объекты в их программу, они делают автоматический экспорт файла на их сервере, потом надо сделать импорт данных объектов на EstateAgent.
Для примера можно рассмотреть импорт с AdsManager с одного сайта на EstateAgent на другой сайт. Так как смогу экспериментировать на моём сервере.
Заранее благодарен.
12.12.2011 сергей
Вячеслав, что то не совсем понятно что вам нужно.
Чем вам помочь то?
Вроде как есть скрипт который разбирает xml, есть даже у вас какая то программа на компе, не понятно в чем ваша сложность вставить данные на сайт?
Вы не описали вашей проблемы.
16.01.2012 dkrnl
написал подобный класс
http://dpyatkov.ru/2012/01/12/simplexmlreader/ - симбиоз simplexml и xmlreader
может кому пригодится
27.01.2012 alex
Спасибо за статью. Очень нужен такой парсер. Пожалуйста, добавьте в пример, который можно использовать, как это все дело в массив сложить, а не просто выводить на принт.
01.02.2012 виктор
alex, данный подход описывает как разобрать огромный XML, который целиком не может влезть в память, а значит такой большой xml не сможет поместиться в массив-не хватит памяти.
Для разбора XML и помещение его в массив существует куча готовых функций, которые без всяких заморочек могут xml разложить на массив, но естественно если речь идет не о большом xml файле
13.02.2012 alex
виктор, вы ошибаетесь. Размер xml-файла не равно массиву данных, которые в нем содержаться. Основное, что забивает память - теги, которые окружают эти данные.
Помощи попросил, т.к. слишком витеивата
структура вывода этих данных. Автору не составит труда добавить несколько строк в пример, в то время как мне, не имеющего достаточно опыта, делов на неделю ).
Автор, не поможешь? ))
16.02.2012 админ
alex, виктор прав.
Данный пример совсем не подходит, чтобы загонять целиком весь xml в массив.
Если ваш XML не очень большой, то лучше воспользоваться готовыми вариантами в PHP.
Например,
$xmldoc = new SimpleXMLElement($xml);
print_r($xmldoc);
Это сразу поместит ваш XML в объект. Ну и дальше уже вытаскивайте из объекта любые данные, либо можете преобразовать объект в массив...
28.05.2012 Павел
Данный метод парсинга не годится! попробуйте записать такое поле
<testtext>start русккий текст в UTF-8 ...<testtext> замените многоточие на текст более 255 символов. Увидите как функция отобразит строку несколькими частями
function data ($parser, $data)
{
print $data;
}
07.12.2012 Василий
Использовать глобальные переменные?! ... Переделал всё в класс - https://gist.github.com/4233238 кто хочет - пользуйтесь.
17.01.2013 clgs
Василий, а вы пробовали то его запускать?))
var $this->webi_data_temp;
private function __construct() при
$newClass = new webi_xml();
дальше не стал смотреть
18.02.2014 vovasik
не плохо бы ещё кодировку указать явно $xml_parser = xml_parser_create('utf-8');
05.05.2014 Алексей
Огромное спасибо за скрипт, очень выручил при парсинге XML с тегами на русском языке...
16.05.2014 Dina
Ошибка в строке if($perviy_vxod) {$data=strstr($data, '<?'); $perviy_vxod=0;}
лишний знак "?" после скобки, замучалась разбираться почему не работает ) респект автору ! на другом скрипте у меня сервак орал что памяти нет даже на 1.5Мб файле!!! выделенный сервак )
10.08.2014 Fure
умница! спасибо!
Добавить свой комментарий
|