# XML API 的简单 API

> 原文： [https://docs.oracle.com/javase/tutorial/jaxp/intro/simple.html](https://docs.oracle.com/javase/tutorial/jaxp/intro/simple.html)

SAX 解析 API 的基本概要如[图 1-1](#gcezl) 所示。要启动该过程， `SAXParserFactory` 类的实例用于生成解析器的实例。

图 1-1 SAX API

![The SAX APIs](img/a5c19e73860b8327ec4460afcd0fcdf5.jpg)

解析器包装 `SAXReader` 对象。当调用解析器的 `parse（）`方法时，读者会调用应用程序中实现的几种回调方法之一。这些方法由接口 `ContentHandler` ， `ErrorHandler` ， `DTDHandler` 和 `EntityResolver` 定义。

以下是关键 SAX API 的小结：

`SAXParserFactory`

`SAXParserFactory` 对象创建由系统属性 `javax.xml.parsers.SAXParserFactory` 确定的解析器实例。

`SAXParser`

`SAXParser` 接口定义了几种 `parse（）`方法。通常，您将 XML 数据源和 `DefaultHandler` 对象传递给解析器，解析器处理 XML 并调用处理程序对象中的相应方法。

`SAXReader`

`SAXParser` 包装 `SAXReader` 。通常，你不关心这一点，但每隔一段时间你需要使用 `SAXParser` 的 `getXMLReader（）`来掌握它，以便你可以配置它。 `SAXReader` 与您定义的 SAX 事件处理程序进行对话。

`DefaultHandler`

未在图中显示， `DefaultHandler` 实现 `ContentHandler` ， `ErrorHandler` ， `DTDHandler` 和 `EntityResolver` 接口（使用 null 方法），因此您只能覆盖您感兴趣的那些。

`ContentHandler`

识别 XML 标记时，会调用 `startDocument` ， `endDocument` ， `startElement` 和 `endElement` 等方法。此接口还定义了方法 `characters（）`和 `processingInstruction（）`，它们在解析器分别遇到 XML 元素或内联处理指令中的文本时调用。

`ErrorHandler`

方法 `error（）`， `fatalError（）`和 `warning（）`被调用以响应各种解析错误。默认错误处理程序会抛出致命错误的异常并忽略其他错误（包括验证错误）。这是您需要了解 SAX 解析器的一个原因，即使您使用的是 DOM。有时，应用程序可能能够从验证错误中恢复。其他时候，可能需要生成异常。为确保正确处理，您需要为解析器提供自己的错误处理程序。

`DTDHandler`

定义通常永远不会被调用的方法。在处理 DTD 以识别和处理未解析实体的声明时使用。

`EntityResolver`

当解析器必须标识由 URI 标识的数据时，将调用 `resolveEntity` 方法。在大多数情况下，URI 只是一个 URL，它指定文档的位置，但在某些情况下，文档可能由 URN 标识 - 一个公共标识符或名称，在 Web 空间中是唯一的。除了 URL 之外，还可以指定公共标识符。 `EntityResolver` 然后可以使用公共标识符而不是 URL 来查找文档 - 例如，访问文档的本地副本（如果存在）。

典型的应用程序至少实现了大多数 `ContentHandler` 方法。因为接口的默认实现忽略除致命错误之外的所有输入，所以强健实现也可能想要实现 `ErrorHandler` 方法。

## SAX 包

SAX 解析器在以下[表](#gceyy)中列出的包中定义。

表 SAX 包

<colgroup><col width="50%"> <col width="50%"></colgroup>
| 

包

 | 

描述

 |
| :-- | :-- |
| `org.xml.sax` | 定义 SAX 接口。名称 `org.xml` 是由定义 SAX API 的组确定的包前缀。 |
| `org.xml.sax.ext` | 定义用于执行更复杂的 SAX 处理的 SAX 扩展 - 例如，处理文档类型定义（DTD）或查看文件的详细语法。 |
| `org.xml.sax.helpers` | 包含可以更容易使用 SAX 的辅助类 - 例如，通过定义一个对所有接口都有 null 方法的默认处理程序，这样您只需要覆盖实际想要实现的那些。 |
| `javax.xml.parsers` | 定义 `SAXParserFactory` 类，它返回 `SAXParser` 。还定义了报告错误的异常类。 |