2013-05-06 87 views
0

我正在使用java 6並處理一些非常大的xml文檔......我需要解析它們並修改一些值,然後序列化回磁盤。什麼是反序列化和序列化xml文檔的最快方法?

我使用的org.w3c.dom反序列化的XML文件,並修改了一些屬性值,我用JAXP變壓器序列化已經改變了DOM文檔。但是我發現,這是很慢...

所以我不知道是否有序列化的DOM文檔,或處理大XML文檔的更有效的方法?

更新:

我用了一個定時器來記錄它會針對每個部分有多長,下面是序列化:

// serialize the updated DOM 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 

long t0 = timer.currentTimeMillis(); 
DOMSource source = new DOMSource(dom); 
StreamResult result = new StreamResult(doc); 
transformer.transform(source, result); 
long t1 = timer.currentTimeMillis(); 

Reporter.log("Finished serializing " + doc.getAbsolutePath() + " in " + (((t1 - t0))/1000.0f) + " s.", true); 

和日誌顯示:

.... 
Finished serializing C:\Usrs\Adminstrator\Documents\Docs\InitialDocument_1.xml in 53 s. 
+1

「大」有多大? 10K? 100K?幾千兆字節? – 2013-05-06 19:14:12

回答

3

你應該考慮使用StAX。 DOM在這裏不適合。你可以在這裏看到比較。

http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html

您可以參考以下網址的示例代碼。

http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html

+0

嗨@dkaustubh,謝謝你的回答!我用一個計時器來記錄每個部分需要多長時間(例如,從xml到dom的轉換,解析dom,序列化)。序列化在90KB文件上需要大約50秒,這對我來說沒有任何意義......我不知道序列化部分有什麼問題...... – 2013-05-06 19:34:44

+0

@ D.Q。你能不能與定時器分享你的代碼? – dkaustubh 2013-05-06 19:37:11

+0

請查看帖子的更新。 – 2013-05-06 19:52:19

1

的最快方法是StAX的。最簡單的方法是JAXB。

+1

vtd-xml實際上比StAx更快,它甚至不是很接近 – 2013-05-14 19:42:02

2

您是否嘗試過使用SAX接口?

如果你需要非常大的XML文檔的真快處理,你必須避開DOM結構。看看非DOM解析器是這樣的:

http://vtd-xml.sourceforge.net/

0

50秒連載90KB是瘋了。 DOM很慢,但並不慢;有什麼地方出了問題,我不知道是什麼。

它嚴重誤導描述90KB爲「大」,然而,這錯誤描述可能影響一些答案。

你需要多快?我的猜測是,像XSLT這樣的標準轉換機制足夠快。

另一個相關因素是,您需要對內容進行哪些更改?很大程度上取決於所需邏輯的複雜性。