在现实开发应用中,SAX将其事件分为如下的接口。
□ContentHandler:定义与文档本身关联的事件(例如,开始和结束标记)。大多数应用程序都注册这些事件。
□DTDHandler:定义与DTD关联的事件。然而,它不定义足够的事件来完整地报告DTD。如果需要对DTD进行语法分析,请使用可选的DeclHandler。DeclHandler是SAX的扩展,并且不是所有的语法分析器都支持它。
□EntityResolver:定义与装入与实体关联的事件。只有少数几个应用程序注册这些事件。
□ErrorHandler:定义错误事件。许多应用程序注册这些事件以便用它们自己的方式报错。 为简化工作,SAX在DefaultHandler类中提供了这些接口的默认实现。在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法要比直接实现一个接口更容易。
1.XMLReader
如果为事件注册处理器并启动语法分析器,应用程序应该使用XMLReader接口,实现方法是使用XMLReader的parse()方法来启动,具体语法格式如下。
XMLReader中的主要方法如下。
(1)parse():对XML文档进行语法分析。parse()有两个版本,一个接受文件名或URL,另一个接受InputSource对象。
(2)setContentHandler()、setDTDHandler()、setEntityResolver()和setErrorHandler():为应用程序注册事件处理器。
(3)setFeature()和setProperty():控制语法分析器如何工作。它们采用一个特性或功能标识(一个类似于名称空间的URI和值)。功能采用Boolean值,而特性则采用“对象”。
最常用的XMLReaderFactory功能如下。
(1)http://xml.org/sax/features/namespaces:所有SAX语法分析器都能识别它。如果将它设置为true(默认值),则在调用ContentHandler的方法时,语法分析器将识别出名称空间并解析前缀。
(2)http://xml.org/sax/features/validation:它是可选的。如果将它设置为true,则验证语法分析器将验证该文档。非验证语法分析器忽略该功能。
2.XMLReaderFactory
XMLReaderFactory用于创建语法分析器对象,它定义了createXMLReader()的如下两个版本。
□一个采用语法分析器的类名作为参数。
□一个从org.xml.sax.driver系统特性中获得类名称。
对于Xerces,类是org.apache.xerces.parsers.SAXParser。应该使用XMLReaderFactory,因为它易于切换至另一种SAX语法分析器。实际上,只需要更改下面一行然后重新编译即可。
为获得更大的灵活性,应用程序可以从命令行读取类名或使用不带参数的createXMLReader()方法。因此可以不重新编译就可以更改语法分析器。
3.InputSource
InputSource控制语法分析器如何读取文件,包括XML文档和实体。在大多数情况下,文档是从URL装入的。但是,有特殊需求的应用程序可以覆盖InputSource。例如,可以用来从数据库中装入文档。
4.ContentHandler
ContentHandler是最常用的SAX接口,因为它定义XML文档的事件。ContentHandler声明以下几个事件。
(1)startDocument()/endDocument():通知应用程序文档的开始或结束。
(2)startElement()/endElement():通知应用程序标记的开始或结束。属性作为Attributes参数传递。即使只有一个标记,“空”元素(例如,<imghref="logo.gif"/>)也生成startElement()和endElement()。
(3)startPrefixMapping()/endPrefixMapping():通知应用程序名称空间作用域。几乎不需要该信息,因为当http://xml.org/sax/features/namespaces为true时,语法分析器已经解析了名称空间。
(4)当语法分析器在元素中发现文本时,characters()/ignorableWhitespace()会通知应用程序。语法分析器负责将文本分配到几个事件(为了更好地管理其缓冲区)。ignorableWhitespace事件用于接收元素内容中可忽略空白的通知。
(5)processingInstruction():将处理指令通知应用程序。
(6)skippedEntity():通知应用程序已经跳过了一个实体。(www.xing528.com)
(7)setDocumentLocator():将Locator对象传递到应用程序。不需要SAX语法分析器提供Locator,但是如果它提供了,则必须在任何其他事件之前激活该事件。
5.属性
在startElement()事件中,应用程序在Attributes参数中接收属性列表。
Attributes定义了下列方法。
□getValue(i)/getValue(qName)/getValue(uri,localName):返回第i个属性值或给定名称的属性值。
□getLength():返回属性数目。
□getQName(i)/getLocalName(i)/getURI(i):返回限定名(带前缀)、本地名(不带前缀)和第i个属性的名称空间URI。
□getType(i)/getType(qName)/getType(uri,localName):返回第i个属性的类型或者给定名称的属性类型。类型为字符串,即在DTD中所使用的:“CDATA”、“ID”、“IDREF”、“IDREFS”、“NMTOKEN”、“NMTOKENS”、“ENTITY”、“ENTITIES”或“NOTATION”。
注意:Attributes参数仅在startElement()事件期间可用。如果在事件之间需要它,则需用AttributesImpl复制一个。
6.定位器
Locator为应用程序提供行和列的位置。不需要语法分析器来提供Locator对象。Locator定义下列方法。
□getColumnNumber():返回当前事件结束时所在的列。在endElement()事件中,它将返回结束标记所在的最后一列。
□getLineNumber():返回当前事件结束时所在的行。在endElement()事件中,它将返回结束标记所在的行。
□getPublicId():返回当前文档事件的公共标识。
□getSystemId():返回当前文档事件的系统标识。
7.DTDHandler
DTDHandler声明两个与DTD语法分析器相关的事件。具体如下。
□notationDecl():通知应用程序已经声明了一个标记。
□nparsedEntityDecl():通知应用程序已经发现了一个未经过语法分析的实体声明。
8.EntityResolver
EntityResolver接口仅定义一个事件resolveEntity(),它返回InputSource。因为SAX语法分析器已经可以解析大多数URL,所以应用程序很少实现EntityResolver。例外情况是对于目录文件它将公共标识解析成系统标识。如果在应用程序中需要目录文件,请下载NormanWalsh的目录软件包。
9.ErrorHandler
ErrorHandler接口定义错误事件。处理这些事件的应用程序可以提供定制错误处理。安装了定制错误处理器后,语法分析器不再抛出异常。抛出异常是事件处理器的责任。接口定义了与错误的三个级别或严重性对应的三个方法。
□warning():警示不是由XML规范定义的错误。例如,当没有XML声明时,某些语法分析器发出警告,它不是错误,但是它可能值得注意。
□error():警示由XML规范定义的错误。
□fatalError():警示由XML规范定义的致命错误。
10.SAXException
SAX定义的大多数方法都可以抛出SAXException。当对XML文档进行语法分析时,SAXException会抛出一个错误,这里的错误可以是语法分析错误也可以是事件处理器中的错误。要报告来自事件处理器的其他异常,可以将异常封装在SAXException中。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。