千家信息网

XML编程中SAX的示例分析

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章主要为大家展示了"XML编程中SAX的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"XML编程中SAX的示例分析"这篇文章吧。XML编程-
千家信息网最后更新 2024年12月13日XML编程中SAX的示例分析

这篇文章主要为大家展示了"XML编程中SAX的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"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

<班级 班次="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文件中一个元素介绍        @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的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文档 处理 事件 名称 元素 空间 处理器 对象 文件 方法 空字符 内容 技术 数据 标识 编程 前缀 字符 正在 示例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么样子的服务器可以登陆模拟器 脚本配置信息传到服务器 贵州婷维软件开发 松江区多功能软件开发厂家价格 软件开发后销售分录 数据库移到电脑 北京首都机场软件开发 济南边锋网络技术有限公司 云南警官学院网络安全 苏州大数据软件开发定制费用 石油网络安全智能监控系统 精英网络技术服务信息推荐 塔式服务器机箱内怎么加大硬盘 网络安全维护口号 微信小程序访问云数据库 网络安全解决方案侧重点 5g网络技术爆发年2020 微擎数据库获取多条数据 文献数据库哪个好 服务器管理专业 软件开发合同免税备案 没学历能培训网络安全吗 栖霞区网络技术服务经验丰富 数据库与对应检索字段的关系连线 我的世界服务器如何显示玩家名字 做android的软件开发 网络安全维护口号 嘎吱网络技术有限公司 梦幻新诛仙笑傲江湖服务器 虚拟机做梦连接数据库
0