2

我目前正在开发一个需要拆分 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 分解文件,但我不知道如何分解它并一次单独发送每个部分。我也不想在本地存储任何东西,所以理想情况下它们都会被转移到字符串中并发送出去。

4

2 回答 2

3

如果您必须对文件进行分块的方式是固定的并且已知的,那么最简单的解决方案是使用 SAX 或 StAX 以编程方式进行。我个人更喜欢 StAX 来完成这类任务,因为代码通常更干净、更容易理解,但 SAX 也能同样出色地完成这项工作。

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

更新:在 XSLT 2.0<xsl:result-document>中可用于生成多个输出文件,但如果您想逐个获取块而不将它们存储在文件中,这并不理想。

于 2012-07-05T20:42:35.297 回答
2

我会流式传输 XML(而不是在内存中构建 DOM 树)并在旅途中切出块。每当遇到Lake标签时,就开始将内容复制到缓冲区中,当</Lake>遇到最终标签时,您将发送并重置该缓冲区。

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

于 2012-07-05T20:47:12.983 回答