WeBinstruments

Инструментарий для веб-мастеров

 

на сайте на всех сайтах для веб разработчиков везде
 
 Скрипты
  PHP скрипты   
  Flash скрипты   
  Javascript скрипты   

 Софт
  Инструменты SEO   
  Разработка сайтов   
  Серверное ПО   

 Документация
  MySQL   
  PHP   
  HTML   
  Протоколы и сервисы Internet   

 Статьи
  PHP   
  MySQL   
  Сервер   
  еще...   

 Услуги и сервисы
  Домены   
  Хостинги   
  Блоки для сайта   

 Новости


 Контакты
  icq: 158325531
  email:
  все контакты: здесь




Atom все поступления
Раздел Файлы
Раздел Услуги и сервисы
Раздел Новости
Раздел Статьи
комментарии



 Партнеры


Главная / Статьи / PHP / Парсер большого XML файла с помощью PHP


Разбор большого XML файла с помощью PHP

12.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
умница! спасибо!


1 2 3

Добавить свой комментарий


Ваше имя(* обязательно)


Текст сообщения(* обязательно)









 
 
  запомнить

 
Copyright © 2003-2024 WeBi Constructor
Rambler's Top100