Il modo migliore per elaborare grandi XML in PHP

Devo analizzare file XML di grandi size in php, uno di questi è 6,5 MB e potrebbero essere ancora più grandi. L'estensione SimpleXML, come ho letto, carica l'integer file in un object, che potrebbe non essere molto efficiente. Nella tua esperienza, quale sarebbe il modo migliore?

Per un file di grandi size, ti consigliamo di utilizzare un parser SAX piuttosto che un parser DOM.

Con un parser DOM leggerà l'integer file e lo caricherà in un tree degli oggetti in memory. Con un parser SAX, legge il file in modo sequenziale e chiama le funzioni di callback definite dall'utente per gestire i dati (tag di inizio, tag di fine, CDATA, ecc.)

Con un parser SAX avrai bisogno di mantenere lo stato te stesso (ad esempio quale tag sei attualmente), il che lo rende un po 'più complicato, ma per un file di grandi size sarà molto più efficiente la memory.

La mia opinione su di esso:

https://github.com/prewk/XmlStreamer

Una semplice class che estrae tutti i bambini all'elemento radice XML durante lo streaming del file. Testato su 108 MB file XML da 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(); 

Un parser SAX, come raccomanda Eric Petroelje, sarebbe meglio per i file XML di grandi size. Un parser DOM viene caricato nell'integer file XML e consente di eseguire query xpath: un parser SAX (Simple API for XML) legge semplicemente una row alla volta e fornisce punti di aghook per l'elaborazione.

Quando si utilizza un DOMDocument con file XML di grandi size, non dimenticare di passare il flag LIBXML_PARSEHUGE nelle opzioni del metodo load() . (Lo stesso vale per gli altri methods di load dell'object DOMDocument )

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

(Funziona con un file XML 120mo)

Dipende davvero da cosa vuoi fare con i dati? Ti serve tutto in memory per lavorare efficacemente con esso?

6,5 MB non è così grande, in termini di computer di oggi. Potresti, ad esempio, ini_set('memory_limit', '128M');

Tuttavia, se i tuoi dati possono essere trasmessi in streaming, potresti voler utilizzare un parser SAX . Dipende davvero dalle tue esigenze di utilizzo.

Parser SAX è la strada da percorrere. Ho scoperto che l'analisi SAX può essere complicata se non ti organizzi.

Uso un approccio basato su STX (Streaming Transformations for XML) per analizzare file XML di grandi size. Io uso i methods SAX per build un object SimpleXML per tenere traccia dei dati nel context corrente (cioè solo i nodes tra la radice e il nodo corrente). Altre funzioni vengono quindi utilizzate per elaborare il documento SimpleXML.

Avevo bisogno di analizzare un grande file XML che aveva un elemento su each row (il dump dei dati StackOverflow). In questo caso specifico è stato sufficiente leggere il file una row alla volta e analizzare each row utilizzando SimpleXML. Per me questo ha avuto il vantaggio di non wherer imparare nulla di nuovo.