2011-06-10 114 views
2

如何將一個長的XML文件拆分爲每個預定義的不同名稱?Java拆分XML文件

示例這是我的XML文件粘貼在一個長XML中,生成用於測試。 現在我必須拆分信封,每個新文件。

<envelope> 
<tag1>1</tag1> 
<tag2>2</tag2> 
<tag3>3</tag3> 
</envelope> 
<envelope> 
<tag1>1</tag1> 
<tag2>2</tag2> 
<tag3>3</tag3> 
</envelope> 
<envelope> 
<tag1>1</tag1> 
<tag2>2</tag2> 
<tag3>3</tag3> 
</envelope> 

我已經使用splits之前,只是不喜歡這裏,沒有開始和結束標籤爲整個xml。

+0

可能重複(http://stackoverflow.com/questions/5169978/split-1gb-xml-file-using-java) – 2011-06-10 11:59:55

+0

這個問題有**噸重複。搜索2分鐘就能找到答案。 – 2011-06-10 12:00:10

+0

是的,但不像他們,我沒有XML的開始和結束標記。 – Eve 2011-06-10 12:07:55

回答

4

我建議將它製作完好,然後使用建議的SAX或StAX解決方案之一。唯一的區別是我會避免將整個事件加載到內存中,而是通過SequenceInputStream注入開始和結束元素。

例如:

InputStream in = new SequenceInputStream(
         // start doc 
         new ByteArrayInputStream("<root>".getBytes()), 
         new SequenceInputStream(
          new FileInputStream("envelopes.txt"), 
          // end doc 
          new ByteArrayInputStream("</root>".getBytes()))); 
[拆分1GB xml文檔使用Java]的
2

正如Joachim所說,這不是一個XML。

您可以嘗試以編程方式添加根元素,將該文件保存爲某處的臨時文件,然後參考other類似的問題了解如何分割它。


接聽評論:

This可能會幫助您加載它。我懷疑你應該擔心的大小,因爲分裂它,你不得不將它加載到內存中,然後再寫一遍。

然後是這樣的:

final String xmlWithRootElement = "<root>" + IOUtils.toString(yourFile) + "</root>"; 

應該這樣做。 (沒有那麼多硬編碼字符串)

最後一件事。

我會建議找到一個可行的解決方案。那麼如果你對錶現不滿意,你可以尋找方法來優化它,或者你可以問一個性能相關的問題。

+0

我想這樣做,但xml文件更大,它具有1000個「信封」,並且也包含50行。所以加入它會有點過分 – Eve 2011-06-10 12:21:02

+0

1000包絡元素不是很多,實際上IMO相當少。如果你有一個1000000個信封元素,你可能會注意到它。文件有多大? – Simeon 2011-06-10 12:45:26

0

如何只讀文件字符並識別<envelope></envelope>序列。只要你遇到<envelope>,你就開始捕獲到緩衝區,直到達到</envelope>。這樣文件可以像文件系統一樣大。對大文件的XML處理是一件令人頭疼的事情:-)

+0

'你頭痛'是什麼意思? – Simeon 2011-06-10 12:35:12

+0

@Simeon:XML解析有很大的開銷,在這個例子中,輸入不是格式良好的XML,所以你需要解決它。 – 2011-06-10 12:36:22

+0

This http://stackoverflow.com/questions/6204827/xml-parsing-too-slow/6205624#6205624。我已經解析了一個150MB的XML和SAX(不幸的是...),然後它花了不到5秒。 – Simeon 2011-06-10 12:46:49