使用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= ...
随机推荐
- 区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理【转】
基于HTML5的PACS--图像伪彩 摘要: 要查看此系统更多的图像处理功能请参考:区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理套用句广告语:哪里不会点哪里,so e ...
- UNIX网络编程读书笔记:地址操纵函数
地址格式转换函数:它们在ASCII字符串(人们比较喜欢用的格式)与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址. 1.inet_aton.inet_addr.inet_ntoa inet ...
- SLAX初体验
Slax是一个便捷.便携的Linux操作系统.它的界面既充满时尚感,又可基于不同模块的功能运作.它的界面富有时尚感,并集成了不同的模块的界面.尽 管它的容量十分娇小,Slax依然预载了不少日常应用的软 ...
- QtGui.QSplitter
A QtGui.QSplitter lets the user control the size of child widgets by dragging the boundary between t ...
- QtGui.QPixmap
A QtGui.QPixmap is one of the widgets used to work with images. It is optimized for showing images o ...
- alitomcat maven以及Autoconfig
maven概述 Maven的核心是POM(Project Object Model),即项目对象模型.最直观的,maven对项目依赖进行统一的管理,让开发者从纷杂错乱的jar包世界摆脱出来,更加专注于 ...
- mysql 5.5安装手记
从MySQL5.5 开始就要用cmake安装,本次安装的版本为mysql-5.5.22.tar.gz #准备工作 yum install -y gcc gcc-c++ libtool autoconf ...
- javascript 获取页面尺寸/位置
************************************************************************//ie中如果全部不给定值则会都为零(宽和高在设置一个的 ...
- 【LeetCode】94. Binary Tree Inorder Traversal (3 solutions)
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- 使用vs调试.net源代码
使用.NET Framework库参考源进行调试 您可能会想知道使用.NET Framework参考源的调试方式.在下面的示例中,您将看到一个我调用公用Console.WriteLine方法的工具.从 ...