DOM 与 Java 中的 SAX 解析器
DOM 与 Java 中的 SAX 解析器
DOM 与 SAX 解析器之间的区别是非常流行 Java 面试问题 ,当在 Java 和 XML 上进行面试时经常被问到。 DOM 和 SAX 解析器都广泛用于在 Java 应用中读取和解析 XML 文件,它们都有各自的优缺点。 在这篇文章中,我列出了两个解析器之间的一些明显的差异。
1. Java 中的 DOM XML 解析器
DOM 解析器是基于树的 API 。 基于树的 API 以树结构为中心,因此在树的组件(是 DOM 文档)上提供接口,例如Document
接口,Node
接口, NodeList
接口,Element
接口,Attrubute
接口等等。
DOM 解析器根据输入文档在内存中创建树结构,然后等待来自客户端的请求。 DOM 解析器始终将整个文档提供给客户端应用,无论客户端实际需要多少。 使用 DOM 解析器,客户端应用中的方法调用必须是显式的,并形成一种链式方法调用。
2. Java 中的 SAX XML 解析器
SAX 解析器是基于事件的 API 。 通常,基于事件的 API 在处理器上提供接口。 有四个处理器接口,ContentHandler
接口, DTDHandler
接口,EntityResolver
接口和ErrorHandler
接口。
SAX 解析器不会创建任何内部结构。 取而代之的是,它将输入文档中组件的出现视为事件,并告诉客户端在读取输入文档时所读取的内容。 SAX 解析器始终在任何给定时间始终仅将文档的片段提供给客户端应用。 使用 SAX 解析器,当在 xml 文档上解析期间发生某些特定事件时,某些自定义方法称为“回调”方法。 尽管我们可以显式调用它们,但客户端不必显式调用这些方法。
3. Java 中的 DOM 和 SAX XML 解析器之间的区别
让我们列出一个容易记住的差异简短列表。
DOM(文档对象模型)
- 解析整个文档
- 将结果表示为树
- 让您搜索树
- 让您修改树
- 适合读取数据/配置文件
SAX
- 解析直到您告诉它停止
- 为每个事件触发事件处理器:
- 开始标签
- 标签正文
- 结束标签
- 低级 API
- 适用于非常大的文档,特别是如果您只关心文档的一小部分。
4.如何在 DOM 和 SAX 解析器之间进行选择?
理想情况下,一个好的解析器应该是快速的(省时的),节省空间的,功能丰富的并且易于使用的。 但是实际上,没有一个主要的解析器同时具有所有这些功能。 例如,DOM 解析器功能丰富(因为它在内存中创建了 DOM 树,并允许您重复访问文档的任何部分,并允许您修改 DOM 树),但是当文档很大时,空间效率低下 ,并且需要花费一些时间来学习如何使用它。
但是,在输入文档较大的情况下,SAX 解析器的空间效率要高得多(因为它不创建内部结构)。 而且,由于它的 API 非常简单,因此与 DOM 分析器相比,它运行更快且更易于学习。 但是从功能的角度来看,它提供的功能较少,这意味着用户自己必须承担更多的责任,例如创建自己的数据结构。
我认为答案确实取决于您的应用的特性和当前的要求。
5.可以同时使用 SAX 和 DOM 解析器吗?
是,当然,因为 DOM 解析器和 SAX 解析器的使用是独立的。 例如,如果您的应用需要处理两个 XML 文档,并且对每个文档执行不同的操作,则可以对一个文档使用 DOM 解析器,对另一个文档使用 SAX 解析器,然后合并结果或使处理与每个文档配合 其他。