Dividere il file Xml da 1 GB utilizzando Java

Ho un file Xml da 1 GB, come posso dividerlo in file Xml ben formati e di dimensioni ridotte usando Java?

Ecco un esempio:

  john  ....  

Grazie.

Vorrei usare un parser StAX per questa situazione. Impedirà l’intero documento di essere letto in memoria in una volta.

  1. Avanzare XMLStreamReader all’elemento root locale del sub-frammento.
  2. È quindi ansible utilizzare le API javax.xml.transform per produrre un nuovo documento da questo frammento XML. Questo farà avanzare XMLStreamReader fino alla fine di quel frammento.
  3. Ripeti il ​​passaggio 1 per il prossimo frammento.

Esempio di codice

Per il seguente codice XML, invia ciascuna sezione “statement” in un file chiamato dopo il “valore degli attributi dell’account”:

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

Questo può essere fatto con il seguente codice:

 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.Transformsr; import javax.xml.transform.TransformsrFactory; 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 TransformsrFactory tf = TransformsrFactory.newInstance(); Transformsr t = tf.newTransformsr(); while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) { File file = new File("out/" + xsr.getAttributeValue(null, "account") + ".xml"); t.transform(new StAXSource(xsr), new StreamResult(file)); } } } 

Prova questo, usando Saxon-EE 9.3.

         

Il software non è gratuito, ma se ti salva un giorno di programmazione puoi facilmente giustificare l’investimento. (Ci scusiamo per il passo di vendite).

DOM, STax, SAX tutto farà ma ci sono pro e contro.

  1. Non è ansible inserire tutti i dati in memoria in caso di DOM.
  2. Il controllo della programmazione è più semplice in caso di DOM, quindi Stax e poi SAX.
  3. Una combinazione di SAX e DOM è un’opzione migliore.
  4. Utilizzare un Framework che già lo fa può essere l’opzione migliore. Dai un’occhiata ai smooks. http://www.smooks.org

Spero che questo ti aiuti

Sono rispettosamente in disaccordo con Blaise Doughan. SAX non è solo difficile da usare, ma molto lento. Con VTD-XML, non è ansible utilizzare XPath solo per semplificare la logica di elaborazione (riduzione del codice 10x molto comune) ma anche molto più veloce perché non c’è conversione di codifica / decodifica ridondante. Di seguito è riportato il codice 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++; } } } }