A melhor maneira de processar XML grande em PHP

Eu tenho que analisar grandes arquivos XML no php, um deles é de 6,5 MB e eles podem ser ainda maiores. A extensão SimpleXML como eu li, carrega todo o arquivo em um object, o que pode não ser muito eficiente. Na sua experiência, qual seria a melhor maneira?

Para um arquivo grande, você deseja usar um analisador SAX em vez de um analisador de DOM.

Com um analisador de DOM, ele lerá todo o arquivo e carregá-lo em uma tree de objects na memory. Com um analisador SAX, ele lerá o arquivo sequencialmente e chamará suas funções de retorno de chamada definidas pelo usuário para lidar com os dados (tags de início, tags finais, CDATA, etc.)

Com um analisador SAX, você precisará manter o estado (por exemplo, qual tag você está atualmente), o que o torna um pouco mais complicado, mas para um arquivo grande, será muito mais eficiente a memory.

Minha opinião:

https://github.com/prewk/XmlStreamer

Uma class simples que extrairá todas as crianças para o elemento raiz XML ao transmitir o arquivo. Testado no arquivo XML de 108 MB 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(); 

Ao usar um DOMDocument com arquivos XML grandes, não se esqueça de passar o sinalizador LIBXML_PARSEHUGE nas opções do método load() . (O mesmo aplica-se aos outros methods de load do object DOMDocument )

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

(Funciona com um arquivo XML de 120mo)

A SAX Parser, como Eric Petroelje recomenda, seria melhor para grandes arquivos XML. Um analisador de DOM carrega em todo o arquivo XML e permite que você execute consultas xpath – um analisador SAX (API Simples para XML) simplesmente leirá uma linha por vez e lhe dará pontos de gancho para processamento.

Depende realmente do que você quer fazer com os dados? Você precisa de tudo na memory para efetivamente trabalhar com ele?

6.5 MB não é tão grande, em termos de computadores atuais. Você poderia, por exemplo, ini_set('memory_limit', '128M');

No entanto, se seus dados podem ser transmitidos, você pode querer usar um analisador SAX . Depende realmente das suas necessidades de uso.

O analisador SAX é o caminho a seguir. Descobri que a análise SAX pode ficar bagunçada se você não ficar organizado.

Uso uma abordagem baseada em STX (Streaming Transformations for XML) para analisar grandes arquivos XML. Eu uso os methods SAX para criar um object SimpleXML para acompanhar os dados no contexto atual (ou seja, apenas os nós entre a raiz e o nó atual). Outras funções são usadas para processar o documento SimpleXML.

Eu precisava analisar um arquivo XML grande que tinha um elemento em cada linha (o despejo de dados StackOverflow). Neste caso específico, basta ler o arquivo uma linha de cada vez e analisar cada linha usando o SimpleXML. Para mim, isso teve a vantagem de não ter que aprender nada novo.

Intereting Posts