Лучший способ обработки больших XML в PHP

Я должен разбирать большие XML-файлы в php, один из них – 6.5 МБ, и они могут быть даже больше. Расширение SimpleXML, которое я прочитал, загружает весь файл в объект, что может быть не очень эффективным. По вашему опыту, какой был бы лучший способ?

Для большого файла вы хотите использовать SAX-парсер, а не парсер DOM.

С помощью анализатора DOM он будет считывать весь файл и загружать его в дерево объектов в памяти. С помощью синтаксического анализатора SAX он будет последовательно читать файл и вызывать пользовательские функции обратного вызова для обработки данных (начальные теги, конечные теги, CDATA и т. Д.),

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

Я беру на себя это:

https://github.com/prewk/XmlStreamer

Простой класс, который будет извлекать всех детей в корневой элемент XML во время потоковой передачи файла. Протестировано на 108 MB XML-файле с pubmed.com.

class SimpleXmlStreamer extends XmlStreamer { public function processNode($xmlString, $elementName, $nodeIndex) { $xml = simplexml_load_string($xmlString); // Do something with your SimpleXML object return true; } } $streamer = new SimpleXmlStreamer("myLargeXmlFile.xml"); $streamer->parse(); 

SAX Parser, как рекомендует Eric Petroelje, будет лучше для больших XML-файлов. Парсер DOM загружает весь XML-файл и позволяет запускать запросы xpath – анализатор SAX (Simple API for XML) будет просто читать по одной строке за раз и давать вам точки захвата для обработки.

При использовании DOMDocument с большими XML-файлами не забудьте передать флаг LIBXML_PARSEHUGE в параметры метода load() . (То же относится и к другим методам DOMDocument объекта DOMDocument )

  $checkDom = new \DOMDocument('1.0', 'UTF-8'); $checkDom->load($filePath, LIBXML_PARSEHUGE); 

(Работает с XML-файлом 120mo)

Это действительно зависит от того, что вы хотите делать с данными? Вам нужно все это в памяти, чтобы эффективно работать с ним?

6.5 MB не так уж и много, с точки зрения современных компьютеров. Вы могли бы, например, ini_set('memory_limit', '128M');

Однако, если ваши данные могут быть потоковыми, вы можете посмотреть на использование анализатора SAX . Это зависит от ваших потребностей в использовании.

SAX-парсер – это путь. Я обнаружил, что синтаксический анализ SAX может стать беспорядочным, если вы не останетесь организованным.

Я использую подход, основанный на STX (Streaming Transformations for XML) для анализа больших XML-файлов. Я использую методы SAX для создания объекта SimpleXML для отслеживания данных в текущем контексте (т.е. только узлы между корнем и текущим узлом). Другие функции затем используются для обработки документа SimpleXML.

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