《SAX解析XML文档》PPT课件.ppt_第1页
《SAX解析XML文档》PPT课件.ppt_第2页
《SAX解析XML文档》PPT课件.ppt_第3页
《SAX解析XML文档》PPT课件.ppt_第4页
《SAX解析XML文档》PPT课件.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

SAX解析XML文档,学习目标掌握SAX的概念和特点理解SAX的工作机制了解SAX的常用接口熟练掌握SAX解析XML文档的步骤熟练掌握解析器和事件处理器的创建和使用掌握SAX和DOM共同构建XML文档,基于DOM的解析器的核心是在内存中建立和XML文档相对应的树状结构。XML文件的标记、标记中的文本数据和实体等都是内存中的树状结构的某个节点相对应。优点:可以方便地操作内存中的树状节点缺点:如果XML文件较大,或者只需要解析XML文档的一部分数据,就会占用大量的内存空间,SAX简介,SAX没有官方的标准机构,它不属于任何标准组织或团体,也不属于任何公司或个人,而是供任何人使用的一种计算机技术。SAX是XML事实上的标准,所有的XML解析器都支持它,已经被Java,C#等语言编写实现SAX是一种基于事件的API,SAX概述,SAX是SimpleAPIforXML,简易应用程序编写接口。解析的核心是事件处理机制,具有占用内存少,效率高等特点。SAX是一种高效的解析器,在对那些要处理大量数据的应用程序,这种特性尤为重要。它允许在读取文档时处理它,而不必等到整个文档都被存储之后才采用该操作。,SAX的工作机制【重点掌握】,SAX在概念上与DOM完全不同。它采用事件机制的方式来解析XML文档。使用SAX解析器对XML文档进行解析时,会触发一系列事件,这些事件将被相应的事件监听器监听,从而触发相应的事件处理方法,应用程序通过这些事件处理方法实现对XML文档的访问。,Java事件处理图,事件,事件源,事件监听器,外部动作,1.将事件监听器注册到事件源,2触发事件源上事件,3.生成事件对象,4.触发事件监听器事件被作为参数传入事件处理器,SAX解析器根本不创建任何对象,它只是在遇到XML文档的各种标签时触发对应的事件,并将XML元素的内容封装成事件传出去。而程序员则负责提供事件监听器来监听这些事件,并通过事件获取XML文档信息。,SAX解析器在解析开始的时候就开始发送事件,当解析器开始处理文档开始,元素开始和文本时,负责在文档中触发一个事件,而程序员则实现这些事件监听器,这些监听器负责处理这些事件事件中包含了XML元素的内容。,可以这样理解SAX的解析过程:SAX解析器就像一个电子探测器,它在XML文档中一路走过来,每经过一个元素开始、元素结束、处理指令开始、处理指令结束.都将向外发送一个事件,给元素的内容就包含在该事件中,而程序则负责接收该事件,并将其内容解析出来。,SAX监听器【重点掌握】,SAX解析事件一共有4种,因此需要分别设置4种监听器。ContentHandler:监听XML文档内容处理事件的监听器DTDHander:监听DTD处理事件的监听器EntityResolver:监听实体处理事件的监听器ErrorHandler:监听解析错误的监听器,在ContentHandler接口中定义了如下方法:voidcharacters(charch,intstart,intlength):SAX解析器处理字符数据时触发该方法voidendDocument():SAX解析器处理文档结束时触发该方法voidendElement(Stringuri,StringlocalName,StringqName):SAX解析器处理元素结束时触发该方法voidendPrefixMapping(Stringprefix):SAX解析器处理元素里命名空间属性(即xmlns:prefix属性)结束时触发该方法,voidignorableWhitesapce(charch,intstart,intlength):SAX解析器处理元素内容中可忽略的空白时触发该方法voidskippedEntity(Stringname):SAX解析器跳过实体时触发该方法voidstartDocument():SAX解析器开始处理文档时触发该方法voidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts):SAX解析器开始处理元素时触发该方法voidstartPrefixMapping(Stringprefix,Stringuri):SAX解析器开始处理元素里命名空间属性(即xmlns:prefix属性)时触发该方法,SAX解析XML文档,黄胜霞前台接待,发现XML文件,触发文件开始事件,监听器调用startDocument()方法处理发现“员工名单”的开始标记,触发开始标记事件,监听器调用startElement()方法处理发现和之间的空白符号,触发文本事件,监听器调用characters方法处理,发现“员工”的开始标记,触发开始标记事件,监听器调用startElement()方法处理发现和之间的空白符号,触发文本事件,监听器调用characters方法处理发现“姓名”的开始标记,触发开始标记事件,监听器调用startElement()方法处理发现标记的文本内容,触发文本事件,监听器调用characters方法处理发现“姓名”标记的结束标记,触发结束标记事件,监听器调用endElement()方法处理17发现XML文件结束,触发文件结束事件,调用endDocument()方法,SAX解析器【重点掌握】,JAVA为SAX解析器提供了如下2组API:XMLReader和XMLReaderFactoryXMLReaderFactory工厂类createXMLReader()静态方法用于创建XMLReader。这两个类位于org.xml.sax包下。SAXParser和SAXParserFactorySAXParserFactory工厂类的newSAXParser()实例方法用于创建SAXParser。这两个类位于javax.xml.parsers包下。,XMLReader定义了以下两种用于解析XML文档的方法:voidparse(InputSourceinput):解析InputSource输入源中的XML文档voidparse(StringsystemId):解析系统URI所代表的XML文档,SAXParser定义了以下几种用于解析XML文档的方法:voidparse(Filef,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析f文件所代表的XML文档voidparse(InputSourceis,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析is输入源的XML文档voidparse(InputStreamis,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析is输入流的XML文档voidparse(Stringuri,DefaultHandlerdh):使用指定的dh作为监听器监听SAX解析事件,解析系统URI所代表的XML文档,提问:为何XMLReader在调用时不需要传入SAX解析时间的监听器呢?SAX解析不是总是基于事件机制的吗?,回答:的确是这样。因此使用XMLReader解析XML文档时一样需要制定监听器来监听事件。只不过XMLReader不通过parse()方法临时指定监听器。通过自己本身的setContentHandler(ContentHandlerhandler),setDTDHandler(DTDHandlerhandler),setEntityResolverHandler(EntityResolverresolver),setErrorHandler(ErrorHandlehandler),4个方法来设置监听器。也就是说,在调用XMLReader的parse()方法来解析XML文档之前,应先调用上面4个方法设置监听SAX解析事件的监听器。,如果使用XMLReader去解析XML文档,程序员需要分别为上面四个监听器提供实现类,然后调用XMLReader的setXXXHandler()方法来注册监听器,这是一件麻烦的事情。幸好JAVA提供了一个DefaultHandler类来解决这个问题,这个类实现了四个监听器接口,并为这些接口中所包含的方法提供了空实现。它通常用于被继承,我们只需要重写我们所关心的监听方法,而无须为每个方法都提供实现。,SAX应用,利用SAX解析XML文档,涉及两个部分:解析器和事件监听器。解析器负责读取XML文档中“行走”,每当遇到文档开始、元素开始、文本、元素结束和文档结束时,都将负责向外发送事件。程序员则负责提供事件监听器来监听这些事情,并通过事件获取XML文档信息。,SAX解析器的创建及调用【重点掌握】,使用javax.xml.parsers包中SAXParserFactory类调用方法newInstance实例化一个解析器工厂对象.代码如下:Factory对象调用newSAXParser()方法,创建一个SAXParser对象,也可以称为SAX解析器解析器创建完成后,就调用parse()方法解析XML文件.,SAXParserFactoryfactory=SAXParserFactory.newInstance();,SAXParsersaxParser=factory.newSAXParser();,Publicvoidparse(Filef,DefaultHandlerdh)throwsSAXEception,IOException,处理文件开始和结束,当SAX解析器解析XML文档时,解析到不同的标记时会触发不同的事件。当解析到文档开始和文档结束时,就会分别出发startDocument()和endDocument()方法。如果要实现处理“文件开始”和“文件结束”事件,需要在程序的类中重写这两个继承的方法。,classMyHandlerextendsDefaultHandlerFilefile;longstarttime,endtime;publicMyHandler(Filef)file=f;publicvoidstartDocument()starttime=System.currentTimeMillis();System.out.println(文件所在的路径是+file.getAbsolutePath();System.out.println(文件名为+file.getName();System.out.println(开始解析XML文件-);publicvoidendDocument()System.out.println(解析XML文件结束-);endtime=System.currentTimeMillis();System.out.println(文件解析共花费+(endtime-starttime)+秒);,监听器编程部分:继承DefaultHandler监听器,并重写其部分方法,构造函数,程序员自己开发的监听器为MyHandler,它必须继承JAXP提供的DefaultHandler监听器接口,并重写其部分方法,重写文档开始方法的内容。当文档开始事件触发的时候,就调用这个方法对其进行处理,重写文档结束方法的内容。当文档结束事件触发的时候,就调用这个方法对其进行处理,SAX解析器部分,处理开始和结束标记【重点掌握】,解析器在解析XML文档时,如果发现开始标记和结束标记就会触发相应的事件。,publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)throwsSAXException,uri参数表示命名空间URI,如果元素没有任何命名空间URI,或者没有正在执行的命名空间处理,则为空字符串。localName参数表示本地名称(不带前缀),如果没有正在执行的命名空间处理,则为空字符串qName参数表示限定的名称(带前缀)或标记名称(如果没有命名空间前缀),如果限定的名称不可用,则为空字符串attributes参数表示这个参数可以获得相应的标记的属性名称和属性的值,classMyHandlerextendsDefaultHandlerintcount=0;Stringstr=null;publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)count+;if(uri.length()0)str=uri;System.out.println(str);System.out.print();publicvoidendElement(Stringuri,StringlocalName,StringqName)System.out.println();publicvoidendDocument()System.out.println(解析文件结束一共有+count+标记);System.out.println(文件使用的命名空间是+str);,处理文本数据,XML文件中标记的内容是文本数据,当SAX解析器解析这些数据时,会报告“文本数据”事件给事件处理器,事件处理器在获取事件信息后,就会调用下面的方法,对解析的数据做出处理。,publicvoidcharacters(charch,intstart,intlength)throwsSAXEception,ch参数中存放SAX解析器解析的文本数据Start是数组ch中存放字符的起始位置Length是存放的字符个数,处理空白,在XML文件中,标记之间的缩进区域都是为了使XML文件看起来更加美观.但是解析器却把它们作为文本数据来处理.在处理文本事件时,会调用characters()方法来处理.会一并处理文本之间的空白字符,这样会延长整个程序的执行时间.这个时候,可以重写下面的方法,publicvoidignorableWhitespace(charch,intstart,intlength)throwsSAXEception,处理命名空间,命名空间的声明在一个标记的开始标记中,当解析器在一个标记的开始标记发现一个命名空间声明时,就会报告一个“命名空间开始”事件给事件处理器.解析器报告的事件顺序是:“命名空间开始”、“开始标记”、“文本数据”、“文本数据”、“结束标记”和“命名空间结束”事件。,publicvoidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXEception,使用DTD验证XML的有效性,如果使用SAXParser和SAXParserFactory这组API进行解析,则直接调用SAXParserFactory实例的setValidating(true)方法即可。代码如下:,/启用DTD校验XML文档的有效性factory.setValidating(true);,SAX和命名空间,使用SAX解析方式时,命名空间的信息一样通过ContentHandler监听器获得,该监听器里包含的startElement,endElement,StartPerfixMapping和endPrefixMapping4个方法用于获取命名空间相关信息。希望SAX解析器能够获取XML文档的命名空间,需要两部:启用SAX解析器的命名空间支持通过以上四个方法获取,当XML文档中某个元素具有xmlns:prefix属性时,StartPerfixMapping和endPrefixMapping两个方法会被监听器所出发,StartPerfixMapping方法会在处理元素方法之前(startElement方法被触发)之前被触发。而endPrefixMapping方法将在处理元素结束之后(endElement方法被触发之后)被触发。,使用XMLSchema验证XML文档,不管是使用DOM方式还是SAX方式来解析XML文档,可以通过XMLSchema来验证XML文档的有效性。如果使用DOM方式解析XML文档,可以通过DocumentBuilderFactory对象的setSchema(Schemaschema)方法启用XMLSchema验证XML的有效性。如果使用SAX方式解析XML文档,可以通过SAXParserFactory对象的setSchema(Schemaschema)方法启用XMLSchema验证XML的有效性,Schema对象,Schema对象就代表一份XMLSchema文档。通常采用工厂类SchemaFactory来获取Schema对象。newInstance(StringschemaLanguage)方法获取SchemaFactory对象。,使用XMLSchema验证XML文档,创建SchemaFactory对象SchemaFactoryschemaFactory=SchemaFactory.newInstance(StringschemaLanguage);通过SchemaFactory对象创建Schema对象Schemaschema=schemaFactory.newSchema(Fileschema);如果传入的Schema文档本身是无效的,那么该方法会抛出SAXParseException.创建DOM或SAX解析器的工厂类对象启动解析器其工厂类对象的对命名空间的支持解析器利用已有的shema验证xml文档,基于DOM和SAX解析机制都需要启动解析器工厂的命名空间的支持,这是必须的DOM解析和SAX解析Schema有效性相同的是,为了保证程序能自己处理验证过程中发生的验证错误,同样需要指定ErrorHandler监听器,使用XMLSchema验证XML文

温馨提示

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

评论

0/150

提交评论