此页面的Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发行说明。
SAX解析API的基本概述如图 1-1所示。要开始该过程,需要使用SAXParserFactory类的一个实例来生成解析器的实例。
解析器包装了一个SAXReader对象。当调用解析器的parse()方法时,读取器会调用应用程序中实现的多个回调方法。这些方法由ContentHandler、ErrorHandler、DTDHandler和EntityResolver接口定义。
以下是关键SAX API的摘要:
SAXParserFactory对象创建一个解析器的实例,该实例由系统属性javax.xml.parsers.SAXParserFactory确定。
SAXParser接口定义了几种parse()方法。通常,您将XML数据源和一个DefaultHandler对象传递给解析器,解析器处理XML并调用处理程序对象中的适当方法。
SAXParser包装了一个SAXReader。通常情况下,您不需要关心它,但偶尔需要使用SAXParser的getXMLReader()来获取它,以便您可以对其进行配置。它是SAXReader与您定义的SAX事件处理程序之间进行交流的组件。
在图表中未显示,DefaultHandler实现了ContentHandler、ErrorHandler、DTDHandler和EntityResolver接口(带有空方法),因此您只能重写您感兴趣的方法。
当识别到XML标签时,会调用startDocument、endDocument、startElement和endElement等方法。此接口还定义了characters()和processingInstruction()方法,当解析器遇到XML元素或内联处理指令中的文本时,会调用这些方法。
在处理各种解析错误时,会调用error()、fatalError()和warning()方法。默认错误处理程序对致命错误抛出异常,忽略其他错误(包括验证错误)。这是您需要了解SAX解析器的原因之一,即使您正在使用DOM。有时,应用程序可能能够从验证错误中恢复。其他时候,可能需要生成异常。为确保正确处理,您需要为解析器提供自己的错误处理程序。
定义了一些您通常不需要使用的方法。在处理DTD时,用于识别和处理未解析实体的声明。
当解析器必须识别由URI标识的数据时,会调用resolveEntity方法。在大多数情况下,URI只是一个URL,指定文档的位置,但在某些情况下,文档可能由一个URN(唯一的公共标识符或名称)标识。公共标识符可以在URL之外指定。在这种情况下,EntityResolver可以使用公共标识符而不是URL来查找文档,例如,访问文档的本地副本(如果存在)。
一个典型的应用程序至少实现了大部分ContentHandler方法。因为接口的默认实现除了致命错误外都忽略所有的输入,所以一个健壮的实现也可以实现ErrorHandler方法。
SAX解析器在下表中列出的包中定义。
包 |
描述 |
---|---|
org.xml.sax |
定义SAX接口。名称org.xml是由定义SAX API的组确定的包前缀。 |
org.xml.sax.ext |
定义用于执行更复杂的SAX处理的SAX扩展,例如处理文档类型定义(DTD)或查看文件的详细语法。 |
org.xml.sax.helpers |
包含使使用SAX更容易的辅助类,例如通过定义一个默认处理程序,其中所有接口的方法都为空方法,因此您只需要重写您实际想要实现的方法。 |
javax.xml.parsers |
定义SAXParserFactory类,它返回SAXParser。还定义了用于报告错误的异常类。 |