使用PULL解析XML文件
转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241
XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。
下面来看一个pull解析xml的例子:
student.xml:
<?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>
对应的bean:
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.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout; import android.widget.TextView; public class PullActivity extends Activity implements Runnable{ private TextView pullTextView ;
private LinearLayout layout;
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
List<Student> lists=(List<Student>) msg.obj;
for(int i=0;i<lists.size();i++){
Student student=lists.get(i);
StringBuffer sb=new StringBuffer();
sb.append(student.getId()+" ").append(student.getName()+" ")
.append(student.getAge()+" ").append(student.getSex()+" ").append(student.getBirthday()+" ")
.append(student.getEmail()+" ").append(student.getGroup()+" ");
TextView txt=new TextView(getApplicationContext());
txt.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
txt.setText(sb.toString());
layout.addView(txt);
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.pull); pullTextView=(TextView) this.findViewById(R.id.pullTextView);
layout=(LinearLayout) this.findViewById(R.id.layout);
new Thread(this).start(); }
//pull解析xml
public List<Student> pullParseXml(){
List<Student> lists=null;
Student student=null; try {
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
//获取XmlPullParser实例
XmlPullParser pullParser=factory.newPullParser();
InputStream in=this.getClass().getClassLoader().getResourceAsStream("student.xml");
pullParser.setInput(in, "UTF-8");
//开始
int eventType=pullParser.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){
String nodeName=pullParser.getName();
switch (eventType) {
//文档开始
case XmlPullParser.START_DOCUMENT:
lists=new ArrayList<Student>();
break; //开始节点
case XmlPullParser.START_TAG:
if("student".equals(nodeName)){
student=new Student();
student.setId(Integer.parseInt(pullParser.getAttributeValue(0)));
student.setGroup(Integer.parseInt(pullParser.getAttributeValue(1)));
}else if("name".equals(nodeName)){
student.setName(pullParser.nextText());
}else if("sex".equals(nodeName)){
student.setSex(pullParser.nextText());
}else if("age".equals(nodeName)){
student.setAge(Integer.parseInt(pullParser.nextText()));
}else if("email".equals(nodeName)){
student.setEmail(pullParser.nextText());
}else if("birthday".equals(nodeName)){
student.setBirthday(pullParser.nextText());
}else if("memo".equals(nodeName)){
student.setMemo(pullParser.nextText());
}
break;
//结束节点
case XmlPullParser.END_TAG:
if("student".equals(nodeName)){
lists.add(student);
student=null;
}
break;
default:
break;
}
// 手动的触发下一个事件
eventType=pullParser.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return lists; }
@Override
public void run() {
// TODO Auto-generated method stub
List<Student> lists=pullParseXml();
Message msg=handler.obtainMessage();
msg.obj=lists;
handler.sendMessage(msg);
}
}
注意xml中的<?xml version="1.0" encoding="utf-8"?> 这句话要顶格显示,不要留空隙,附则错了很难调试的。
解析后效果:

