解析XML文件之使用SAM解析器
XML是一种常见的传输数据方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析。
SAX解析器的长处是显而易见的。那就是SAX并不须要将全部的文档都载入内存之后才进行解析。SAX是事件驱动机制的。也就是碰到元素节点、文本节点、文档节点的时候。都会触发一定的事件。我们仅仅须要在对应的回调事件里面进行对应的处理就能够了。由于这个特点。所以SAX解析占用的内存比較少。其它的解析方式,比方下一节要介绍的DOM解析器。则占用内存比較多。在解析比較小的XML文件的时候,差别不是非常大。大家哪种顺手就能够用哪种。可是当须要解析的文档达到几百K以上的时候,还是推荐使用SAX解析器或者是PULL解析器。这几种XML的解析方式。我都会在以后的文章中进行介绍,今天重点看SAX解析器。
以下是我们要进行解析的文件格式
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>lixiangmei</name>
<age>25</age>
</person>
</persons>
以下是我们的实体类
public class Person {
private Integer id;
private String name;
private Short age;
public Person(){}
public Person(Integer id, String name, Short age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
}
}
我们定义一个SAM解析器。对内容进行解析
/**
* 使用SAX对XML文件进行解析
*
* @author zhaokaiqiang
*
*/
public class SaxResolve { public List<Person> getPersons(InputStream inputStream) throws Exception { //获取SAXParser对象
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
//实例化我们的解析器
PersonHandler handler = new PersonHandler();
//開始对输入流解析
parser.parse(inputStream, handler);
//关闭输入流
inputStream.close();
//返回结果
return handler.getPersons();
} private class PersonHandler extends DefaultHandler { private List<Person> persons;
private Person person = null;
private String tag = null; public List<Person> getPersons() {
return persons;
} // 当读取到xml文件的開始部分时。对persons进行初始化
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
} // 这种方法对元素节点进行解析,如我们数据中的<person>、<age>、<name>都属于元素节点
// 当读取到person节点时,对Person对象进行初始化,同一时候获取到属性节点的值。并赋值给id,
// 记录如今的节点的名称,即localName,用于Person节点内部节点的解析
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("person")) {
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
tag = localName;
} // 这个回调方法用于对文本节点进行解析,如<age>30</age>里面的30就是属于文本节点。
// 我们依据元素节点tag的取值,取出里面的文本节点。然后对person进行赋值
@Override
public void characters(char[] ch, int start, int length)
throws SAXException { if (tag != null) {
String data = new String(ch, start, length);
if ("name".equals(tag)) {
person.setName(data);
} else if ("age".equals(tag)) {
person.setAge(new Short(data));
}
} } /*
* 当到达一个元素节点的结束时 比方
* <person id="20">
* <name>lixiangmei</name>
* <age>25</age>
* </person>
* 当到达这里的</person>节点,就会出发以下的事件,我们在这个回调方法里面将解析出的person对象
* 加入到persons里面,而且将person和tag进行初始化,进行下一个person节点的解析
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equals("person")) {
persons.add(person);
person = null;
}
tag = null;
} } }
由于凝视比較具体,所以只是多解析,以下我们使用单元測试,对解析进行測试
//測试SAX解析
public void testSax() throws Exception {
//从xml文件里获取输入流
InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream("persons.xml");
//获取解析出的对象
List<Person> persons = new SaxResolve().getPersons(inputStream);
//打印
for (Person p : persons) {
Log.d(TAG, p.toString());
} }
以下是解析结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYno0MTk5MjcwODk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
解析XML文件之使用SAM解析器的更多相关文章
- 解析XML文件之使用DOM解析器
在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...
- Python解析xml文件遇到的编码解析的问题
使用python对xml文件进行解析的时候,假设xml文件的头文件是utf-8格式的编码,那么解析是ok的,但假设是其它格式将会出现例如以下异常: xml.parsers.expat.ExpatErr ...
- dom4j生成和解析xml文件
dom4j生成和解析xml文件 要生成和解析如下格式的xml文件: <?xml version="1.0" encoding="UTF-8"?> & ...
- java解析XML文件四种方法之引入源文件
1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Documen ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- XML:使用DOM技术解析xML文件中的城市,实现select级联选择
中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...
- Android开发学习---使用XmlPullParser解析xml文件
Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将 ...
- SAX解析xml文件
需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...
随机推荐
- 前端的UI设计与交互之色彩篇
一.颜色Red热情.警示 Green成功.通过.安全 Blue专业.科技 Pink典雅.明快.女性 Orange醒目.温暖 Purple高雅.浪漫 Yellow活力.提示 Cyan清新.冷静.结构化 ...
- transform的影响
http://www.cnblogs.com/chuangweili/p/5167986.html transform 各种影响 1.提升元素的z-index层级,下面这个例子会让前面的图片显示在上面 ...
- 私有成员 ECMAScript6 weakmap
把变量放到构造函数里进行私有化,每一个实例都会有一个getName方法,这是低效率的.function Person(name) { this.getName = function() { retur ...
- 根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局
在数学中,矩阵是以行和列排列的数字,符号或表达式的矩形阵列,任何矩阵都可以通过相关字段的标量乘以元素.矩阵的主要应用是表示线性变换,即f(x)= 4 x等线性函数的推广.例如,旋转的载体在三维空间是一 ...
- 使用python3的typing模块提高代码健壮性
前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...
- [深度学习]实现一个博弈型的AI,从五子棋开始(1)
好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...
- SSM框架搭建(Spring+SpringMVC+MyBatis)与easyui集成并实现增删改查实现
一.用myEclipse初始化Web项目 新建一个web project: 二.创建包 controller //控制类 service //服务接口 service.impl //服务 ...
- [转载] 一致性hash算法释义
转载自http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Ka ...
- Python异步处理
回调函数是实现异步操作的常用手法 1.callback版本的示例,其中framework调用logic,在完成某些操作或者接收到信号后,用callback返回异步结果 #!/usr/bin/env p ...
- mysql实现高可用架构之MHA
一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...