《XML基础及实践开发教程》第十章.ppt
,XML,第十章 SAX,基础及实践开发教程,本章学习目标,了解:SAX的基础知识熟练掌握:SAX的工作机制理解:SAX接口和类熟练掌握:SAX常用接口和类的使用,SAX概述,SAX-Simple API for XML,既是指一种接口,也是指一个软件包。基于事件来解析XML方案的典型代表SAX开始于1997年12月,由一些在互联网上分散的程序员合作进行。后来,参与开发的程序员越来越多,组成了互联网上的XML-DEV社区。1998年5月,SAX1.0由XML-DEV正式发布。目前最新的版本是2.0,但是两者多处不兼容。Java SE中的JAXP提供了对SAX2的支持,SAX工作原理,SAX的工作原理简单的说就是对文档进行顺序扫描,当扫描档文档的开始与结束、元素的开始与结束等处都会通知事件处理函数、由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。,SAX的处理机制,张三19,文档开始 元素开始 字符数据(空白)元素开始()字符数据(张三)元素结束()字符数据(空白)元素开始()字符数据(18)元素结束()字符数据(空白)元素结束文档结束,SAX的优缺点,SAX的优点:解析速度快内存消耗少ContentHandler对象可以并行SAX的缺点:必须实现时间处理程序不能随机访问不能修改文档,SAX实现产生的事件类型,以下为大多数SAX实现都会产生的事件:1.文档的开始和结束时出发文档处理事件2.在文档内每一XML元素接受解析的前后触发元素事件3.任何元数据通常由单独的事件交付4.在处理文档的DTD或Schema时产生DTD或Schema事件5.产生错误事件用来通知主机应用程序解析错误。,SAX接口,JDK的SAX API分布在org.xml.sax包、org.xml.sax.ext包、org.xml.sax.helpers包重要的接口和类:XMLReader:代表了SAX2解析器,它是一个所有的SAX2解析器都必须实现的接口允许应用程序设置和查询解析器的特性和解析属性注册事件处理器启动文档解析ContentHandler:负责向应用程序反馈与文档相关的基本的解析事件DTDHandlerErrorHandler,ContentHandler,ContentHandler是Java包中一个特殊的SAX接口,位于包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素的开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。,ContentHandler,ContentHandler接口中的方法:void startDocument()void endDocument()void startElement(String uri,String localName,String qName,Attributes atts)void endElement(String uri,String localName,String qName)void characters(char ch,int start,int length),DTDHandler,DTDHandler用于接收基本的DTD相关事件的通知。该接口位于包中。此接口仅包含DTD事件的注释和未解析的实体声明部分。SAX解析器可以按任意顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序。但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement事件之前报告所有的DTD事件,DTDHandler,DTDHandler接口包括以下两个方法:接收注释声明事件的通知public void notationDecl(String name,String publicId,String systemId)throws SAXException 接收未解析的实体声明事件的通知public void unparsedEntityDecl(String name,String publicId,String systemId,String notationName)throws SAXException,EntityResolver,EntityResolver接口用于解析实体的基本接口,该接口位于包中。该接口只有一个方法:允许应用程序解析外部实体。并返回一个InputSource类的对象或者null,用于读取实体信息。public InputSource resolveEntity(String publicId,String systemId)throws SAXException,IOException,ErrorHandler,ErrorHandler接口是SAX错误程序的基本接口。如果SAX应用程序需要实现自定义的错误处理,则必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。接口的方法如下:接收可恢复的错误通知void error(SAXParseException exception)接收不可恢复的错误通知void fatalError(SAXParseException exception)接收警告的通知void warning(SAXParseException exception),SAX的其他类和接口,XMLReaderFactoryXMLReaderFactory是一个final类,创建XML解析器的工厂类。该类包含两个静态方法:static XMLReader createXMLReader()根据默认设置创建一个XMLReader的对象static XMLReader createXMLReader(String className)根据指定的解析器类名创建一个XMLReader的对象,XMLReader,XMLReader接口是使用回调读取XML文档的接口。XMLReader是XML解析器SAX2驱动程序必须实现的接口。此接口允许应用设置和查询解析器中的功能和属性。注册文档的事件处理程序,以及对文档的解析,XMLReader接口的部分方法,Attributes接口,Attributes接口是一个关于XML元素属性列表的接口。此接口允许用不同方式访问属性列表,如通过属性索引、通过名称空间限定的名称等。该接口位于org.xml.sax包中,它封装了元素属性信息的所有方法:,Attributes接口,int getIndex(String qName)方法:返回通过XML限定(前缀)名查找属性的索引值。int getLength()方法:返回此列表中的属性个数。String getLocalName(int index)方法:返回索引值为index的属性的本地名String getQName(int index)方法:返回索引值为index的属性的XML限定名,创建XML解析器,SAXParserFactory spFactory=SAXParserFactory.newInstance();SAXParser sParser=spFactory.newSAXParser();,DefaultHandler,DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、ContentHandler和ErrorHandler接口,案例:,解析XML文档张三18李四120,本章结束,