sax

Package org.xml.sax 介绍
Interfaces 接口
Attributes 定义了一个属性列表接口,供访问元素的属性列表而用。
ContentHandler 处理解析文档内容时产生的事件。
DTDHandler 处理解析DTD时的相应事件。
EntityResolver 处理外部实体。
ErrorHandler 处理解析过程中所遇到的文档错误事件。
Locator 为了定位解析中产生的内容事件在文档中的位置而准备的一个定位器接口。
XMLFilter 提供了一个方便应用开发的过滤器接口。
XMLReader 任何兼容SAX2的解析器都要实现这个接口,这个接口让应用程序可以设置或查找features和properties,注册各种事件处理器,以及开始解析文档。
Classes
InputSource 为XML实体准备的输入源。
Exceptions
SAXException 包装了一般的SAX错误和警告。  
SAXNotRecognizedException 为识别不出某些标识而抛出的异常。  
SAXNotSupportedException 为不支持某个操作而抛出的异常。
SAXParseException 包装了一个关于XML解析的错误或者警告。


Package org.xml.sax.helpers 帮助类所在的包
Classes 类
AttributesImpl 对Attributes接口的缺省实现
NamespaceSupport 提供名称空间支持。
DefaultHandler 缺省实现了四个处理器接口,方便用户开发,在开发过程中会经常用到。
LocatorImpl 提供了一个对Locator接口的实现
XMLFilterImpl 对过滤器接口的实现,使用过滤器进行应用程序开发时,继承这个类很方便。
XMLReaderFactory 为方便创建不同的XMLReader而提供。也会经常用到。


理解并使用SAX
SAX 的设计实现与DOM是完全不同的!DOM处理XML文档是基于将XML文档解析成树状模型,放入内存进行处理。而SAX则是采用基于事件驱动的处理模式,它将XML文档转化成一系列的事件,由单独的事件处理器来决定如何处理。为了了解如何使用SAX API处理XML文档,这里先介绍一下SAX所使用的基于事件驱动的处理模式。

这种基于事件的处理模式是一种通用的程序设计模式,被广泛应用于GUI设计。在JAVA的AWT,SWING以及JAVA BEANS中就有它的身影。而SAX的基于事件驱动的处理模式就与上面三者中的非常相像。

基于事件的处理模式主要是围绕着事件源以及事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象被称为事件源,而可以针对事件产生响应的对象就被叫做事件处理器。事件源和事件处理器是通过在事件源中的事件处理器注册方法连接的。这样当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就获得了处理。当然在事件源调用事件处理器中特定方法的时候,会传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据事件信息来决定自己的行为。

在 SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parse()方法来开始解析XML文档并根据文档内容产生事件。而事件处理器则是org.xml.sax包中的ContentHandler,DTDHandler,ErrorHandler,以及 EntityResolver这四个接口。它们分别处理事件源在解析过程中产生的不同种类的事件(其中DTDHandler是为解析文档DTD时而用)。而事件源XMLReader和这四个事件处理器的连接是通过在XMLReader中的相应的事件处理器注册方法set***()来完成的。详细介绍请见下表: 处理器名称 所处理事件 注册方法
org.xml.sax.ContentHandler 跟文档内容有关的所有事件:
文档的开始和结束
XML元素的开始和结束
可忽略的实体
名称空间前缀映射开始和结束
处理指令
字符数据和可忽略的空格
XMLReader中的setContentHandler(ContentHandler handler)方法
org.xml.sax.ErrorHandler 处理XML文档解析时产生的错误。如果一个应用程序没有注册一个错误处理器类,会发生不可预料的解析器行为。 setErrorHandler(ErrorHandler handler)
org.xml.sax.DTDHandler 处理对文档DTD进行解析时产生的相应事件 setDTDHandler(DTDHandler handler)
org.xml.sax.EntityResolver 处理外部实体 setEntityResolver(EntityResolver resolver)


