2013-02-21 71 views
1

我想将非常大的XML文件加载到DOM树(使用JAXP)中,执行一些修改并在生成的DOM上运行XPath查询。DOM节点上的Java,XPath

我们使用我们自己的DOM实现,它使用延迟加载来实现(即在开始时只有DOM的前两个级别从文件中加载,如果调用getChildNodes()/ etc,我们会返回到文件并加载更多级别)。这很慢,但是,我们能够加载更大的文件,特别是如果我们只使用文件的一部分。

我的问题:XPath在XML(afaik)上使用了不同的视图。我很好奇,如果默认的Oracle JDK实现现在将整个DOM文档转换为一些内部XPath文档(这将非常糟糕,因为它会急切地加载整个文档),或者如果XPath实现能够直接在我们的DOM树(即,如果XPath可以在已加载的元素中进行评估,则不会进一步加载)。

+1

你是什么意思_very big_?如果您在运行时查看内存消耗,您的问题是否会得到解答? – jlordo 2013-02-21 00:15:54

+0

为什么你认为XPath使用DOM以外的东西? FWIW,至少有一个我已经看到的错误表明它以常规形式使用DOM(该错误涉及遍历整个DOM,并且基于树中深层的上下文进行搜索)。 – parsifal 2013-02-21 20:05:53

+0

规范没有提到DOM作为底层模型,并且Apache Xalan-J实现(这是Oracle JDK中使用的afaik)似乎使用某种DTM(http://xml.apache.org/xalan-j /dtm.html)。但是,我无法确定DOM是否完全在DTM中转换,或者只有评估XPathExpression所需的特定部分,或者DTM是否仅适用于DOM。 – 2013-02-21 20:33:05

回答

0

我们的DOM实现现已完成,因此我现在可以测试:

不幸的是,官方的JDK实施以及当前的Xalan-J实施的评估之前,整个DOM树转换为内部数据结构路径。

这应该是非常糟糕的,即使你没有一个偷懒的DOM实现,这是在任何情况下非常糟糕......

2

这可以用几行代码进行测试,只需将您的DOM提供给XPath评估程序,并将少量断点/调试打印输入到DOM方法中即可。如果它们被调用了不应该被检索的元素,那么它会构建它自己的树。示例:尝试仅查询文档的第一个孩子,并查看它将实际尝试检索的内容。

也可能你可以检查从根本上不同的方法,如果你的文件是如此之大?称为SAX

+0

我一直在说谎:我们懒惰的DOM实现尚未实现,我们目前正在研究如果甚至有可能使用懒惰的DOM树(例如通过XPath以及其他访问方法) 所以我很好奇是否有人知道默认的JDK XPath实现。我猜,DOM树上的XPath将会是一个常规情况。 – 2013-02-21 17:00:25