# DOM 与 Java 中的 SAX 解析器

> 原文： [https://howtodoinjava.com/xml/dom-vs-sax-parser-in-java/](https://howtodoinjava.com/xml/dom-vs-sax-parser-in-java/)

**DOM 与 SAX 解析器之间的区别**是非常流行 [**Java 面试问题**](//howtodoinjava.com/java-interview-questions/ "Java Interview Questions") ，当在 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 解析器，然后合并结果或使处理与每个文档配合 其他。

学习愉快！