第7章 基于SAX解析器_第1页
第7章 基于SAX解析器_第2页
第7章 基于SAX解析器_第3页
第7章 基于SAX解析器_第4页
第7章 基于SAX解析器_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第7章章 基于基于SAX的解析器的解析器 SAX解析器 SAX(Simple API for XML)即简易应用程序编写接口。 SAX解析器的核心:事件处理机制。 使用SAX解析器来获取XML文件的信息。DOM解析器和SAX解析器不同 DOM解析器 核心在内存中建立和XML对应的树状结构数据 SAX解析器 核心事件处理机制 SAX解析器在解析XML的过程中,根据从文件中解析出的数据产生相应的事件,并报告这个事件给事件处理器,事件处理器处理相应数据。本章主要内容 SAX解析器及工作原理 SAX常用的接口及事件处理类 SAX对XML文档数据获取及基本操作 包括:文件的开始与结束 XML的处理指令

2、 开始标记与结束标记 文本数据 处理空白 名称空间 实体 文件定位器 处理错误 SAX解析器工作原理 在应用程序中创建一个对象来对应相应的XML文档。也创建一个文档处理器以告知解析器使用哪个文档处理器,告知解析器开始处理特定的输入文档(通过调用解析器的parser()方法)。解析器的作用是把它在文档中找到的所有感兴趣的内容通报给文档处理器,例如元素的起始和结束标签。文档处理器的作用是处理这些通报以获取应用程序需要的所有内容。 SAX解析器构成的框架使用SAX解析器的步骤1 使用Java.xml.parsers包中的SAXParserFactory类调用其类方法newInstance( )实例化

3、一个SAXParserFactor对象: SAXParserFactory factory= SAXParserFactory. newInstance( );2 Factory对象调用newSAXParser( )方法返回一个SAXParser对象(称作SAX解析器): SAXParser saxParser=factory. newSAXParser( ); 如果想要如果想要SAXParserFactory产生的产生的SAX解析器支持解析器支持名称空间,可以让名称空间,可以让factory对象调用对象调用setNamespaceAware(boolean b) 方法:方法:factory.

4、setNamespaceAware(true);事件处理器3 创建解析器后,SAX解析器调用以下parse( )方法解析XML文件Public void parse(File f,DefaultHandler dh) throws SAXExceptions,IOExeceptionPublic void parse(InputStream is ,DefaultHandler dh) throws SAXExceptions,IOExeceptionPublic void parse(String uri,DefaultHandler dh) throws SAXExceptions,IOE

5、xeceptionPublic void parse(String uri) throws SAXExceptions,IOExeception异常列表解析器的事件处理器,DefaultHandler类是org.xml.sax.helpers包中的类,该类或其子类的对象被称作解析器的事件处理器。它实现了ContenHander,DTDHander,EntiyResolver,ErrorHander。事件处理器 4 事件处理器根据相应事件调用相应的方法。例如 :当解析器发现一个标记的开始标记时,将所发现的数据封装为一个“标记开始事件”,并报告该事件给事件处理器,事件处理器应会知道所发生的事件,然

6、后调用:startElement(String uri,String locaName ,String qName,Attributes atts)标记名称空间标记的名称带名称空间前缀的标记名称标记的全部属性SAX处理文件的开始与结束 当解析器开始解析XML文档过程中,若解析到该文档的开始,应会向事件处理器发送一个“文件开始”事件,事件处理器接受该事件,并调用相应startDocument( )方法处理该事件。之后,其它事件才会开始触发,如“开始标记”、“文本事件”等。在文件的结尾,又向事件处理器发送一个“文件结束”事件,事件处理器就会调用endDocument( )方法来处理。SAX处理XM

7、L中的处理指令 在XML文件中,XML的处理指令不属于标记,当解析器开始解析XML文件时,发现处理指令就会报告一个“处理指令”事件给事件处理器,事件处理器得到发送的信息后,调用 public void processingInstruction(String target,String data)throw SAXException 指令的名称处理指令所包含的内容注意:解析器不报告XML声明给事件处理器 当解析器发现一个开始标记时,向事件处理器发送一个“开始标记事件”报告,事件处理器获得发送的事件报告信息后,调用Public void startElement(String uri,Strin

8、g locaName,String qName,Arttributes attributes) throws SAXException 解析器报告完一个“开始标记事件”后,一定会报告“结束标记事件”,事件处理器调用Public void endElement(String uri,String locaName,String) throws SAXException SAX处理开始标记与结束标记SAX处理文本数据 处理XML文档的目的是获取里面的数据,和程序进行交互。当解析器解析到这些文本数据的时候,向事件处理器报告“文本事件”,事件处理器获得该事件报告后,调用Public void char

9、acters(char ch,int start ,int length) throws SAXException存放解析出的文本数据字符数组中的开始位置字符数组的长度SAX处理空白 标记之间的缩进区域是为了使得XML文件看起来更而形成的,但解析在解析器解析XML文档标记之间的数据时,若标记之间的数据存在缩进,解析器会把该缩进也作为数据来处理。例如对于“春天来了,出去玩”来说,解析器将标记“a”中的文本数据用一个“文本数据”事件报告给事件处理器,报告的文本内容是“春天来了,出去玩”。但是如果该标记是这样写:春天来了,出去玩SAX处理空白 这时,解析器会将标记“b”中的文本数据分为4个“文本数据

