SAX解析XML
时间:2022-07-24
本文章向大家介绍SAX解析XML,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数据量大的xml建议使用SAX解析提高解析速度。SAX是Simple API for XML的缩写,它是事件驱动的,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
解析过程: (1)创建SAX解析器 SAXParserFactory factory=SAXParserFactory.newInstance(); (2)实现解析DefaultHandler 主要实现其中的5个方法: Void startDocument(), void endDocument(), void startElement(String uri,String localName,string qName,Attributes attr). Void endElement(String uri,String localName,string qName),void characters(char[] ch,int start,int lenth)
下面对这个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>
</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;
//省略get/set方法......
}
开始解析:
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 smn
*
*/
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(student);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(38)-Easyui-accordion+tree漂亮的菜单导航
- .Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
- silverlight于javascript通信
- 微信上线小游戏:对流量基础入口应用商店革命
- Appium Desktop 使用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(36)-文章发布系统③-kindeditor使用
- Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
- .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
- 丰富的silverlight控件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(35)-文章发布系统②-构建项目
- .Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法
- 机器学习加密货币IOTA在机构支持下跃起
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法