与 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 是不是更高效?的主要内容,如果未能解决你的问题,请参考以下文章
Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
JavaScripts学习日记——DOM SAX JAXP DEMO4J XPath