xml应用编程(sax)old

上传人:tian****1990 文档编号:73840634 上传时间:2019-01-26 格式:PPT 页数:40 大小:487.81KB
返回 下载 相关 举报
xml应用编程(sax)old_第1页
第1页 / 共40页
xml应用编程(sax)old_第2页
第2页 / 共40页
xml应用编程(sax)old_第3页
第3页 / 共40页
xml应用编程(sax)old_第4页
第4页 / 共40页
xml应用编程(sax)old_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《xml应用编程(sax)old》由会员分享,可在线阅读,更多相关《xml应用编程(sax)old(40页珍藏版)》请在金锄头文库上搜索。

1、XML技术基础,主讲:肖宏启,第七章 XML应用编程,回顾,包org.w3c.dom中所定义的DOM常用接口主要有: Node接口 NodeList接口 Document接口 Element接口 Attr接口 NamedNodeMap接口 Text接口,回顾,DOM编程通常包括以下几个步骤: 创建一个解析器对象; 将您的 XML 文档传递给解析器,进行解析,产生DOM节点树对象; 处理DOM节点树; 保存DOM节点树。,本章目标,SAX接口概述 SAX接口 委托事件模型 第一个SAX应用程序 一些常用的方法与参数 SAX应用编程 作业,SAX接口概述,SAX简易应用程序编写接口Simple A

2、PI for XML。它并不是由W3C官方所提出的标准,而是“民间”的事实标准,是一种社区性质的讨论产物。几乎所有的XML解析器都会支持它。 与DOM比较,SAX是一种轻量型的处理XML文档的方法。,SAX接口概述,SAX具有如下主要优点: 可以解析任意大小的文件 适合创建自己的数据结构 适合小信息子集 简单 快速,SAX接口概述,SAX也存在以下不足之处 不能对文档做随机存取 难以实现复杂的查询 不能使用文档类型定义(DTD) 不可获取词法信息 SAX是只读的 当前的浏览器不支持SAX,SAX工作原理,SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读写XML数据的方式。 当使用

3、SAX分析器对XML文档进行分析时,会触发一系列事件,并激活响应的事件处理函数,从而完成对XML文档的访问,所以SAX接口也称作事件驱动接口。,SAX工作原理,委托事件模型,注册监听者:saxParser.parse(new File(“Sax_1.xml“),handler);,SAX 监听者接口,SAX API 实际上定义了几个监听者接口来处理事件: ContentHandler, DTDHandler, EntityResolver, ErrorHandler,Attributes,XMLReader 一个典型的SAX应用程序至少要提供一个ContentHandler接口。一个健壮的SA

4、X应用程序还应该提供ErrorHandler接口。 DefaultHandler适配器类实现了ContentHandler、 DTDHandler、 EntityResolver 、ErrorHandler接口中的所有方法。,DefaultHandler,ContentHandler,DTDHandler,EntityResolver,ErrorHandler,Attributes,XMLReader,监听者,继承,实现,适配器类,SAX接口,unparsedEntityDecl,resolveEntity,方法,监听者(事件处理器类)的设计,大多数情况下,您的 Java 代码将继承 Defa

5、ultHandler 适配器类。 例如: public class saxOne extends DefaultHandler ,返回目标,此类继承了适配器类,可以做监听者,SAX编程一般步骤,使用SAX编程一般包括以下3个步骤: 建立解析器对象; 为SAX解析器注册监听者,使用SAX解析器解析XML文档; 实现SAX事件处理器类。,建立解析器对象,SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); spf.setValidating(true); SAXParser parse

6、r = spf.newSAXParser();,为SAX解析器注册监听者,解析XML文档,要使用SAXParser解析文档,只需调用它的parse()方法。 在此必须指定parse()方法的两个实参:第一个指定了要解析的XML文档,第二个是指定处理事件的对象,这个对象的类型应为DefaultHandler适配器类。 代码如下: SAX7_5 handler = new SAX7_5(); parser.parse(xmlFile, handler);,第一个SAX应用程序,import javax.xml.parsers.*; /获取XML文档对象的包 import java.io.*; /J

