【问题标题】:Splitting a big XML file into smaller ones将大的 XML 文件拆分成较小的文件
【发布时间】:2012-07-05 20:31:33
【问题描述】:

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

【问题讨论】:

  • 必须是 XSLT 吗?您是否考虑过使用 SAX 解析器,只需阅读文档并将其发送到您需要的地方?
  • Split 1GB Xml file using Java 的可能重复项
  • 不一定是 XSLT,但肯定是 java 环境。任何有能力在解析之间暂停并以块的形式发送文件都是可行的方法。我认为这无论如何都不能在 XSLT 中完成。
  • 如果你愿意,我会发布一个解决方案,展示如何进行拆分、创建多个文档并将它们分别保存到一个文件中。
  • 那很好,虽然我不需要保存它们,但我想原理是一样的。请做。

标签: java xml xslt


【解决方案1】:

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

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

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

【讨论】:

  • 这个程序是一个恢复程序,所以我会在处理之前知道我需要删除多少条记录。
【解决方案2】:

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

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

【讨论】:

  • 嘿,您能详细说明一下流的含义吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-06-01
  • 2012-06-06
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
相关资源
最近更新 更多