使用SAX解析XML文件
SAX这是Simple API for XML缩写,它不是由引起W3C拟议标准正式。尽管如此,使用SAX很少几个,点儿全部的XML解析器都会支持它。
与DOM比較而言,SAX是一种轻量型的方法。
我们知道,在处理DOM的时候,我们须要读入整个的XML文档。然后在内存中创建DOM树,生成DOM树上的每一个Node对象。当文档比較小的时候,这不会造成什么问题,可是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件非常不划算的事(比方在applet中)。这时候。一个较好的替代解决方法就是SAX。
SAX在概念上与DOM全然不同。它不同于DOM的文档驱动,它是事件驱动的,它并不须要读入整个文档,而文档的读入过程也就是SAX的解析过程。
所谓事件驱动。是指一种基于回调(callback)机制的程序执行方法。
以下对这个xml文件使用sax解析:
- <?
xml version="1.0" encoding="UTF-8"?>
- <root>
- <student id="1" group="1">
- <name>张三</name>
- <sex>男</sex>
- <age>18</age>
- <email>zhangsan@163.com</email>
- <birthday>1987-06-08</birthday>
- <memo>好学生</memo>
- </student>
- <student id="2" group="2">
- <name>李四</name>
- <sex>女</sex>
- <age>18</age>
- <email>lisi@163.com</email>
- <birthday>1987-06-08</birthday>
- <memo>好学生</memo>
- </student>
- <student id="3" group="3">
- <name>小王</name>
- <sex>男</sex>
- <age>18</age>
- <email>xiaowang@163.com</email>
- <birthday>1987-06-08</birthday>
- <memo>好学生</memo>
- </student>
- <student id="4" group="4">
- <name>小张</name>
- <sex>男</sex>
- <age>18</age>
- <email>xiaozhang@163.com</email>
- <birthday>1987-06-08</birthday>
- <memo>好学生</memo>
- </student>
- <student id="5" group="5">
- <name>小明</name>
- <sex>男</sex>
- <age>18</age>
- <email>xiaoming@163.com</email>
- <birthday>1987-06-08</birthday>
- <memo>好学生</memo>
- </student>
- </root>
xml相应的Javabean:
public class Student {
private int id;
private int group;
private String name;
private String sex;
private int age;
private String email;
private String memo;
private String birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getGroup() {
return group;
}
public void setGroup(int group) {
this.group = group;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
開始解析:
import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* 功能描写叙述:採用sax方式解析XML<br>
*
* @author sxyx2008
*
*/
public class SaxParseXml extends DefaultHandler{ //存放遍历集合
private List<Student> list;
//构建Student对象
private Student student;
//用来存放每次遍历后的元素名称(节点名称)
private String tagName; public List<Student> getList() {
return list;
} public void setList(List<Student> list) {
this.list = list;
} public Student getStudent() {
return student;
} public void setStudent(Student student) {
this.student = student;
} public String getTagName() {
return tagName;
} public void setTagName(String tagName) {
this.tagName = tagName;
} //仅仅调用一次 初始化list集合
@Override
public void startDocument() throws SAXException {
list=new ArrayList<Student>();
} //调用多次 開始解析
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("student")){
student=new Student();
//获取student节点上的id属性值
student.setId(Integer.parseInt(attributes.getValue(0)));
//获取student节点上的group属性值
student.setGroup(Integer.parseInt(attributes.getValue(1)));
}
this.tagName=qName;
} //调用多次
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals("student")){
this.list.add(this.student);
}
this.tagName=null;
} //仅仅调用一次
@Override
public void endDocument() throws SAXException {
} //调用多次
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(this.tagName!=null){
String date=new String(ch,start,length);
if(this.tagName.equals("name")){
this.student.setName(date);
}
else if(this.tagName.equals("sex")){
this.student.setSex(date);
}
else if(this.tagName.equals("age")){
this.student.setAge(Integer.parseInt(date));
}
else if(this.tagName.equals("email")){
this.student.setEmail(date);
}
else if(this.tagName.equals("birthday")){
this.student.setBirthday(date);
}
else if(this.tagName.equals("memo")){
this.student.setMemo(date);
}
}
}
}
測试方法:
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import java.io.IOException;
import java.io.InputStream;
import java.util.List; public class Test { public static void main(String[] args) {
SAXParser parser = null;
try {
//构建SAXParser
parser = SAXParserFactory.newInstance().newSAXParser();
//实例化 DefaultHandler对象
SaxParseXml parseXml=new SaxParseXml();
//载入资源文件 转化为一个输入流
InputStream stream=SaxParseXml.class.getClassLoader().getResourceAsStream("student.xml");
//调用parse()方法
parser.parse(stream, parseXml);
//遍历结果
List<Student> list=parseXml.getList();
for(Student student:list){
System.out.println("id:"+student.getId()+"\tgroup:"+student.getGroup()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge()+"\temail:"+student.getEmail()+"\tbirthday:"+student.getBirthday()+"\tmemo:"+student.getMemo());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
执行效果:

版权声明:本文博客原创文章,博客,未经同意,不得转载。
使用SAX解析XML文件的更多相关文章
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- 用SAX解析xml文件,java
(此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...
- sax解析xml文件的DefaultHandler处理类
一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...
- SAX解析xml文件
需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...
- cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)
今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...
- 安卓SAX解析XML文件
XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...
- Python—使用xml.sax解析xml文件
什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...
- android sax解析xml 文件 动态加载标题
要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...
- sax解析xml文件,封装到对象中
创建User.java类 public class User { private String id; private String name; private String age; private ...
随机推荐
- 《Java程序猿面试笔试宝典》之Java与C/C++有什么异同
Java与C++都是面向对象语言,都使用了面向对象思想(比如封装.继承.多态等),因为面向对象有很多非常好的特性(继承.组合等),使得二者都有非常好的可重用性. 须要注意的是,二者并不是全然一样,以下 ...
- 同ListView该接口无法通过手势滑动左右切换界面问题解决方法
同ListView该接口无法通过手势滑动左右切换界面问题解决方法 问题描写叙述: 在做OnGestureListener滑动切换窗体的时候,会遇到这种问题.就是当界面中含有ListView的时候.On ...
- MVC5+EF6 入门完整教程 总目录
本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...
- fcitx
安装完成后首先面对的问题是全英文无法显示汉字和输入汉字的问题.需要找到光盘上的2个中文支持字体包安装上即可.文件名如下,注意不同版本文件明后面数字部分可能会不同,其代表版本号.下面是Red Hat E ...
- 作为一个新人,如何学习嵌入式Linux?
作为一个新人.如何学习嵌入式Linux?我一直在问太多次,特写文章来回答这个问题. 在学习嵌入式Linux之前.肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要 ...
- 经FreeMarkerclasspath加载方式生成静态页面
package htmlskin; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundExc ...
- 系列五AnkhSvn
原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...
- Android Property Animation 物业动画
效果图: Property Animation介绍: 出生在sdk3.0,是利用了View所拥有的属性,进行一系列的操作. 比方一个View有什么样的setAbc的属性,那么理论上就能够设置它. ...
- 介绍4种HTML5 Canvas库
1.bHive.js Library http://www.bhivecanvas.com/ bHive能创建丰富的用户体验.动画.游戏,能够使开发更简单. demo: http://www.bhiv ...
- tomcatserver乱码问题,tomcat与数据库之间的编码统一转换
在tomcat文件夹的conf文件夹下,改动server.xml文件,在以下截图中的位置加上URIEncoding="UTF-8"则表示tomcat编码转换为utf-8风格, 一般 ...