Ejemplo de Node.js para convertir Xml a JSON para un archivo Xml grande

Soy relativamente nuevo en Node.js. Estoy intentando convertir 83 archivos XML que tienen un tamaño de alrededor de 400 MB en JSON.

Cada archivo contiene datos como este (excepto que cada elemento tiene una gran cantidad de declaraciones adicionales):

 75563140 0000000 20130101  19981002 686 20130101    D10000 "MUSIC"   GS0351 compact discs     PUBO A PUBLISHED FOR OPPOSITION 20130101 28   NPUB O NOTICE OF PUBLICATION 20121212 27   

He probado muchos módulos Node diferentes, incluyendo sax, node-xml, node-expat y xml2json. Obviamente, necesito transmitir los datos del archivo y canalizarlos a través de un analizador XML y luego convertirlos a JSON.

También he intentado leer varios blogs, etc., intentando explicar, aunque de forma superficial, cómo analizar Xml.

En el universo de Node, probé el sax primero, pero no puedo averiguar cómo extraer los datos en un formato que pueda convertirlos a JSON. xml2json no funcionará en secuencias. node-xml parece alentador, pero no puedo entender cómo analiza los fragmentos de ninguna manera que tenga sentido. node-expat apunta a la documentación de libexpat, que parece requerir un Ph.D. Node elementree hace lo mismo, apuntando a la implementación de Python pero no explica qué se ha implementado o cómo usarlo.

¿Puede alguien indicarme el ejemplo que podría usar para comenzar?

Dudo que esto siga siendo relevante después de 2 o 3 años, pero en caso de que alguien más se tropiece con esto, diría que xml-stream en NPM me pareció bastante sencillo.

Si eres un usuario de Windows que quiere evitar el GYP sin embargo, intenté agregar una solución muy simple usando sax para extraer niños desde un archivo XML uno por uno, se llama no-gyp-xml-stream y puede que no tenga muchos. características, pero ciertamente es fácil de usar: https://www.npmjs.com/package/no-gyp-xml-stream

Supongo que a estas alturas ya tienes un proceso de trabajo, considerando tu última respuesta.

De todos modos, si ya ha analizado con éxito los datos entrantes con SAX, la solución podría simplemente colocar los datos en un objeto de su diseño y usar yourStream.write(JSON.stringify(yourObject)) para transmitirlos.

Aunque esta pregunta es bastante antigua, estoy compartiendo mi problema y solución, que podría ser útil para todos los que intentan convertir XML a JSON .

El problema real aquí no es la conversión sino el procesamiento de enormes archivos XML sin tener que mantenerlos en la memoria de una vez.

Trabajando con casi todos los paquetes ampliamente utilizados, encontré el siguiente problema:

  • Muchos paquetes admiten la conversión de XML a JSON cubre todos los escenarios, pero no funcionan bien con archivos grandes.

  • Muy pocos paquetes (como xml-flow , xml-stream ) admiten la conversión de archivos XML grandes, pero el proceso de conversión pierde algunos escenarios de casos de esquina donde la conversión falla o proporciona una estructura JSON impredecible ( explicada en esta pregunta SO ).

La solución ideal sería combinar las ventajas de ambos enfoques, que es exactamente lo que hice y se me ocurrió el paquete de nodos xtreamer .

En palabras sencillas, xtreamer acepta el nodo de repetición como xml-flow / xml-stream pero emite la repetición de nodos de xml en lugar de JSON convertido. Esto proporciona las siguientes ventajas:

  • Podemos canalizar xtreamer con cualquier flujo legible ya que extiende el transform stream .
  • Los nodos XML emitidos se pueden transferir a cualquier analizador XML a JSON para obtener el JSON deseado.
  • Podemos ir un paso más allá y conectar el analizador JSON con xtreamer . xtreamer el analizador JSON y emitirá JSON en consecuencia.
  • xtreamer tiene el stream como su única dependencia y al ser una extensión de flujo de transformación, se puede canalizar con otros flujos de manera flexible.

¿Qué pasa si la estructura XML no es fija?

Logré crear otro paquete de nodos basado en sax xtagger que lee el archivo XML y proporciona la estructura del archivo en el siguiente formato:

 structure: { [name: string]: { [hierarchy: number]: number } }; 

Este paquete permite averiguar el nombre del nodo que se repite, que luego se puede pasar a xtreamer para su análisis.

Espero que esto ayude. 🙂