2009-03-18 2 views
2

Мне нужно разобрать довольно большой XML в PHP (например, 300 МБ). Как я могу сделать это наиболее эффективно?Разбор большого XML в PHP

В частности, мне нужно найти определенные теги и извлечь их содержимое в плоском TXT-файле, не более того.

+0

Проблема решена путем генерации XSL w/XMLStarlet, а затем применения ее с Xalan/Xerces. Спасибо за вашу помощь. –

ответ

1

Если это одно или несколько раз, я бы использовал XML Starlet. Но если вы действительно хотите сделать это с PHP-сайтом, я бы рекомендовал подготовить его к меньшим кускам, а затем обработать его. Если вы загрузите его через DOM, как один большой кусок, то потребуется много памяти. Также используйте скрипт PHP для интерфейса CLI, чтобы ускорить работу.

1

Самый эффективный способ сделать это - создать статический XSLT и применить его к вашему XML с помощью XSLTProcessor. Имена методов немного вводят в заблуждение. Несмотря на то, что вы хотите выводить обычный текст, вы должны использовать либо transformToXML(), если вам нужно, это строковая переменная, либо transformToURI(), если вы хотите записать файл.

0

В зависимости от ваших требований к памяти вы можете загрузить его и использовать parse it with XSLT (маршрут, требующий памяти), или вы можете создать forward-only cursor и самостоятельно пройтись по дереву, распечатывая значения, которые вы ищете (память- эффективный маршрут).

10

Вы можете читать и разбирать XML в кусках с использованием метода старой школы SAX-based parsing с использованием PHP xml parser functions.

Используя этот подход, нет реального ограничения размера документов, которые вы можете проанализировать, поскольку вы просто читаете и анализируете заполнение буфера одновременно. Синтаксический анализатор активирует события, чтобы указать, что он нашел теги, данные и т. Д.

В руководстве содержится simple exampl e, в котором показано, как выбрать начало и конец тегов. Для ваших целей вы также можете использовать xml_set_character_data_handler, чтобы вы также подхватили текст между тегами.

1

Это то, для чего SAX был предназначен. SAX имеет низкий объем памяти в небольшом буфере данных и событиях стрельбы, когда он сталкивается с элементами, символьными данными и т. Д.

Не всегда очевидно, как использовать SAX, ну это было не для меня в первый раз, когда я использовал его, но по существу вы должны поддерживать свое собственное состояние и просматривать, где вы находитесь внутри структуры документа, поэтому, как правило, вы получите переменные, описывающие, в какой части документа вы находитесь, например inFoo, inBar и т. д., которые вы устанавливаете, когда сталкиваетесь с конкретными элементами запуска/завершения.

Существует краткое описание и пример парсера SAX here

1

Прицепные парсинг путь. Таким образом, он эффективен с точки зрения памяти и легко обрабатывается. Я обрабатывал файлы размером до 50 Мб или больше.

Смежные вопросы