Я должен разбирать большие 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. Для меня это имело то преимущество, что вам не нужно было ничего узнавать.