2012-07-26 25 views
3

我有一個xml文件存儲在數據庫blob中,用戶將通過spring/hibernate web應用程序下載。在它通過Hibernate作爲byte []獲取後,但在它被髮送到輸出流之前,我需要編輯XML的某些部分(具有兩個子節點和一個屬性的單個節點)。編輯一個大的xml文件'飛行'

我擔心的是如果文件較大(有些是40mb +),那麼我不想通過將整個文件放在內存中進行編輯,然後編輯它,然後通過輸出流將其傳遞給用戶。有沒有辦法編輯它'即時'?

byte[] b = blobRepository.get(blobID).getFile(); 
// What can I do here? 
ServletOutputStream out = response.getOutputStream(); 
out.write(b); 
+0

這裏是正確的工具的建議:http://stackoverflow.com/a/62460/784540 – 2012-07-26 15:11:59

回答

2

您可以使用SAX流。

使用SAX框架解析文件,並且當您的Handler接收SAX事件時,將未更改的項傳遞迴構造XML輸出的SAX Handler。

當你到達「要改變的部分」時,你的中介類將讀入不需要的事件,並寫出想要的事件。

這樣做的好處是不會將整個文件作爲中間表示(如DOM)存儲在內存中;但是,如果轉換很複雜,則可能需要緩存多個項目(文檔的各個部分),以便將它們用於重新排列的輸出。一個足夠複雜的轉換(可以做任何事情的轉換)最終會變成DOM的開銷,但是如果您知道自己忽略了大部分文檔,則可以節省大量內存。

2

你可以嘗試以下方法:

  1. 在Hibernate中啓用二進制數據流(集hibernate.jdbc.use_streams_for_binary在爲true)
  2. 接收XML文件作爲二進制流與ent.getBlob() .getBinaryStream()
  3. 使用支持流的XSTL處理器處理輸入流(例如,saxon)將輸出直接重定向到servlet OutputStream:javax.xml.transform.Transformer.transform(的SAXSource,新的StreamResult(response.getOutputStream()))