Разбор большого XML в PHP

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

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

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

Вы можете читать и анализировать XML в кусках с помощью подхода синтаксического анализа на основе SAX на основе старой школы с использованием функций XML-анализатора PHP.

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

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

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

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

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

Ниже приводится краткое описание и пример синтаксического анализа сакса.

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

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