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

программирование php xml

Всем привет! Имеется xml файл размером около 100 Мб. если парсить его стандартными средствами php, где он читается сразу полностью, то скрипт упирается в memory_limit, прошу помощи в написании функции для парсинга файла по частям, но что бы в итоге результат парсинга был аналогичен тому что возвращается функцией xml_parse_into_struct

Примечание:
Тюльпан, идея в том что бы читать xml файл частями не превышающими memory_limit и сбрасывать полученные данные в mysql освобождая память, далее читать следующий кусок и так до конца файла. Не думаю, что покупать будет дешевле)) скрипт не такой уж и сложной, у меня уже были кое какие наработки, но не все до конца понял, использовал как говорил Epsiloncool функцию xml_parse(), заранее задав функции для начала элемента и конца:
xml_set_element_handler($xml, "start", "end");

Примечание:
Epsiloncool, спасибо, разобрался. Написал небольшой класс для разбора больших xml по частям.
Ответы:
XML не может быть в 90% и выше случаев быть отпаржен по частям. Даже если будешь запоминать открытые тэги - встроенные средства для работы с XML это не будут любить. Только отказавшись от функций xmldom ты сможешь это сделать, ну или разбив на записи если они примерно одинакового формата.
Стандартная функция xml_parse() позволяет подгружать XML-файл частями и парсить его мелкими частями, хоть по 100 байтов. В частности, эта функция используется для разбора XML-потоков, которые вообще не ограничены по длине.
Никто этого делать не будет, ибо условия идиотские. Любой разбор любых данных должен создавать некий новый результат или объект. Если исходная информация представляется в адекватном формате, то объем форматирующих элементов д.б. относительно небольшим, следовательно и результат д.б. в объекте не принципиально меньше исходного файла. Можно открывать файл как байтовую структуру и парсировать расставля указатели (индексы). Но, в результате, думаю, стоимость этой программы будет существенно выше стоимости увеличения памяти.
2 Тюльпан:
теоретик вы наш. А если я из этого XML хочу вытянуть три строчки текста, первая в начале, вторая примерно в середине, а третья в конце ? :) Объём результата будет маленьким.
Программа с использованием xml_parse() будет в тысячу раз короче, чем побайтовый парсинг, да и написать можно за пару-тройку часов (в зависимости от сложности извлекаемых данных).
Основные интерфейсы для парсинга XML - это DOM и SAX. DOM применяется, когда нужен произвольный доступ и модификация дерева, а для потоковой обработки специально предназначен SAX интерфейс. В данном случае это как раз xml_parse() и компания, о которых пишет Eplisoncool.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.