2013-07-11 57 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文件加载到内存中,并提供一些方法来浏览元素。但要注意的是:这个导航有点复杂,并不是非常直观(由于存储器的高效存储性质)。但也许这是你可以使用的东西。