Подтвердить что ты не робот

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

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

4b9b3361

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