2012-11-15 53 views
1

我花了一些EclipseLink MOXy的愉快時間,找出了在Spring中解析XML到POJO的最佳方法。現在我已經給了一些XML來解析,並且這些文件的大小達到了令人難以置信的750MiB。EclipseLink MOXy適用於可笑的巨大XML文件嗎?

EclipseLink MOXy是否在下面使用流媒體技術,還是試圖將整個文檔放在內存中?

回答

4

說明:我是EclipseLink JAXB (MOXy)的領導者,也是JAXB (JSR-222)專家組的成員。

只要可能EclipseLink JAXB (MOXy)利用StAX XMLStreamReader來處理XML輸入。這意味着文件永遠不會留在內存中。

+0

布萊斯的東西 - 我一直在使用外部配置的元數據。關於如何在單個文件中對多個記錄進行「迭代」並在每個文件被解析時觸發某種事件的任何建議?否則,儘管XML不會被存儲在內存中,但POJO表示將立即堆起來。 –

+0

@Deejay - 我認爲您正在尋找由Ian Roberts建議的方法:http://stackoverflow.com/a/13397375/383861 –

3

我不能評論MOXy與任何其他JAXB實現,但取決於您的XML文件的結構和它們包含的數據類型,您可能需要考慮的不是解構整個XML的顯而易見的方法先將文件歸檔成對象,然後對其進行操作。例如,如果非常大的文件是由許多小的部分

<root> 
    <record> 
    <id>1</id> 
    <name>Ian</name> 
    </record> 
    <record> 
    <id>2</id> 
    <name>Deejay</name> 
    </record> 
    <!-- 100,000 more <record> elements --> 
</root> 

的你可以單獨處理各段使用像

XMLInputFactory xif = XMLInputFactory.newFactory(); 
XMLStreamReader xsr = xif.createXMLStreamReader(inputStream); 
JAXBContext ctx = JAXBContext.newInstance("com.example"); 
Unmarshaller um = ctx.createUnmarshaller(); 
xsr.nextTag(); // move to the <root> tag 
xsr.nextTag(); // move to the first <record> 

// read one <record> at a time 
JAXBElement<Record> rec = um.unmarshal(xsr, Record.class); 
// leaves the xsr pointing to the token after the </record> tag 
// so you can do something with this Record, then discard it and 
// parse the next... 
相關問題