您好,欢迎访问一九零五行业门户网

XML编程-SAX

xml编程-sax
基本概述
sax,全称simple api for xml,既是一种接口,也是一种软件包。它是一种xml解析的替代方法。sax不同于dom解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
sax是一个用于处理xml事件驱动的“推”模型,虽然它不是w3c标准,但它却是一个得到了广泛认可的api。sax解析器不像dom那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。
ps:sax不能够对xml文件进行修改,删除、添加操作。
为什么引入sax技术?    dom技术也是一种非常好的dom解析方案,为什么还会出现sax技术呢?原因很简单,那就是dom是以文档树的结构对xml进行保存,这就表明是一次性将xml读入内存,那么这在大型的xml文件中是不可能的。所以才产生了sax这种扫描解析的技术。
原理图
sax解析机制
sax解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
在java中,通过继承defaulthandler 接口,可以开发一个sax解析器。
sax的解析机制和事件监听机制很像,都是等待某一事件触发,然后调用相应方法。
sax解析器的最常用5个事件:
1、startdocument():这标识着sax解析器扫描到文档开始位置。
2、enddocument(),这标识着sax解析器扫描到文档的结束位置。
3、startelement(),这标识着sax解析器扫描到一个元素的开始标签。
4、character(),这标识着sax解析器扫描到了一些文本,注意它是以char数组形式存放的。
5、endelement(),这标识着sax解析器扫描到了一个元素的结束标签。
事件处理器常用方法参数列表public void startdocument()
public void startelement(string uri, string localname, string qname,attributes attributes)
uri - 名称空间 uri,如果元素没有任何名称空间 uri,或者没有正在执行名称空间处理,则为空字符串。
localname - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qname - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
attributes - 附加到元素的属性。如果没有属性,则它将是空的 attributes 对象。
public void characters(char[] ch, int start, int length)
ch - 文档的所有字符。
start - 字符数组中的开始位置。
length - 从字符数组中使用的字符数。
public void endelement(string uri, string localname, string qname)
uri - 名称空间 uri,如果元素没有任何名称空间 uri,或者没有正在执行名称空间处理,则为空字符串。
localname - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qname - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
public void enddocument()
解析方式    通过解析器和事件处理器一起使用,可以解析xml文档。解析器可以使用jaxp的api创建,创建出sax解析器后,就可以指定解析器去解析某个xml文档。事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
解析步骤
1、通过调用saxparserfactory的newinstance()方法获得sax解析器工厂对象。
2、通过sax解析器工厂对象调用newsaxparser()方法获得解析器saxparser对象
3、通过调用解析器对象的parse方法将解析器与事件处理器对象关联
案例:
xml6.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?> <班级 班次="1班" 编号="c1"> <学生 地址="湖南" 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="c1"> <名字>张三</名字> <年龄>20</年龄> <介绍>不错</介绍> </学生> <学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="c1"> <名字>李四</名字> <年龄>18</年龄> <介绍>很好</介绍> </学生> <学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="c1"> <名字>王五</名字> <年龄>22</年龄> <介绍>非常好</介绍> </学生> <学生 性别="男"> <名字>小明</名字> <年龄>30</年龄> <介绍>好</介绍> </学生> </班级>
package com.pc; import javax.xml.parsers.*; import org.xml.sax.attributes; import org.xml.sax.saxexception; import org.xml.sax.helpers.defaulthandler; public class xml6{ //使用sax技术去解析xml文件 public static void main(string[] args) throws exception, saxexception { // todo auto-generated method stub //1.创建saxparserfactory saxparserfactory spf=saxparserfactory.newinstance(); //2.创建saxparser 解析器 saxparser saxparser=spf.newsaxparser(); //3 把xml文件和事件处理对象关联 saxparser.parse("src/com/pc/xml6.xml",new mydefaulthandler2() ); } } // 只显示学生的名字和年龄 class mydefaulthandler2 extends defaulthandler{ private boolean isname=false; private boolean isage=false; @override public void characters(char[] ch, int start, int length) throws saxexception { // todo auto-generated method stub string con=new string(ch,start,length); if(!con.trim().equals("")&&(isname||isage)){ system.out.println(con); } isname=false; isage=false; //super.characters(ch, start, length); } @override public void enddocument() throws saxexception { // todo auto-generated method stub super.enddocument(); } @override public void endelement(string uri, string localname, string name) throws saxexception { // todo auto-generated method stub super.endelement(uri, localname, name); } @override public void startdocument() throws saxexception { // todo auto-generated method stub super.startdocument(); } @override public void startelement(string uri, string localname, string name, attributes attributes) throws saxexception { // todo auto-generated method stub if(name.equals("名字")){ this.isname=true; }else if(name.equals("年龄")){ this.isage=true; } } } //定义事件处理类 class mydefaulthandler1 extends defaulthandler{ //发现文档开始 @override public void startdocument() throws saxexception { // todo auto-generated method stub system.out.println("startdocument()"); super.startdocument(); } //发现xml文件中的一个元素 @override public void startelement(string uri, string localname, string name, attributes attributes) throws saxexception { // todo auto-generated method stub system.out.println("元素名称="+name); } //发现xml文件中的文本 @override public void characters(char[] ch, int start, int length) throws saxexception { string con=new string(ch,start,length); //显示文本内容: if(!con.trim().equals("")){ system.out.println(new string(ch,start,length)); } } //发现xml文件中一个元素介绍</xx> @override public void endelement(string uri, string localname, string name) throws saxexception { // todo auto-generated method stub super.endelement(uri, localname, name); } //发现文档结束 @override public void enddocument() throws saxexception { // todo auto-generated method stub system.out.println("enddocument()"); super.enddocument(); } }
以上就是xml编程-sax 的内容。
其它类似信息

推荐信息