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

  • 解析直到您告诉它停止
  • 为每个事件触发事件处理器:
    1. 开始标签
    2. 标签正文
    3. 结束标签
  • 低级 API
  • 适用于非常大的文档,特别是如果您只关心文档的一小部分。

4.如何在 DOM 和 SAX 解析器之间进行选择?

理想情况下,一个好的解析器应该是快速的(省时的),节省空间的,功能丰富的并且易于使用的。 但是实际上,没有一个主要的解析器同时具有所有这些功能。 例如,DOM 解析器功能丰富(因为它在内存中创建了 DOM 树,并允许您重复访问文档的任何部分,并允许您修改 DOM 树),但是当文档很大时,空间效率低下 ,并且需要花费一些时间来学习如何使用它。

但是,在输入文档较大的情况下,SAX 解析器的空间效率要高得多(因为它不创建内部结构)。 而且,由于它的 API 非常简单,因此与 DOM 分析器相比,它运行更快且更易于学习。 但是从功能的角度来看,它提供的功能较少,这意味着用户自己必须承担更多的责任,例如创建自己的数据结构。

我认为答案确实取决于您的应用的特性和当前的要求

5.可以同时使用 SAX 和 DOM 解析器吗?

,当然,因为 DOM 解析器和 SAX 解析器的使用是独立的。 例如,如果您的应用需要处理两个 XML 文档,并且对每个文档执行不同的操作,则可以对一个文档使用 DOM 解析器,对另一个文档使用 SAX 解析器,然后合并结果或使处理与每个文档配合 其他。