在这四个处理器接口中,对我们最重要的是ContentHandler接口。下面让我们看一下对其中方法的说明: 方法名称 方法说明
public void setDocumentLocator(Locator locator) 设置一个可以定位文档内容事件发生位置的定位器对象
public void startDocument() throws SAXException 用于处理文档解析开始事件
public void endDocument() throws SAXException 用于处理文档解析结束事件
public void startPrefixMapping(java.lang.String prefix, java.lang.String uri) throws SAXException 用于处理前缀映射开始事件,从参数中可以得到前缀名称以及所指向的uri
public void endPrefixMapping(java.lang.String prefix) throws SAXException 用于处理前缀映射结束事件,从参数中可以得到前缀名称
public void startElement(java.lang.String namespaceURI,java.lang.String localName,java.lang.String qName,Attributes atts) throws SAXException 处理元素开始事件,从参数中可以获得元素所在名称空间的uri,元素名称,属性列表等信息
public void endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName) throws SAXException 处理元素结束事件,从参数中可以获得元素所在名称空间的uri,元素名称等信息
public void characters(char[] ch, int start, int length) throws SAXException 处理元素的字符内容,从参数中可以获得内容
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException 处理元素的可忽略空格
public void processingInstruction(java.lang.String target, java.lang.String data) throws SAXException 处理解析中产生的处理指令事件


这里再介绍一下org.xml.sax.XMLReader中的方法,然后让我们看一个具体的例子。XMLReader是所有兼容SAX2的解析器都要实现的接口,由它的方法开始解析文档,并且调用它的注册方法来注册各种事件处理器。请看下表: 方法名称 方法介绍
public Boolean getFeature(java.lang.String name)throws SAXNotRecognizedException,SAXNotSupportedException 得到某个feature的值
public void setFeature(java.lang.String name,boolean value) throws SAXNotRecognizedException,SAXNotSupportedException 设置某个feature的值,例如,如果需要解析器支持对文档进行验证那么就这么调用本方法。myReader.setFeature(http://xml.org/sax/features/validation,true);其中myReader是XMLReader的实例。
public java.lang.Object getProperty(java.lang.String name)throws SAXNotRecognizedException,SAXNotSupportedException 返回一个property的值
public void setProperty(java.lang.String name,java.lang.Object value)throws SAXNotRecognizedException,SAXNotSupportedException 设置一个property的值
public void setEntityResolver(EntityResolver resolver) 注册处理外部实体的EntityResolver
public EntityResolver getEntityResolver() 得到系统中注册的EntityResolver
public void setDTDHandler(DTDHandler handler) 注册处理DTD解析事件的DTDHandler
public DTDHandler getDTDHandler() 得到系统中注册的DTDHandler
public void setContentHandler(ContentHandler handler) 注册处理XML文档内容解析事件的ContentHandler
public ContentHandler getContentHandler() 得到系统中注册的ContentHandler
public void setErrorHandler(ErrorHandler handler) 注册处理文档解析错误事件的ErrorHandler
public ErrorHandler getErrorHandler() 得到系统中注册的ErrorHandler
public void parse(InputSource input)throws java.io.IOException,SAXException 开始解析一个XML文档。

public void parse(java.lang.String systemId)throws java.io.IOException,SAXException 开始解析一个使用系统标识符标识的XML文档。这个方法只是上面方法的一个快捷方式它等同于:parse(new InputSource(systemId));





        // 初始化reader
        XMLReader reader = XMLReaderFactory.createXMLReader
                         ("org.apache.xerces.parsers.SAXParser") ;

        // 创建DefaultHandler的实例
        DefaultHandler defaultHandler=new MyDefaultHandler();

        //在reader中将defaultHandler注册为ContentHandler
        reader.setContentHandler(defaultHandler);

        //在reader中将defaultHandler注册为ErrorHandler
        reader.setErrorHandler(defaultHandler);

        // 开始解析文档
        reader.parse(args[0]);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值