与 DOM 和 SAX 相比,XPath 是不是更高效?

Posted

技术标签:

【中文标题】与 DOM 和 SAX 相比,XPath 是不是更高效?【英文标题】:Is XPath much more efficient as compared to DOM and SAX?与 DOM 和 SAX 相比,XPath 是否更高效? 【发布时间】:2010-10-15 21:40:03 【问题描述】:

我需要解析一个 xml 字符串并查找特定文本节点的值、属性值等。 我在 javascript 中执行此操作,并且正在使用 DOMParser 类。后来我得知 DOM 会占用大量内存,而 SAX 是更好的选择。

最近我发现 XPath 也提供了一种简单的方法来查找节点。

但我不确定这 3 种中哪一种是解析 XML 的最有效方法。 请帮忙....

【问题讨论】:

【参考方案1】:

SAX 是一个自上而下的解析器,允许对 XML 文档进行串行访问,并且适用于只读访问。另一方面,DOM 更健壮 - 它将整个 XML 文档读入树中,当您想要更改、添加、删除该 XML 树中的数据时非常有效。当您只需要 XML 文档中的几个值并且您知道在哪里可以找到它们(您知道数据的路径 /root/item/challange/text)时,XPath 很有用。

SAX:迭代文档时节省时间,每次迭代只通过一次

DOM:灵活/高性能,为您提供更多处理数据的方式

XPath:只需读取几个值即可节省时间

【讨论】:

别忘了提到 vtd-xml,内置 xpath 实现。【参考方案2】:

除非您使用streaming XPath 的研究原型,否则您的XPath 引擎很可能正在将所有内容加载到内存中,因此它将具有与DOM 相似的特性。因此,这取决于您对“效率”的定义。它当然更易于使用,并且 XPath 实现可以更改为更有效,而 DOM 将始终在客户端机器上具有整个文档的某种表示,并且 SAX 将始终比 XPath 更难编程。

【讨论】:

我觉得奇怪的是其他答案没有提到你的观点,因为 XPath 仍然必须以某种方式解析文档。 DOM、SAX 和 XPath 是访问文档的不同 API;但只有 DOM 和 SAX 是文档的解析器。除非某些#C 为我们不知道的 XPath 提供解析器? 顺便说一句:您链接的 XSQ 在下面使用 SAX 进行解析 - 它没有特定的 XPath 解析器。 是的,它是流解析器之上的一层,而不是对象模型。【参考方案3】:

This document from MSDN 提供了大量有关优化 XML 处理的信息

特别是,XPathDocument 类被设计为比使用(基于 DOM)XmlDocument 类更有效地评估 XPath 表达式。原因是 XPathDocument 是 XML 文档的只读表示,而 DOM 实现还包括更改文档。

使用 DOM 有一个同样重要的缺点,它通常会导致复杂的意大利面条式代码难以理解和维护。

【讨论】:

【参考方案4】:

见http://code.google.com/p/jlibs/wiki/XMLDog

我们为 XMLDog 提供一组 xpath 并要求嗅探一些 XML 文档。 它使用 SAX 并通过它评估的文档 所有给定的 XPath。

【讨论】:

【参考方案5】:

如果您只需要查找特定文本节点的值,那么 XPath。 DOM 占用大量内存的原因是它读取整个 XML 并形成文档树。 SAX 是基于事件的。因此,根据您的描述,XPath 最适合您的场景。

【讨论】:

以上是关于与 DOM 和 SAX 相比,XPath 是不是更高效?的主要内容,如果未能解决你的问题,请参考以下文章

sax的解析原理基础

DOM 与 XPath - 区别? [关闭]

Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

JavaScripts学习日记——DOM SAX JAXP DEMO4J XPath

Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)

SAX - Hello World