【问题标题】:How to replace a string in an xml file without loading file contents into memory in java?java - 如何在不将文件内容加载到java内存中的情况下替换xml文件中的字符串?
【发布时间】:2015-04-30 04:11:36
【问题描述】:

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

我们使用的是 Java5。有什么办法可以做到吗?

【问题讨论】:

    标签: java xml string fileutils string-utils


    【解决方案1】:

    你可以试试VTD-XML:

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

    Example modifying XML.

    【讨论】:

      【解决方案2】:

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

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

      我喜欢 Stephen C 在此处回答您的问题的方式 - How to modify a huge XML file by StAX?

      【讨论】:

        【解决方案3】:

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

        还有更多替换规则。当然,您也可以拥有重命名或删除选定元素等的规则。

        【讨论】:

        • 谢谢迈克尔..标签值我的意思是文本节点的值...这是你建议的新东西..会试一试..但新值会根据一些运行时业务逻辑……我不能把它放在 xsl 中……那我该怎么做呢?
        • 总是可以从 XSLT 调用 Java 代码——尽管它不一定像人们想象的那样频繁,因为逻辑通常可以很容易地用 XSLT 编写。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2021-08-23
        • 1970-01-01
        • 2013-08-30
        • 2010-11-28
        相关资源
        最近更新 更多