我们的应用程序需要一个接一个地连接两个或多个XML文件。结果应该是另一个XML文件。我们无法将XML存储到内存中,因为这些文件可能是数百MB的文件。
该应用程序是用Java制作的弹簧和弹簧批次,但也欢迎任何其他库。
澄清一下,这是我的XML:
示例文件:
<item>
<name>x</name>
<surname>y</surname>
</item>
<item>
<name>Z</name>
<surname>aa</surname>
</item>
...
我们可以将这些项目放在xml
根标记内,但它也可以是我们准备的节点列表,只是为了能够一个接一个地连接而没有验证问题。连接所有文件后,我们可以添加页眉和页脚。
如果我们这样做,可以减少问题以连接两个纯文本文件。
答案 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