今天我们一起通过一个小例子来学习一下使用PULL解析器解析XML文件。
(1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beauties>
- <beauty>
- <name>范冰冰</name>
- <age>28</age>
- </beauty>
- <beauty>
- <name>杨幂</name>
- <age>23</age>
- </beauty>
- </beauties>
然后在src目录下写一个与XML中节点(Node)相对应的类Beauty,其内容如下:
- package com.pulltest;
- public class Beauty {
- //美女姓名
- private String name;
- //美女年龄
- private String age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";
- }
- }
(2)在src目录下写一个接口IBeautyParser,其内容如下:
- package com.pulltest;
- import java.io.InputStream;
- import java.util.List;
- public interface IBeautyParser {
- /**
- *
- * 解析输入流,获取Beauty列表
- * @param is
- * @return
- * @throws Exception
- */
- public List<Beauty> parse(InputStream is) throws Exception;
- /**
- *
- * 序列化Beauty对象集合,得到XML形式的字符串
- * @param beauties
- * @return
- * @throws Exception
- */
- public String serialize(List<Beauty> beauties) throws Exception;
- }
在src目录下写一个上面接口的实现类BeautyParserImpl,其内容如下,代码已经详细注释:
- package com.pulltest;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import android.util.Xml;
- public class BeautyParserImpl implements IBeautyParser{
- @Override
- public List<Beauty> parse(InputStream is) throws Exception {
- List<Beauty> mList = null;
- Beauty beauty = null;
- // 由android.util.Xml创建一个XmlPullParser实例
- XmlPullParser xpp = Xml.newPullParser();
- // 设置输入流 并指明编码方式
- xpp.setInput(is,"UTF-8");
- // 产生第一个事件
- int eventType = xpp.getEventType();
- while (eventType != XmlPullParser.END_DOCUMENT){
- switch (eventType) {
- // 判断当前事件是否为文档开始事件
- case XmlPullParser.START_DOCUMENT:
- mList = new ArrayList<Beauty>(); // 初始化books集合
- break;
- // 判断当前事件是否为标签元素开始事件
- case XmlPullParser.START_TAG:
- if (xpp.getName().equals("beauty")) { // 判断开始标签元素是否是book
- beauty = new Beauty();
- } else if (xpp.getName().equals("name")) {
- eventType = xpp.next();//让解析器指向name属性的值
- // 得到name标签的属性值,并设置beauty的name
- beauty.setName(xpp.getText());
- } else if (xpp.getName().equals("age")) { // 判断开始标签元素是否是book
- eventType = xpp.next();//让解析器指向age属性的值
- // 得到age标签的属性值,并设置beauty的age
- beauty.setAge(xpp.getText());
- }
- break;
- // 判断当前事件是否为标签元素结束事件
- case XmlPullParser.END_TAG:
- if (xpp.getName().equals("beauty")) { // 判断结束标签元素是否是book
- mList.add(beauty); // 将book添加到books集合
- beauty = null;
- }
- break;
- }
- // 进入下一个元素并触发相应事件
- eventType = xpp.next();
- }
- return mList;
- }
- @Override
- public String serialize(List<Beauty> beauties) throws Exception {
- // TODO Auto-generated method stub
- return null;
- }
- }
(3) 在layout目录下新建一个布局文件pulltest.xml,其内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/textView"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </LinearLayout>
在src目录下的Activity内容如下:
- package com.pulltest;
- import java.io.InputStream;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- import com.example.pulltest.R;
- public class PullTestActivity extends Activity{
- //装载Beauty类型的链表,其内容由XML文件解析得到
- private List<Beauty> beautyList;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.pulltest);
- try {
- //通过assertmanager的open方法获取到beauties.xml文件的输入流
- InputStream is = this.getAssets().open("beauties.xml");
- //初始化自定义的实现类BeautyParserImpl
- BeautyParserImpl pbp = new BeautyParserImpl();
- //调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList
- beautyList = pbp.parse(is);
- } catch (Exception e) {
- e.printStackTrace();
- }
- setupViews();
- }
- /**
- * 将数据显示到手机界面上
- */
- private void setupViews(){
- String result = "";
- for (Beauty b : beautyList) {
- result += b.toString();
- }
- TextView textView = (TextView) findViewById(R.id.textView);
- textView.setText(result);
- }
- }
我们右键运行一下android project,结果截图如下:
完整的实例代码下载地址:
使用PULL解析XML文件的更多相关文章
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
- pull解析xml文件
pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...
- Android -- 创建XML文件对象及其序列化, pull解析XML文件
1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...
- Android pull解析xml文件
本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...
- android——使用pull解析xml文件
1.persons.xml 将persons.xml文件放到src目录下.其代码如下: <?xml version='1.0' encoding='UTF-8' standalone='yes' ...
- [android] 采用pull解析xml文件
/***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...
- Android SAX、DOM、Pull解析xml文件剖析与案例讲解
XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...
- Android中pull解析XML文件的简单使用
首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐 ...
- android 生成、pull解析xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
随机推荐
- CA证书服务器从2003迁移到2008 R2!
1.在源 CA 服务器中备份相应的 CA :
- 1、第一个JSP
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...
- 分享阿里云SLB-负载均衡的实现基本原理架构
负载均衡技术原理浅析 https://help.aliyun.com/knowledge_detail/39444.html?spm=5176.7839438.2.6.XBbX5l 阿里定制版的LVC ...
- Java 的抽象特性:抽象类与接口深度解析
要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...
- 使用maven拆分项目
在开发环境中,有时需要专人负责专门的模块,其他模块不需接触,这就需要将项目拆分,如下 fund_demo项目具有三个模块,现将主业务core模块单独提出另建一个项目fund_core,拆分时需要注意相 ...
- 基于UML的面向对象分析与设计
前言 经常听到有朋友抱怨,说学了UML不知该怎么用,或者画了UML却觉得没什么作用.其实,就UML本身来说,它只是一种交流工具,它作为一种标准化交流符号,在OOA&D过程 ...
- fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏
问题出现背景: 原本电脑里是装着VS2015的,其使用的是.NET 4.5,当再安装VS2010之后,不能与当前的.NET平台兼容.卸载VS2015时,不会恢复.NET 4.0. l 当VS2015安 ...
- 14条最佳JS代码编写技巧
http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...
- [Asp.net]Calendar+JqueryUi实现日程管理——添加日程
引言 之前在博客园里看到一篇文章,介绍的云日程,所以就一直在想如果是自己该如何实现,所以就自己尝试弄了一个简单的demo. 项目 效果图 日历控件,本来想弄一个js版的,后来考虑,js版的会花费更多的 ...
- XML相关转换
1.将DataTable转换成xml字符串 //将DataTable转换成xml字符串: public string ConvertDataTableToXml(DataTable dt) { Mem ...