XML API 的简单 API

Figure 1-1中显示了 SAX 解析 API 的基本概述。首先,使用SAXParserFactory类的实例来生成解析器的实例。

图 1-1 SAX API

SAX API

解析器包装SAXReader对象。调用解析器的parse\(\)方法时,读取器将调用应用程序中实现的几种回调方法之一。这些方法由interfaceContentHandlerErrorHandlerDTDHandlerEntityResolver定义。

这是关键 SAX API 的摘要:

  • SAXParserFactory

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

    • SAXParserinterface定义了几种parse\(\)方法。通常,您将 XML 数据源和DefaultHandler对象传递给解析器,该解析器处理 XML 并调用处理程序对象中的适当方法。
  • SAXReader

    • SAXParser包装SAXReader。通常,您不必担心,但是偶尔需要使用SAXParsergetXMLReader\(\)掌握它,以便进行配置。 SAXReader与您定义的 SAX 事件处理程序进行对话。
  • DefaultHandler

    • 图中未显示,DefaultHandler实现ContentHandlerErrorHandlerDTDHandlerEntityResolverinterface(使用空方法),因此您只能覆盖您感兴趣的interface。
  • ContentHandler

    • 识别 XML 标签时,将调用诸如startDocumentendDocumentstartElementendElement之类的方法。此interface还定义了方法characters\(\)processingInstruction\(\),当解析器遇到 XML 元素或内联处理指令中的文本时分别调用。
  • ErrorHandler

    • 响应各种解析错误,调用方法error\(\)fatalError\(\)warning\(\)。默认错误处理程序将引发致命错误的异常,并忽略其他错误(包括验证错误)。这是即使您正在使用 DOM,也需要了解有关 SAX 解析器的原因之一。有时,应用程序可能能够从验证错误中恢复。在其他时间,可能需要生成异常。为了确保正确处理,您将需要向解析器提供自己的错误处理程序。
  • DTDHandler

    • 定义通常不会调用的方法。在处理 DTD 以识别未解析实体的声明并对其执行操作时使用。
  • EntityResolver

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

典型的应用程序至少要实现大多数ContentHandler方法。由于interface的默认实现会忽略致命错误以外的所有 Importing,因此可靠的实现可能还希望实现ErrorHandler方法。

SAX Packages

SAX 解析器在以下Table列出的软件包中定义。

表 SAX 软件包

PackagesDescription
org\.xml\.sax定义 SAX interface。名称org\.xml是定义 SAX API 的组确定的软件包前缀。
org\.xml\.sax\.ext定义用于执行更复杂的 SAX 处理的 SAXextensions,例如,用于处理文档类型定义(DTD)或查看文件的详细语法。
org\.xml\.sax\.helpers包含一些帮助程序类,这些类使使用 SAX 更加容易,例如,通过定义一个默认处理程序,该处理程序对所有interface都具有 null 方法,从而使您仅需要覆盖实际要实现的interface即可。
javax\.xml\.parsers定义SAXParserFactory类,该类返回SAXParser。还定义了用于报告错误的异常类。