Divide el archivo Xml de 1GB usando Java

Tengo un archivo Xml de 1GB, ¿cómo puedo dividirlo en archivos Xml de formato pequeño y bien formados usando Java?

Aquí hay un ejemplo:

  john  ....  

Gracias.

Usaría un analizador StAX para esta situación. Evitará que todo el documento se lea en la memoria al mismo tiempo.

  1. Avance XMLStreamReader al elemento raíz local del subfragmento.
  2. A continuación, puede usar las API javax.xml.transform para generar un documento nuevo a partir de este fragmento XML. Esto avanzará XMLStreamReader hasta el final de ese fragmento.
  3. Repite el paso 1 para el siguiente fragmento.

Ejemplo de código

Para el siguiente XML, genere cada sección de “statement” en un archivo nombrado después del “valor de los atributos de la cuenta”:

   ...stuff...   ...stuff...   

Esto se puede hacer con el siguiente código:

 import java.io.File; import java.io.FileReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; public class Demo { public static void main(String[] args) throws Exception { XMLInputFactory xif = XMLInputFactory.newInstance(); XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml")); xsr.nextTag(); // Advance to statements element TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) { File file = new File("out/" + xsr.getAttributeValue(null, "account") + ".xml"); t.transform(new StAXSource(xsr), new StreamResult(file)); } } } 

Pruebe esto, usando Saxon-EE 9.3.

         

El software no es gratuito, pero si le ahorra un día de encoding, puede justificar fácilmente la inversión. (Disculpas por el argumento de venta).

DOM, STax, SAX, todos lo harán, pero tienen sus propios pros y contras.

  1. No puede poner todos los datos en memoria en caso de DOM.
  2. El control de progtwigción es más fácil en caso de DOM luego Stax y luego SAX.
  3. Una combinación de SAX y DOM es una mejor opción.
  4. Usar un Framework que ya lo haga puede ser la mejor opción. Eche un vistazo a los smooks. http://www.smooks.org

Espero que esto ayude

Respetuosamente discrepo con Blaise Doughan. SAX no solo es difícil de usar, sino que es muy lento. Con VTD-XML, no solo puede usar XPath para simplificar la lógica de procesamiento (la reducción de código 10x es muy común) sino también mucho más rápido porque no hay conversión de encoding / desencoding redundante. A continuación se muestra el código de Java con vtd-xml

 import java.io.FileOutputStream; import com.ximpleware.*; public class split { public static void main(String[] args) throws Exception { VTDGen vg = new VTDGen(); if (vg.parseHttpUrl("c:\\xml\\input.xml", true)) { VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); ap.selectXPath("/records/record"); int i=-1,j=0; while ((i = ap.evalXPath()) != -1) { long l=vn.getElementFragment(); (new FileOutputStream("out"+j+".xml")).write(vn.getXML().getBytes(), (int)l,(int)(l>>32)); j++; } } } }