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

在java中,如何在不将文件内容加载到内存的情况下替换xml文件中的字符串?,java,xml,string,fileutils,string-utils,Java,Xml,String,Fileutils,String Utils,我的应用程序创建了一个非常大的xml文件(大约30万个事务)。每个事务将有大约20个xml元素。因此它创建了一个巨大的xml文件。我们没有使用JAXB、SAX或DOM来创建xml文件,因为内存是约束条件。现在,我需要在创建xml文件后替换该文件中的某些标记值。我知道要替换的内容和要替换的值。如何在不将整个文件加载到内存的情况下替换这些变量?对于300K事务,文件大小约为600MB。因此,我们不希望为了替换几个变量而将整个文件加载到内存中 我们正在使用Java5。有什么方法可以做到这一点吗?我在本

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


我们正在使用Java5。有什么方法可以做到这一点吗?

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

有关该过程的更多信息-


我喜欢Stephen C在这里的回答中解决问题的方式-

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

新价值
还有更多的替换规则。当然,您也可以使用规则重命名或删除所选元素等。

您可以尝试:

  • 内存效率高(XML文档大小的1.3x~1.5x)的随机访问XML解析器
  • 最快的XML解析器:在Core2 2.5Ghz桌面上,VTD-XML的性能比DOM解析器高出5倍~12倍,每个核心的持续吞吐量为150~250 MB/s
  • 支持增量更新的XML解析器,能够以最高效率剪切、粘贴、拆分和组装XML文档
  • > C、C++、C和<强> java < /强>

.

谢谢michael..我所说的标记值是指文本节点的值…这是您建议的一个新东西..将尝试..但新值将根据某些运行时业务逻辑而变化…我无法将其放入xsl中..那么我该怎么做呢?总是可以从XSLT调用Java代码-尽管不一定经常这样做人们可以想象,因为逻辑通常可以同样容易地用XSLT编写。