即时编辑大型XML文件

3
我有一个存储在数据库blob中的xml文件,用户将通过spring/hibernate web应用程序下载。在它被Hibernate作为byte[]检索出来但在它被传送到输出流之前我需要编辑XML的某些部分(具体为一个单节点含两个子节点和一个属性)。我的担忧是如果这些文件很大(一些是40mb+),那么我就不想通过将整个文件存在内存中进行编辑,然后通过输出流传递给用户。是否有一种可以实时编辑的方法?
byte[] b = blobRepository.get(blobID).getFile();
// What can I do here?
ServletOutputStream out = response.getOutputStream();
out.write(b);

这里有一个关于正确工具的建议:https://dev59.com/gkXRa4cB1Zd3GeqPpCDJ#62460 - user784540
2个回答

2
您可以使用SAX流。
使用SAX框架解析文件,当您的处理程序接收到SAX事件时,将未更改的项传递回构造XML输出的SAX处理程序。
当您到达“要更改的部分”时,那么您的中介类将读取不需要的事件,并写出所需的事件。
这样做的好处是不会像中间表示(例如DOM)一样将整个文件保存在内存中;但是,如果转换很复杂,您可能必须缓存许多项(文档的各个部分),以便它们可用于重新排列输出。 复杂到足以做任何事情的转换(即可能会变成DOM的开销),但如果您知道忽略了文档的大部分内容,则可以节省大量内存。

2
你可以尝试以下操作:
  1. 在Hibernate中启用二进制数据流(将hibernate.jdbc.use_streams_for_binary设置为true)
  2. 使用ent.getBlob().getBinaryStream()接收XML文件作为二进制流
  3. 使用支持流式处理的XSTL处理器(例如saxon),将输出直接重定向到servlet OutputStream:javax.xml.transform.Transformer.transform(SAXSource, new StreamResult(response.getOutputStream()))

请注意,本文中保留了HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接