1

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

我们使用我们自己的 DOM 实现,它是使用延迟加载实现的(即一开始只从文件中加载 DOM 的前两层,如果调用 getChildNodes()/etc.,我们将返回文件并加载更多层)。这非常慢,但是,我们能够加载更大的文件,尤其是如果我们只使用文件的一部分。

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

4

2 回答 2

2

这可以用几行代码进行测试,只需将您的 DOM 提供给 XPath 评估器,并在您的 DOM 方法中放置一些断点/调试打印。如果它们被调用以获取不应检索的元素,则它会构建自己的树。示例:尝试仅查询文档的第一个孩子并查看它将实际尝试检索的内容。

如果您的文件太大,您还可以检查完全不同的方法吗?称为SAX

于 2013-02-21T00:20:23.847 回答
0

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

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

即使您没有惰性 DOM 实现,这也应该非常糟糕,无论如何这真的很糟糕......

于 2013-03-02T19:52:50.440 回答