将大型XML文件拆分为较小的XML文件

时间:2012-07-05 20:31:33

标签: java xml xslt

我目前正在开发一个需要我拆分XML的项目。例如,这是一个示例:

<Lakes>
  <Lake>
    <id>1</id>
    <Name>Caspian</Name>
    <Type>Natyral</Type>
  </Lake>
  <Lake>
    <id>2</id>
    <Name>Moreo</Name>
    <Type>Glacial</Type>
  </Lake>
  <Lake>
    <id>3</id>
    <Name>Sina</Name>
    <Type>Artificial</Type>
  </Lake>
</Lakes>

现在在我的java代码中理想情况下,它会将XML拆分为3个小例子,并使用信使服务将它们分发出去。信使服务的代码并不重要。我已经做到了。

因此,例如代码将运行,将第一部分拆分为:

<Lakes>
  <Lake>
    <id>1</id>
    <Name>Caspian</Name>
    <Type>Natyral</Type>
  </Lake>
</Lakes>

然后java代码会在消息中发送出去。然后它将转到下一部分,将其发送出等等,直到它到达大XML的末尾。这可以通过XSLT或通过java完成并不重要。有什么想法吗?

为了说清楚,我几乎知道如何使用XSLT分解文件,但我不知道如何分解它并一次一个地发送每个部分。我也不想在本地存储任何内容,因此理想情况下它们都会转换成字符串并发送出来。

2 个答案:

答案 0 :(得分:3)

如果您必须修改文件的方式是固定且已知的,最简单的解决方案是使用SAX或StAX以编程方式执行此操作。我个人更喜欢StAX来完成这项任务,因为代码通常更清晰,更容易理解,但SAX也能很好地完成这项工作。

XSLT是一个很棒的工具,但它的主要缺点是它只能产生一个输出。除了少数例外,XSLT引擎不支持流处理,因此如果初始文件太大而无法容纳在内存中,则无法使用它们。

更新:在XSLT 2.0 <xsl:result-document>中可以用来生成多个输出文件,但是如果你想逐个获取你的块而不是将它们存储在文件中,它就是&#39 ;不理想。

答案 1 :(得分:2)

我会流式传输XML(而不是在内存中构建DOM树)并随时删除块。只要您遇到Lake标记,就可以开始将内容复制到缓冲区中,当满足最终标记</Lake>时,该缓冲区将发送并重置。

编辑查看此link以了解有关Java中XML流的更多信息