Мне нужно разобрать довольно большой XML в PHP (например, 300 МБ). Как я могу сделать это наиболее эффективно?Разбор большого XML в PHP
В частности, мне нужно найти определенные теги и извлечь их содержимое в плоском TXT-файле, не более того.
Мне нужно разобрать довольно большой XML в PHP (например, 300 МБ). Как я могу сделать это наиболее эффективно?Разбор большого XML в PHP
В частности, мне нужно найти определенные теги и извлечь их содержимое в плоском TXT-файле, не более того.
Если это одно или несколько раз, я бы использовал XML Starlet. Но если вы действительно хотите сделать это с PHP-сайтом, я бы рекомендовал подготовить его к меньшим кускам, а затем обработать его. Если вы загрузите его через DOM, как один большой кусок, то потребуется много памяти. Также используйте скрипт PHP для интерфейса CLI, чтобы ускорить работу.
Самый эффективный способ сделать это - создать статический XSLT и применить его к вашему XML с помощью XSLTProcessor
. Имена методов немного вводят в заблуждение. Несмотря на то, что вы хотите выводить обычный текст, вы должны использовать либо transformToXML()
, если вам нужно, это строковая переменная, либо transformToURI()
, если вы хотите записать файл.
В зависимости от ваших требований к памяти вы можете загрузить его и использовать parse it with XSLT (маршрут, требующий памяти), или вы можете создать forward-only cursor и самостоятельно пройтись по дереву, распечатывая значения, которые вы ищете (память- эффективный маршрут).
Вы можете читать и разбирать XML в кусках с использованием метода старой школы SAX-based parsing с использованием PHP xml parser functions.
Используя этот подход, нет реального ограничения размера документов, которые вы можете проанализировать, поскольку вы просто читаете и анализируете заполнение буфера одновременно. Синтаксический анализатор активирует события, чтобы указать, что он нашел теги, данные и т. Д.
В руководстве содержится simple exampl e, в котором показано, как выбрать начало и конец тегов. Для ваших целей вы также можете использовать xml_set_character_data_handler, чтобы вы также подхватили текст между тегами.
Это то, для чего SAX был предназначен. SAX имеет низкий объем памяти в небольшом буфере данных и событиях стрельбы, когда он сталкивается с элементами, символьными данными и т. Д.
Не всегда очевидно, как использовать SAX, ну это было не для меня в первый раз, когда я использовал его, но по существу вы должны поддерживать свое собственное состояние и просматривать, где вы находитесь внутри структуры документа, поэтому, как правило, вы получите переменные, описывающие, в какой части документа вы находитесь, например inFoo, inBar и т. д., которые вы устанавливаете, когда сталкиваетесь с конкретными элементами запуска/завершения.
Существует краткое описание и пример парсера SAX here
Прицепные парсинг путь. Таким образом, он эффективен с точки зрения памяти и легко обрабатывается. Я обрабатывал файлы размером до 50 Мб или больше.
Проблема решена путем генерации XSL w/XMLStarlet, а затем применения ее с Xalan/Xerces. Спасибо за вашу помощь. –