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.
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.
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++; } } } }