




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XML技术基础,主讲:肖宏启,第七章XML应用编程,回顾,包org.w3c.dom中所定义的DOM常用接口主要有:Node接口NodeList接口Document接口Element接口Attr接口NamedNodeMap接口Text接口,回顾,DOM编程通常包括以下几个步骤:创建一个解析器对象;将您的XML文档传递给解析器,进行解析,产生DOM节点树对象;处理DOM节点树;保存DOM节点树。,本章目标,SAX接口概述SAX接口委托事件模型第一个SAX应用程序一些常用的方法与参数SAX应用编程作业,SAX接口概述,SAX简易应用程序编写接口SimpleAPIforXML。它并不是由W3C官方所提出的标准,而是“民间”的事实标准,是一种社区性质的讨论产物。几乎所有的XML解析器都会支持它。与DOM比较,SAX是一种轻量型的处理XML文档的方法。,SAX接口概述,SAX具有如下主要优点:可以解析任意大小的文件适合创建自己的数据结构适合小信息子集简单快速,SAX接口概述,SAX也存在以下不足之处不能对文档做随机存取难以实现复杂的查询不能使用文档类型定义(DTD)不可获取词法信息SAX是只读的当前的浏览器不支持SAX,SAX工作原理,SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活响应的事件处理函数,从而完成对XML文档的访问,所以SAX接口也称作事件驱动接口。,SAX工作原理,委托事件模型,注册监听者:saxParser.parse(newFile(Sax_1.xml),handler);,SAX监听者接口,SAXAPI实际上定义了几个监听者接口来处理事件:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,Attributes,XMLReader一个典型的SAX应用程序至少要提供一个ContentHandler接口。一个健壮的SAX应用程序还应该提供ErrorHandler接口。DefaultHandler适配器类实现了ContentHandler、DTDHandler、EntityResolver、ErrorHandler接口中的所有方法。,DefaultHandler,ContentHandler,DTDHandler,EntityResolver,ErrorHandler,Attributes,XMLReader,监听者,继承,实现,适配器类,SAX接口,unparsedEntityDecl,resolveEntity,方法,监听者(事件处理器类)的设计,大多数情况下,您的Java代码将继承DefaultHandler适配器类。例如:publicclasssaxOneextendsDefaultHandler,返回目标,此类继承了适配器类,可以做监听者,SAX编程一般步骤,使用SAX编程一般包括以下3个步骤:建立解析器对象;为SAX解析器注册监听者,使用SAX解析器解析XML文档;实现SAX事件处理器类。,建立解析器对象,SAXParserFactoryspf=SAXParserFactory.newInstance();spf.setNamespaceAware(true);spf.setValidating(true);SAXParserparser=spf.newSAXParser();,为SAX解析器注册监听者,解析XML文档,要使用SAXParser解析文档,只需调用它的parse()方法。在此必须指定parse()方法的两个实参:第一个指定了要解析的XML文档,第二个是指定处理事件的对象,这个对象的类型应为DefaultHandler适配器类。代码如下:SAX7_5handler=newSAX7_5();parser.parse(xmlFile,handler);,第一个SAX应用程序,importjavax.xml.parsers.*;/获取XML文档对象的包importjava.io.*;/JAVA读取文件需加载的包importorg.xml.sax.helpers.*;/包含适配器类DefaultHandlerimportorg.xml.sax.*;/SAX接口的核心publicclassSax_1publicstaticvoidmain(Stringargs)trySAXParserFactoryfactory=SAXParserFactory.newInstance();SAXParsersaxParser=factory.newSAXParser();MyHandlerhandler=newMyHandler();saxParser.parse(newFile(Sax_1.xml),handler);System.out.println(该XML文件共有+handler.count+标记);catch(Exceptione)System.out.println(e);,classMyHandlerextendsDefaultHandlerintcount=0;publicvoidstartDocument()System.out.println(开始解析XML文件);count+;publicvoidendDocument()System.out.println(解析文件结束);count+;publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesatts)System.out.println();count+;publicvoidendElement(Stringuri,StringlocalName,StringqName)System.out.println();count+;publicvoidcharacters(charch,intstart,intlength)Stringtext=newString(ch,start,length);System.out.println(text);count+;,返回目标,DefaultHandler,ContentHandler,DTDHandler,EntityResolver,ErrorHandler,Attributes,XMLReader,监听者,继承,实现,适配器类,SAX接口,unparsedEntityDecl,resolveEntity,方法,一些常用的方法及参数,返回目标,ContentHandler接口中的方法,一些常用的方法及参数,voidstartDocument():当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。voidendDocument():和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。,Sax_2.java,一些常用的方法及参数,voidstartElement(java.lang.StringnamespaceURI,java.lang.StringlocalName,java.lang.StringqName,Attributesatts)当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间地址;localName是本地元素名,不带前缀;需设置factory.setNamespaceAware(true);qName是带前缀的元素名;atts是这个元素所包含的属性列表,通过atts,可以得到所有的属性名和相应的值。endElement的参数与startElement基本相同,没有属性列表。,Sax_4.java,一些常用的方法及参数,processingInstruction(Stringtarget,Stringdata)解析器不报告XML声明给事件处理器target:目标程序名;data:处理指令内容;,Sax_3.java,一些常用的方法及参数,voidcharacters(charch,intstart,intlength):这个方法用来处理在XML文件中读到字符串,它的参数是一个字符数组,以及读到的这个字符串在这个数组中的起始位置和长度,我们可以很容易的用String类的一个构造方法来获得这个字符串的String类:StringcharEncontered=newString(ch,start,length)。ignorableWhitespace(charch,intstart,intlength)此事件类似于我们前面所讨论的无用DOM节点。它与character事件区别的好处是:如果您不需要空格符,您可以通过忽略这个事件来忽略所有的空格符。XML文档是有效的;DTD规定XML的标记不能有混合的内容;,Sax_5.java,Sax_6.java,startPrefixMapping(java.lang.Stringprefix,java.lang.Stringuri)命名空间事件,发生在元素开始事件之前;endPrefixMapping(java.lang.Stringprefix,java.lang.Stringuri)命名空间结束事件需设定可以解析名称空间factory.setNamespaceAware(true);,一些常用的方法及参数,Sax_7.java,一些常用的方法及参数,setDocumentLocator(Locatorlocator)文件定位器,可以返回一个数据在文档中的位置。解析器解析XML时,首先报告一个“文件定位器事件”,返回一个定位器对象;即此事件发生在文档开始事件之前;定位器对象的方法:getColumnNumber()返回事件结束处的列号getLineNumber()返回事件结束处的行号getPublicId()返回当前文档事件的公共标识符getSystemId()返回当前文档事件的系统标识符,Sax_2.java,Sax_9.java,一些常用的方法及参数,skippedEntity(java.lang.Stringname)忽略实体事件当XML文档中引用的实体在DTD中没有定义,就会激发此事件。,一些常用的方法及参数,DTDHandler中的方法unparsedEntityDecl(java.lang.Stringname,java.lang.StringpublicId,java.lang.StringsystemId,java.lang.StringnotationName)当解析器在DTD中发现一个非解析实体时,会调用此方法;name:非解析实体名;publicId:非解析实体的公共标识符;systemId:非解析实体的系统标识符;notationName:相关联标注的名称;,Sax_11.java,EntityResolver中的方法resolveEntity(java.lang.StringpublicId,java.lang.StringsystemId)解析时遇到一个外部DTD或外部实体时,即调用此方法;外部DTD事件发生在文件开始事件之后,和根元素开始事件之前;,一些常用的方法及参数,Sax_8.java,一些常用的方法及参数,error(SAXParseExceptionex)没遵守DTD即发生此错误fatalError(SAXParseExceptionex)warning(SAXParseExceptionex)需要设置在解析时进行有效性验证factory.setValidating(true);ex的方法:getColumnNumber()返回错误处的列号getLineNumber()返回错误处的行号getPublicId()返回错误事件的公共标识符getSystemId()返回错误事件的系统标识符getMessage()获得错误的描述信息;printStackTrace可获得该错误的堆栈信息;,Sax_10.java,SAX应用程序异常,当XML文档出现数据类型错误时,如何处理?用DTD的方式也可用Schema的方式,Sax_12.java,SAX与数据库,将以下XML文档的数据写入数据库:李丽wwwa1孙静23pt0,SAX与数据库,从XML文档读入数据写入数据库连接数据源:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);con=DriverManager.getConnection(“jdbc:odbc:test”);建立SQL语句:sql=insertinto用户表values(+handler.str1i+,+handler.str2i+,+handler.str3i+);执行SQL命令st=con.createStatement();/创建Staement对象st.executeUpdate(sql);/插入数据库记录st.close();con.close();,Sax_13.java,SAX对DOM,要注意的是SAX中一个重要的特点就是它的流式处理,在遇到一个标签的时候,它并不会记录下以前所碰到的标签。也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工厂安全培训知识点
- 2025重庆巫溪县事业单位考核招聘98人备考考试题库附答案解析
- 2025四川泸州交通物流集团有限公司及下属公司招聘10人备考考试题库附答案解析
- 法务专业团队咨询方案
- 2025湖北省省直机关遴选公务员214人备考考试题库附答案解析
- 哲学博士路途
- 工厂安全培训文案课件
- 2025西安经开第九小学实习教师招聘备考考试题库附答案解析
- 2025贵州安顺市中医院引进专业技术人才备考练习试题及答案解析
- 枣庄市台儿庄区2025届公费医学毕业生定岗备考考试题库附答案解析
- 2024版2025秋贵州黔教版综合实践活动五年级上册全册教案教学设计
- 转作风重实干课件
- 村干部饮水安全培训总结课件
- 安全生产治本攻坚三年行动半年工作总结
- 单招备考科学方案
- 医美咨询培训课件
- 海船船员适任 评估规范(2024)轮机专业
- DB50-T 1463.2-2023 牛羊布鲁氏菌病防控技术规范 第2部分:人员防护
- NoSQL数据库应用与实践 课件 第1-6章 认识NoSQL - 增删改查
- 20世纪宋史研究:主要趋势、热点领域与未来展望
- 2025年度餐饮店知识产权保护与合伙人合同
评论
0/150
提交评论