我目前正在开发一个需要我拆分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分解文件,但我不知道如何分解它并一次一个地发送每个部分。我也不想在本地存储任何内容,因此理想情况下它们都会转换成字符串并发送出来。
答案 0 :(得分:3)
如果您必须修改文件的方式是固定且已知的,最简单的解决方案是使用SAX或StAX以编程方式执行此操作。我个人更喜欢StAX来完成这项任务,因为代码通常更清晰,更容易理解,但SAX也能很好地完成这项工作。
XSLT是一个很棒的工具,但它的主要缺点是它只能产生一个输出。除了少数例外,XSLT引擎不支持流处理,因此如果初始文件太大而无法容纳在内存中,则无法使用它们。
更新:在XSLT 2.0 <xsl:result-document>
中可以用来生成多个输出文件,但是如果你想逐个获取你的块而不是将它们存储在文件中,它就是&#39 ;不理想。
答案 1 :(得分:2)
我会流式传输XML(而不是在内存中构建DOM树)并随时删除块。只要您遇到Lake
标记,就可以开始将内容复制到缓冲区中,当满足最终标记</Lake>
时,该缓冲区将发送并重置。
编辑查看此link以了解有关Java中XML流的更多信息