10、”事件报告给事件处理器。 第一次是“”和“春天来了”之间的空白字符, 第二次是“春天来了”和后继的空白字符, 第三次是“出去玩”, 第四次是“”前的空白字符, 显然我们不希望事件处理器去处理这些标记之间的由缩进而形成的空白字符,这样会延长整个程序执行的时间。SAX处理空白如果不想让事件处理器处理这些空白字符,那么XML文档必须是有效的,而且所关联的DTD文件必须规定XML文件的标记不能有混合的内容。一旦这样做,当解析器报告的“文本数据”事件属于标记之间的缩进区域形成的空白类字符时,事件处理器就会调用 public void ignorabldWhitespace(charch,int star

11、t, int length) throws SAXException 方法,而不去调用character方法。该方法里面的参数与上面提到的charactes()参数含义一样。若准备处理这些空白,就需要重写ignorableWhitespace方法。SAX处理名称空间 XML中的名称空间,主要为了有效地区分名字相同的标记,当使用两个标记的名字相同时,它们可以通过隶属不同的名称空间来相互区分。命名空间通过声明名称空间来建立,分为有前缀的名称空间和无前缀的名称空间。 例如:xmls:xiaohei=“http:/”xmls=“http:/”SAX处理名称空间 名称空间的声明是当解析器在一个标记的开始

12、标记中发现一个名称空间声明时,就先报告一个“名称空间开始”事件给事件处理器,然后再报告“开始标记事件”。 当事件处理器获得“名称空间开始”的事件时,调用 public void startPrefixMapping(String prefix,string uri)throws SAXException 方法对数据做出处理。 参数prefix表示正在声明的名称空间前缀,若该命名空间没有前缀,其值不包含任何字符串,即prefix=“”; uri表示名称空间的名称。命名空间涉及到作用域,一个标记如果使用名称空间,那么该标记及其子标记都是名称空间的作用域。SAX处理名称空间 当解析器解析完该标记后,

13、就会向事件处理器报告一个“名称空间结束”事件,表明名称空间的作用域结束了,事件处理器就会知道所发生的事件,调用public void endPrefixMapping(string prefiX)throws SAXException 对发现的数据做出处理。 SAX处理名称空间 为了能让解析器报告“名称空间”事件,SAXParserFactory 调用setNamespace Aware(boolean b)方法,factory.setNamespaceAwre(true); SAX处理实体在DTD文件中可以定义的实体,在XML文件中也可以通过实体引用使用该实体。实体可分为:内部实体与外部实体

14、。SAX解析器解析该XML文件的时候,会把XML文件中引用的实体替换为相应的内容。SAX解析器处理过程中遇到一个实体时,解析器就会向事件处理器报告一个“实体事件”,这时事件处理器就会调用 Public Inputsource resolveEntity(String publicld,String systemId) shrows IOException,SAXEXception 方法来处理获得的数据。 在该方法中有两个参数: publicld表示公共标识符,如果没有可用的,则为null; systemId表示在XML文档中提供的系统标识符。在这个事件报告中,会把与参数相关的数据传给事件处理器

15、。在“实体事件”执行完后,才会执行“文本数据事件”。SAX处理实体 需要注意的是在一个在XML文件中,先执行“文件开始”事件,才会把“实体”事件报告DOCTYPE声明。 如果在一个XML文件中引用的实体在DTD中没有定义,那么解析器将不会解析该实体引用,并向事件处理器报告一个“忽略实体事件”,事件处理器就会调用 public void skippedEntity(string name) throws SAXException 处理忽略的实体,该参数表示忽略实体的名字。文件定位器 文件定位器是用来确定文件位置的对象(Locator)。 SAX解析器解析XML文件时,先向事件处理器报告“文件定位

16、器”事件,然后再报告“文件开始事件” 当接到“文件定位器”事件报告后,调用:public void setDocumenLocator(Locator locator)其中,参数locator为解析器报告定位器的对象,获得该对象后,调用 int getPublicId() 获得当前文档事件公共标识符 int getSystemId() 获得当前文档事件系统标识符 int getLineNumber() 获得当前文档事件开始处的行号 int getColumnNumber() 获得当前文档事件结束处的列号处理错误 SAX解析器在处理XML文档的时候,会根据不同的事件,发送不同的事件报告给事件处理

17、器。若在XML文档中发现了一个错误,同样也会将该“错误事件”信息发送给事件处理器,也就是说,SAX在解析文件的过程中,本身还具有检查XML是否规范的功能。若要 SAX解析器具备这个功能,必须设置factory.setValidating(true) 来指定由此代码生成的解析器将验证被解新的文档。 处理错误 当事件处理器获得解析器提交的“错误事件”报告信息后,会根据提交的“错误报告信息”判断错误的类型,有警告错误类型、一般错误类型、致命错误。然后根据相应的类型调用不同的错误处理方法,事件处理器有三种不同的错误处理方法:分别为 public void warning(SAXParseExcepti

18、on e )throws SAXException 该方法主要处理相应的警告信息,警告不属于规范性错误,处理器调用该方法时,一般不必抛出SAXException异常,因为这些警告不会影响解析器继续解析文件;处理错误 public void error(SAXParseException e )throws SAXException 该方法主要处理一般错误,此类错误是非致命的,若某个XML文件没有遵守DTD文件所规定的约束,这时就会报告一般错误的报告。事件处理器在调用error方法时,一般不必抛出SAXException异常,因为这些错误不会影响文件的继续解析; 处理错误 public void fataler(SAXParseException e )throws SAXException 该方法主要处理致命错误,当解析器解析到一个错误,如果它认为这些错误会影响文件的解析,继续解析只会浪费时间,那么这时就会发送“致命性错误”事件报告,此时会抛出SAXException异常,终止当前的文件的解析

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论