Разбор чрезвычайно больших XML-файлов в php

Мне нужно проанализировать XML-файлы размером 40 ГБ, а затем нормализовать и вставить в базу данных MySQL. Сколько файла, который мне нужно сохранить в базе данных, не ясен, и я не знаю структуру XML.

Какой парсер следует использовать, и как бы вы это сделали?

В PHP вы можете читать в чрезвычайно больших файлах XML с помощью XMLReader Docs :

 $reader = new XMLReader(); $reader->open($xmlfile); 

Экстремальные большие XML-файлы должны храниться в сжатом формате на диске. По крайней мере, это имеет смысл, поскольку файлы XML имеют высокий коэффициент сжатия. Например, gzipped как large.xml.gz .

PHP очень хорошо поддерживает XMLReader через обертки сжатия Docs :

 $xmlfile = 'compress.zlib://path/to/large.xml.gz'; $reader = new XMLReader(); $reader->open($xmlfile); 

XMLReader позволяет вам работать с текущим элементом «только». Это означает, что это только вперед. Если вам нужно сохранить состояние парсера, вам нужно построить его самостоятельно.

Я часто считаю полезным обернуть основные движения в набор итераторов, которые знают, как работать с XMLReader как итерация только через элементы или дочерние элементы. Вы найдете это в Parse XML с PHP и XMLReader .

См. Также:

  • PHP открытый gzipped XML

Было бы неплохо узнать, что вы на самом деле собираетесь делать с XML. Способ, которым вы его разбираете, во многом зависит от обработки, которую вам нужно выполнить, а также от размера.

Если это одноразовое задание, то я начал в прошлом, открыв структуру XML, прежде чем делать что-либо еще. Мой DTDGenerator (см. Saxon.sf.net) был написан для этой цели давным-давно и все еще выполняет эту работу, теперь есть другие инструменты, но я не знаю, выполняют ли они поточную обработку, что является необходимым условием здесь.

Вы можете написать приложение, которое обрабатывает данные, используя синтаксический анализатор pull или push (SAX или StAX). Как легко это зависит от того, сколько обработки вам нужно сделать и сколько состояния вы должны поддерживать, чего вы нам не сказали. В качестве альтернативы вы можете попробовать потоковое XSLT-обработку, доступную в Saxon-EE.