🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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 解析器,然后合并结果或使处理与每个文档配合 其他。 学习愉快!