Мне нужно разбирать большие XML файлы в php, один из них - 6.5 МБ, и они могут быть даже больше. Расширение SimpleXML, которое я прочитал, загружает весь файл в объект, что может быть не очень эффективным. По вашему опыту, какой был бы лучший способ?
Лучший способ обработки больших XML в PHP
Ответ 1
Для большого файла вы хотите использовать SAX parser, а не парсер DOM.
С помощью DOM-анализатора он будет считываться во весь файл и загружать его в дерево объектов в памяти. С помощью синтаксического анализатора SAX он будет последовательно читать файл и вызывать пользовательские функции обратного вызова для обработки данных (начальные теги, конечные теги, CDATA и т.д.).
С помощью синтаксического анализатора SAX вам нужно будет поддерживать свое состояние (например, какой тег вы используете в настоящее время), что делает его немного сложнее, но для большого файла он будет гораздо более эффективным с точки зрения памяти.
Ответ 2
Мое занятие:
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();
Ответ 3
SAX Parser, как рекомендует Eric Petroelje, будет лучше для больших XML файлов. Парсер DOM загружается во весь XML файл и позволяет запускать запросы xpath - парсер SAX (Simple API for XML) будет просто читать по одной строке за раз и давать вам точки захвата для обработки.
Ответ 4
При использовании DOMDocument
с большими XML файлами не забудьте передать флаг LIBXML_PARSEHUGE
в настройках load()
. (То же самое относится к другим load
методам объекта DOMDocument
)
$checkDom = new \DOMDocument('1.0', 'UTF-8');
$checkDom->load($filePath, LIBXML_PARSEHUGE);
(Работает с XML файлом 120mo)
Ответ 5
Это действительно зависит от того, что вы хотите делать с данными? Вам нужно все это в памяти, чтобы эффективно работать с ним?
6.5 MB не так уж и много, с точки зрения сегодняшних компьютеров. Вы могли бы, например, ini_set('memory_limit', '128M');
Однако, если ваши данные могут быть потоковыми, вам может понадобиться использовать SAX parser. Это действительно зависит от ваших потребностей в использовании.
Ответ 6
SAX-парсер - это путь. Я обнаружил, что синтаксический анализ SAX может стать беспорядочным, если вы не остаетесь организованным.
Я использую подход, основанный на STX (Streaming Transformations for XML) для анализа больших XML файлов. Я использую методы SAX для создания объекта SimpleXML для отслеживания данных в текущем контексте (т.е. только узлы между корнем и текущим node). Другие функции затем используются для обработки документа SimpleXML.
Ответ 7
Мне нужно было проанализировать большой XML файл, который имел элемент в каждой строке (дамп данных StackOverflow). В этом конкретном случае достаточно было прочитать файл по одной строке за раз и проанализировать каждую строку с помощью SimpleXML. Для меня это имело то преимущество, что вам не нужно было ничего узнавать.