我需要解析一个 xml 字符串并查找特定文本节点的值、属性值等。我在 javascript 中执行此操作,并且使用 DOMParser 类来实现相同的目的。后来我被告知 DOM 会占用大量内存,而 SAX 是一个更好的选择。
最近我发现 XPath 也提供了一种查找节点的简单方法。
但我不确定这 3 种中哪一种是解析 XML 的最有效方法。请帮助....
SAX 是一个自上而下的解析器,允许对 XML 文档进行串行访问,并且适用于只读访问。另一方面,DOM 更健壮 - 它将整个 XML 文档读入树中,当您想要更改、添加、删除该 XML 树中的数据时非常有效。当您只需要 XML 文档中的几个值并且您知道在哪里可以找到它们(您知道数据的路径,/root/item/challange/text)时,XPath 很有用。
SAX:迭代文档时节省时间,每次迭代都只通过一次
DOM:灵活/性能,为您提供更多处理数据的方法
XPath:当您只需要读取几个值时,节省时间
除非您使用流式 XPath的研究原型,否则您的 XPath 引擎很可能正在将所有内容加载到内存中,因此它将具有与 DOM 相似的特性。因此,这取决于您对“效率”的定义。它当然更易于使用,并且 XPath 实现可以更改为更有效,而 DOM 将始终在客户端机器上具有整个文档的某种表示,并且 SAX 总是比 XPath 更难编程。
这份来自 MSDN 的文档提供了有关优化 XML 处理的大量信息。
特别是,XPathDocument 类被设计为比使用(基于 DOM)XmlDocument 类更有效地评估 XPath 表达式。原因是 XPathDocument 是 XML 文档的只读表示,而 DOM 实现还包括更改文档。
使用 DOM 有一个同样重要的缺点,它通常会导致复杂的、意大利面条式的代码难以理解和维护。
请参阅http://code.google.com/p/jlibs/wiki/XMLDog
我们为 XMLDog 提供一组 xpath 并要求嗅探一些 XML 文档。它使用 SAX 并通过一次遍历文档来评估所有给定的 XPath。
如果您只需要查找特定文本节点的值,那么 XPath。DOM 占用大量内存的原因是它读取整个 XML 并形成文档树。SAX 是基于事件的。因此,根据您的描述,XPath 最适合您的方案。