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解析:

[html] view
plain
copy

  1. <?

    xml version="1.0" encoding="UTF-8"?>

  2. <root>
  3. <student id="1" group="1">
  4. <name>张三</name>
  5. <sex>男</sex>
  6. <age>18</age>
  7. <email>zhangsan@163.com</email>
  8. <birthday>1987-06-08</birthday>
  9. <memo>好学生</memo>
  10. </student>
  11. <student id="2" group="2">
  12. <name>李四</name>
  13. <sex>女</sex>
  14. <age>18</age>
  15. <email>lisi@163.com</email>
  16. <birthday>1987-06-08</birthday>
  17. <memo>好学生</memo>
  18. </student>
  19. <student id="3" group="3">
  20. <name>小王</name>
  21. <sex>男</sex>
  22. <age>18</age>
  23. <email>xiaowang@163.com</email>
  24. <birthday>1987-06-08</birthday>
  25. <memo>好学生</memo>
  26. </student>
  27. <student id="4" group="4">
  28. <name>小张</name>
  29. <sex>男</sex>
  30. <age>18</age>
  31. <email>xiaozhang@163.com</email>
  32. <birthday>1987-06-08</birthday>
  33. <memo>好学生</memo>
  34. </student>
  35. <student id="5" group="5">
  36. <name>小明</name>
  37. <sex>男</sex>
  38. <age>18</age>
  39. <email>xiaoming@163.com</email>
  40. <birthday>1987-06-08</birthday>
  41. <memo>好学生</memo>
  42. </student>
  43. </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文件的更多相关文章

  1. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  2. 用SAX解析xml文件,java

    (此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...

  3. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  4. SAX解析xml文件

    需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...

  5. cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

    今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...

  6. 安卓SAX解析XML文件

    XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...

  7. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  8. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

  9. sax解析xml文件,封装到对象中

    创建User.java类 public class User { private String id; private String name; private String age; private ...

随机推荐

  1. Windows下效率必备软件

    AutoHotKey: 神器!神器!神器!当然也得看使用者咯(^__^) 嘻嘻…… Listary: 本地搜索神器,当然还有别的作用,More&More. Launchy : 快速启动安装的应 ...

  2. 同ListView该接口无法通过手势滑动左右切换界面问题解决方法

    同ListView该接口无法通过手势滑动左右切换界面问题解决方法 问题描写叙述: 在做OnGestureListener滑动切换窗体的时候,会遇到这种问题.就是当界面中含有ListView的时候.On ...

  3. Singleton模式(Singleton创建类型)c#简单的例子

    单(Singleton创建模式)c#简单的例子 当需要生成一个实例,可单发模式 样品可以在短短的球员中产生,玩家和测试.单线程例子,如以下: namespace singletonpattern { ...

  4. ubuntu nginx安装及相关linux性能參数优化

    一.安装 下载源代码,解压:tar -xzvf nginx-1.4.7.tar.gz ./configure make && make install 改动默认nginx的监听port ...

  5. hdu 4945 2048 (dp+组合的数目)

    2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  6. 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

    于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...

  7. 我学的是设计模式的视频教程——辛格尔顿,生成器VS工厂方法

    课程视频 单例模式         建造者VS工厂方法                      课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博客原创文章,博客, ...

  8. 【翻译】Ext JS最新技巧——2014-10-30

    原文:Top Support Tips Greg Barry:Ext JS 5的ExtraParams Ext JS 4同意用户直接将extraParams加入到一个链接,相似例如以下代码: Ext. ...

  9. 13 于C#如何获得在IP住址

    首先,需要加入一个命名空间 using System.Net.NetworkInformation; using System.Net.Sockets; 以下是具体代码 GetPrivateIP(); ...

  10. C++ do while 0 使用和含义

    /* do while 0 的使用方法和意义 */ //近期在非常多代码里都看到do while 0的身影. 乍一看,这不是没有做不论什么事情吗?为什么还要这样写.难道这是多此一举的吗?当然不是. / ...