2013-07-11 85 views
2

使用DOM在java中處理XML文檔對於包含大量重複節點,屬性或值的文檔而言可能會過度佔用內存。使用Flyweight設計的XML DOM解析

有誰知道Java XML DOM API在內部利用flyweight模式來將內存佔用降至最低?甚至可以配置/啓用/禁用?

+0

我懷疑有一個flyweight模式的DOM類實現,因爲改變樹中的值(這是DOM的)很難實現。 –

+0

或者只要用戶明白,由於節點是相同的變化,所以會改變它們,共享資源就是輕量級所關心的。 DOM假設一切都是獨一無二的,事情並非總是如此。 –

回答

-1

它不是DOM,但SAX(javax.xml.parsers.SAXParser)應該是有幫助的。

Parsing an XML File Using SAX

+0

這不是對問題的回答。 DOM有一些SAX沒有的屬性(例如導航)。 –

0

我不知道這樣一個DOM解析器的(並不意味着它不存在)。但是,也許StAX解析器將接近您正在搜索的內容。

1

你真的認爲flyweight模式?或者沒有考慮過像延遲加載(或者「懶惰解析」)?使用flyweight模式需要解析器識別具有相同內容(和結構)的元素。這將是非常耗時的操作(我擔心,這也會耗費空間)。另外,解析器應該在哪個深度開始識別flyweights?

事實上,我無法想象有任何DOM分析器可以識別flyweights。並且也沒有使用延遲加載的DOM解析器。這就是DOM的本質:解析整個XML文件併爲高度靈活和隨機的導航生成數據結構。

也許你確實可以通過使用SAXStAX切換到流式處理。當然,你將失去靈活和隨機導航的能力,因爲你現在必須「即時」處理你的元素。

但是,有一個解析器叫做VTD-XML。考慮到記憶效率而開發了這個功能。它還將整個XML文件加載到內存中,並提供一些方法來瀏覽元素。但要注意的是:這個導航有點複雜,並不是非常直觀(由於存儲器的高效存儲性質)。但也許這是你可以使用的東西。