texto htmlentities html_entity_decode html_entities ent_quotes array php xml parsing simplexml large-files

htmlentities - xml to array php



La mejor forma de procesar XML grande en PHP (7)

Cuando utilice un DOMDocument con archivos XML grandes, no olvide pasar el indicador LIBXML_PARSEHUGE en las opciones del método load() . (Lo mismo aplica para los otros métodos de load del objeto DOMDocument )

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

(Funciona con un archivo XML 120mo)

Esta pregunta ya tiene una respuesta aquí:

Tengo que analizar grandes archivos XML en PHP, uno de ellos es de 6.5 MB y podrían ser aún más grandes. La extensión SimpleXML, como he leído, carga todo el archivo en un objeto, que puede no ser muy eficiente. En tu experiencia, ¿cuál sería la mejor manera?


El analizador SAX es el camino a seguir. Descubrí que el análisis SAX puede complicarse si no te mantienes organizado.

Utilizo un enfoque basado en STX (Streaming Transformations for XML) para analizar grandes archivos XML. Uso los métodos SAX para construir un objeto SimpleXML para hacer un seguimiento de los datos en el contexto actual (es decir, solo los nodos entre el nodo raíz y actual). A continuación, se utilizan otras funciones para procesar el documento SimpleXML.


Mi opinión sobre esto:

https://github.com/prewk/XmlStreamer

Una clase simple que extraerá todos los elementos secundarios al elemento raíz XML al transmitir el archivo. Probado en 108 MB de archivo XML de 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();


Necesitaba analizar un gran archivo XML que tenía un elemento en cada línea (el volcado de datos de ). En este caso específico, fue suficiente leer el archivo una línea a la vez y analizar cada línea con SimpleXML. Para mí, esto tenía la ventaja de no tener que aprender nada nuevo.


Para un archivo grande, querrá usar un analizador SAX en lugar de un analizador DOM.

Con un analizador DOM leerá todo el archivo y lo cargará en un árbol de objetos en la memoria. Con un analizador SAX, leerá el archivo secuencialmente y llamará a las funciones de devolución de llamada definidas por el usuario para manejar los datos (etiquetas de inicio, etiquetas finales, CDATA, etc.)

Con un analizador SAX necesitarás mantener tu estado (por ejemplo, en qué etiqueta estás actualmente) lo que lo hace un poco más complicado, pero para un archivo grande será mucho más eficiente en cuanto a la memoria.


Realmente depende de lo que quieras hacer con los datos? ¿Lo necesita todo en la memoria para trabajar efectivamente con él?

6.5 MB no es tan grande, en términos de las computadoras de hoy. Podría, por ejemplo, ini_set(''memory_limit'', ''128M'');

Sin embargo, si sus datos se pueden transmitir, es posible que desee ver usando un analizador SAX . Realmente depende de tus necesidades de uso.


Un analizador SAX, como recomienda Eric Petroelje, sería mejor para archivos XML grandes. Un analizador DOM carga en todo el archivo XML y le permite ejecutar consultas xpath: un analizador SAX (API simple para XML) simplemente leerá una línea a la vez y le dará puntos de enlace para el procesamiento.