如何用Java连接两个或多个大型XML文件(不使用内存)?

时间:2014-08-12 13:58:03

标签: java xml spring

我们的应用程序需要一个接一个地连接两个或多个XML文件。结果应该是另一个XML文件。我们无法将XML存储到内存中,因为这些文件可能是数百MB的文件。

该应用程序是用Java制作的弹簧和弹簧批次,但也欢迎任何其他库。

澄清一下,这是我的XML:

示例文件:

  <item>
    <name>x</name>
    <surname>y</surname>
  </item>
  <item>
    <name>Z</name>
    <surname>aa</‌​surname>
  </item>
  ...

我们可以将这些项目放在xml根标记内,但它也可以是我们准备的节点列表,只是为了能够一个接一个地连接而没有验证问题。连接所有文件后,我们可以添加页眉和页脚。

如果我们这样做,可以减少问题以连接两个纯文本文件。

4 个答案:

答案 0 :(得分:1)

要确保输出是有效的XML,同时保持较低的内存使用率,请使用SAX parser处理内存消耗较低的大型XML文件。

解析第一个文件并将其所有内容(解析器识别的所有元素)处理为输出文件,然后对第二个文件执行相同的操作。根据XML的tyhe定义,根据需要合并元素的内容(确保至少有一个顶级元素)。

SAX解析器消耗的内存应与文档深度(即嵌套XML元素的数量)成比例,而不是文档中元素的总数。

答案 1 :(得分:1)

您可以通过流式XSLT 3.0转换来实现:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template name="main">
  <output>
   <xsl:for-each select="'input1.xml', 'input2.xml'">
    <xsl:stream href="{.}">
     <xsl:copy-of select="."/>
    </xsl:stream>
   </xsl:for-each>
  </output>
 </xsl:template>
</xsl:stylesheet>

应该在Saxon-EE中工作,但如果您只需要运行一次,它可能不是最具成本效益的解决方案。

答案 2 :(得分:0)

将第一个XML文件写入光盘然后将第二个文件附加到它? Apache Commons库非常有用。

Apache Commons FileUtils:link here

Apache Commons StringUtils:link here

答案 3 :(得分:0)

我一直在研究,发现XSLT非常有用。

这是一个Example