XML API 的简单 API
原文: https://docs.oracle.com/javase/tutorial/jaxp/intro/simple.html
SAX 解析 API 的基本概要如图 1-1 所示。要启动该过程, SAXParserFactory
类的实例用于生成解析器的实例。
图 1-1 SAX API
解析器包装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 解析器在以下表中列出的包中定义。
表 SAX 包
|
包
|
描述
|
| :— | :— |
| 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
。还定义了报告错误的异常类。 |