使用Java分割1GB Xml文件

我有一个1GB的Xml文件,我怎样才能把它分解成格式良好,尺寸较小的Xml文件使用Java?

这里是一个例子:

<records> <record id="001"> <name>john</name> </record> .... </records> 

谢谢。

我会使用StAXparsing器来处理这种情况。 它将防止整个文档被一次读入内存。

  1. 将XMLStreamReader推进到该子片段的本地根元素。
  2. 然后可以使用javax.xml.transform API从该XML片段生成一个新文档。 这会将XMLStreamReader推进到该片段的末尾。
  3. 对下一个片段重复步骤1。

代码示例

对于以下XML,将每个“语句”部分输出到以“帐户属性值”命名的文件中:

 <statements> <statement account="123"> ...stuff... </statement> <statement account="456"> ...stuff... </statement> </statements> 

这可以用下面的代码完成:

 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)); } } } 

试试这个,用Saxon-EE 9.3。

 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:mode streamable="yes"/> <xsl:template match="record"> <xsl:result-document href="record-{@id}.xml"> <xsl:copy-of select="."/> </xsl:result-document> </xsl:template> </xsl:stylesheet> 

该软件不是免费的,但如果它为您节省了一天的编码,您可以很容易地certificate投资。 (道歉的销售摊位)。

DOM,STax,SAX都会做,但有自己的优点和缺点。

  1. 在DOM的情况下,你不能把所有的数据放在内存中。
  2. 在DOM,Stax和SAX的情况下,编程控制更容易。
  3. SAX和DOM的组合是一个更好的select。
  4. 使用已经这样做的框架可能是最好的select。 看看smooks。 http://www.smooks.org

希望这可以帮助

我恭敬地不同意Blaise Doughan。 SAX不仅难以使用,而且速度很慢。 使用VTD-XML,不仅可以使用XPath来简化处理逻辑(10x代码减less非常普遍),而且还可以快得多,因为没有冗余的编码/解码转换。 下面是带有vtd-xml的java代码

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