7、AVA读取文件需加载的包 import org.xml.sax.helpers.*; /包含适配器类DefaultHandler import org.xml.sax.*; /SAX接口的核心 public class Sax_1 public static void main(String args) try SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParser saxParser=factory.newSAXParser(); MyHandler handler=new MyHandler(); saxPars

8、er.parse(new File(“Sax_1.xml“),handler); System.out.println(“该XML文件共有“+handler.count+“标记“); catch(Exception e) System.out.println(e); ,class MyHandler extends DefaultHandler int count=0; public void startDocument() System.out.println(“开始解析XML文件“); count+; public void endDocument() System.out.println

9、(“解析文件结束“); count+; public void startElement(String uri,String localName,String qName,Attributes atts) System.out.println(“); count+; public void endElement(String uri,String localName,String qName) System.out.println(“); count+; public void characters(char ch,int start,int length) String text=new S

10、tring(ch,start,length); System.out.println(text); count+; ,返回目标,DefaultHandler,ContentHandler,DTDHandler,EntityResolver,ErrorHandler,Attributes,XMLReader,监听者,继承,实现,适配器类,SAX接口,unparsedEntityDecl,resolveEntity,方法,一些常用的方法及参数,返回目标,ContentHandler 接口中的方法,一些常用的方法及参数,void startDocument(): 当遇到文档的开头的时候,调用这个方法

11、,可以在其中做一些预处理的工作。 void endDocument(): 和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。,Sax_2.java,一些常用的方法及参数,void startElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName, Attributes atts) 当读到一个开始标签的时候,会触发这个方法。 namespaceURI就是命名空间地址; localName是本地元素名,不带前缀;需设置factory.setNam

12、espaceAware(true); qName是带前缀的元素名; atts是这个元素所包含的属性列表,通过atts,可以得到所有的属性名和相应的值。 endElement的参数与startElement基本相同,没有属性列表。,Sax_4.java,一些常用的方法及参数,processingInstruction(String target, String data) 解析器不报告XML声明给事件处理器 target:目标程序名; data:处理指令内容;,Sax_3.java,一些常用的方法及参数,void characters(char ch, int start, int length

13、): 这个方法用来处理在XML文件中读到字符串,它的参数是一个字符数组,以及读到的这个字符串在这个数组中的起始位置和长度, 我们可以很容易的用String类的一个构造方法来获得这个字符串的String类: String charEncontered=new String(ch,start,length)。 ignorableWhitespace(char ch , int start, int length) 此事件类似于我们前面所讨论的无用 DOM 节点。它与 character 事件区别的好处是:如果您不需要空格符,您可以通过忽略这个事件来忽略所有的空格符。 XML文档是有效的; DTD规

14、定XML的标记不能有混合的内容;,Sax_5.java,Sax_6.java,startPrefixMapping(java.lang.String prefix, java.lang.String uri) 命名空间事件,发生在元素开始事件之前; endPrefixMapping(java.lang.String prefix, java.lang.String uri) 命名空间结束事件 需设定可以解析名称空间factory.setNamespaceAware(true);,一些常用的方法及参数,Sax_7.java,一些常用的方法及参数,setDocumentLocator(Locato

15、r locator)文件定位器,可以返回一个数据在文档中的位置。 解析器解析XML时,首先报告一个“文件定位器事件”,返回一个定位器对象;即此事件发生在文档开始事件之前; 定位器对象的方法: getColumnNumber() 返回事件结束处的列号 getLineNumber()返回事件结束处的行号 getPublicId() 返回当前文档事件的公共标识符 getSystemId()返回当前文档事件的系统标识符,Sax_2.java,Sax_9.java,一些常用的方法及参数,skippedEntity(java.lang.String name) 忽略实体事件 当XML文档中引用的实体在DT

16、D中没有定义,就会激发此事件。,一些常用的方法及参数,DTDHandler中的方法 unparsedEntityDecl(java.lang.String name, java.lang.String publicId, java.lang.String systemId, java.lang.String notationName) 当解析器在DTD中发现一个非解析实体时,会调用此方法; name:非解析实体名; publicId:非解析实体的公共标识符; systemId:非解析实体的系统标识符; notationName:相关联标注的名称;,Sax_11.java,EntityResolver中的方法 resolveEntity(java.lang.String publicId, java.lang.String systemId) 解析时遇到一个外部DTD或外部实体时,即调用此方

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号