2

我的应用程序创建了一个非常大的 xml 文件(大约 300K 事务)。每个事务将有大约 20 个 xml 元素。所以它会创建一个巨大的 xml 文件。我们没有使用 JAXB 或 SAX 或 DOM 来创建 xml 文件,因为内存是约束。现在我需要在创建 xml 文件后替换某些标签值。我知道要替换什么以及要替换的值。如何在不将整个文件加载到内存的情况下替换这些变量?对于 300K 事务,文件大小约为 600 MB。所以我们不想将整个文件加载到内存中来替换几个变量。

我们正在使用 Java5。有没有办法我们可以做到?

4

3 回答 3

2

您可以尝试VTD-XML

  • 内存效率高(XML 文档大小的 1.3 倍~1.5 倍)随机访问 XML 解析器。
  • 最快的 XML 解析器:在 Core2 2.5Ghz 桌面上,VTD-XML 的性能比 DOM 解析器高 5 到 12 倍,每个内核的持续吞吐量为 150 到 250 MB/秒。
  • 具有增量更新功能的 XML 解析器,能够以最高效率剪切、粘贴、拆分和组装 XML 文档。
  • 在 C、C++、C# 和Java中可用。

修改 XML 的示例

于 2015-04-30T07:58:28.910 回答
1

我读过的关于这个主题的所有内容都表明,如果不将文件加载到内存或将其流式传输到另一个文件,您将无法做到这一点。这可能就是您最终需要做的事情 - 将您的源代码流式传输到一个新文件中,并随时进行修改。

有关该过程的更多信息 - http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html#bnbgq

我喜欢 Stephen C 在此处的回答中解决您的问题的方式 -如何通过 StAX 修改一个巨大的 XML 文件?

于 2015-04-30T04:36:18.750 回答
1

您可以尝试使用 XSLT 3.0(特别是 Saxon-EE)进行流转换。

我不确定您所说的“标签值”是什么意思(如果人们使用正确的术语,那就容易多了......)但是如果您指的是文本节点的值,那么您可以编写一个类似这样的流转换:

<xsl:mode streamable="yes" on-no-match="shallow-copy"/>

<xsl:template match="xyz/text()[.='old value']">
  <xsl:text>new value</xsl:text>
</xsl:template>

有额外替换的进一步规则。当然,您也可以拥有重命名或删除选定元素等的规则。

于 2015-04-30T07:21:29.433 回答