如何在不将文件内容加载到 java 内存中的情况下替换 xml 文件中的字符串



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

我们正在使用 Java5。有没有办法做到这一点?

您可以尝试 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 的示例。

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

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

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

您可以尝试使用 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>

并有进一步的替代规则。当然,您也可以使用重命名或删除选定元素等的规则。

相关内容

  • 没有找到相关文章

最新更新