即时编辑大型xml文件'

时间:2012-07-26 15:01:45

标签: java xml

我有一个存储在数据库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);

2 个答案:

答案 0 :(得分:2)

您可以使用SAX流。

使用SAX框架解析文件,并且当Handler收到SAX事件时,将未更改的项目传递回构建XML输出的SAX Handler。

当您到达“要更改的部分”时,您的中间课程将读取不需要的事件,并写出想要的事件。

这样做的好处是不会将整个文件作为中间表示(比如DOM)保存在内存中;但是,如果转换很复杂,则可能必须缓存许多项(文档的各个部分),以使它们可用于重新排列的输出。一个足够复杂的转换(可以做任何事情的转换)最终变成了DOM的开销,但是如果你知道你忽略了大部分文档,那么你可以节省大量的内存。

答案 1 :(得分:2)

您可以尝试以下操作:

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