2011-09-13 30 views
5

我正在創建一個非常大的XML文件(700mb +),可以通過批處理大量數據。該程序充當極大型sybase數據庫和應用程序之間的接口。我目前有xsd模式綁定到類。我需要一種能夠在考慮重新啓動邏輯的情況下編寫XML的方法。Java JAXB - 使用重新啓動邏輯編寫XML文件

I.E.能夠知道我從哪裏離開。或者換句話說,如果程序失敗了,我需要能夠看到最後一次寫入XML文件的內容,以便它可以從我離開的地方繼續。這是一個例子。

<root> 
    <WorkSet> 
    <Work> 
     <Customer> 
    <Work> 
     <Customer> 
    <WorkSet> 
    <Work> 
     ..... 
<root> 

說在寫入'work'或'workset'節點後程序失敗。有沒有辦法提起我離開處理的地方?由於XML文件的剪切大小,我試圖避免將XML文件讀回到內存中(假設它完成500mb的XML並失敗)。

感謝您的幫助。

回答

3

如果您可以將數據拆分爲獨立的WorkSet元素,則可以使用JAXB的片段模式(當JAXB不寫入標頭時)一次寫出它們。稍後簡單地連接文件並添加缺少的XML聲明,打開結束結束標記。

您可能需要爲此修改您生成的類。我的意思是將@XmlRootElement添加到WorkSet Java類。如果一個WorkSet對於一個步驟仍然很大,你也可以使用Work來完成,但是你必須以某種方式生成缺失的標籤。

+0

+1 - 我正在建議這方面的一些事情。 –

+0

在工作集java類中添加@XmlRootElement標記是否會在多個工作集連接後影響一個大型XML文件的功能?我在JAXB上有點新,所以讓我知道如果我沒有正確理解它。 – TyC

+1

我不認爲添加'@ XmlRootElement'會影響你以前的功能。 如果不添加'@ XmlRootElement',Marshaller.marshal()會拋出以下異常:'com.sun.istack.SAXException2:無法編組類型「org.package.MyWorkSet」作爲元素,因爲它缺少@ XmlRootElement註釋'。 – palacsint

2

我不認爲JAXB是這個職位的合適的工具,但是......

你可以寫一個自定義器實現持續跟蹤已編組什麼對象,並使用分段模式寫出來個別物體。

+0

+1 JAXB聽起來並不像這裏的正確工具。爲什麼不使用只使用SAX解析器,你可以自己跟蹤你在文件中的位置。看看StAX,例如... http://stax.codehaus.org/Home – Brad