转载博文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"?>  这句话要顶格显示,不要留空隙,附则错了很难调试的。

解析后效果:

博文2:Android之PULL解析XML

今天我们一起通过一个小例子来学习一下使用PULL解析器解析XML文件。

(1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beauties>
  3. <beauty>
  4. <name>范冰冰</name>
  5. <age>28</age>
  6. </beauty>
  7. <beauty>
  8. <name>杨幂</name>
  9. <age>23</age>
  10. </beauty>
  11. </beauties>

然后在src目录下写一个与XML中节点(Node)相对应的类Beauty,其内容如下:

  1. package com.pulltest;
  2. public class Beauty {
  3. //美女姓名
  4. private String name;
  5. //美女年龄
  6. private String age;
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public String getAge() {
  14. return age;
  15. }
  16. public void setAge(String age) {
  17. this.age = age;
  18. }
  19. @Override
  20. public String toString() {
  21. return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";
  22. }
  23. }

(2)在src目录下写一个接口IBeautyParser,其内容如下:

  1. package com.pulltest;
  2. import java.io.InputStream;
  3. import java.util.List;
  4. public interface IBeautyParser {
  5. /**
  6. *
  7. * 解析输入流,获取Beauty列表
  8. * @param is
  9. * @return
  10. * @throws Exception
  11. */
  12. public List<Beauty> parse(InputStream is) throws Exception;
  13. /**
  14. *
  15. * 序列化Beauty对象集合,得到XML形式的字符串
  16. * @param beauties
  17. * @return
  18. * @throws Exception
  19. */
  20. public String serialize(List<Beauty> beauties) throws Exception;
  21. }

在src目录下写一个上面接口的实现类BeautyParserImpl,其内容如下,代码已经详细注释:

  1. package com.pulltest;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.xmlpull.v1.XmlPullParser;
  6. import android.util.Xml;
  7. public class BeautyParserImpl implements IBeautyParser{
  8. @Override
  9. public List<Beauty> parse(InputStream is) throws Exception {
  10. List<Beauty> mList = null;
  11. Beauty beauty = null;
  12. // 由android.util.Xml创建一个XmlPullParser实例
  13. XmlPullParser xpp = Xml.newPullParser();
  14. // 设置输入流 并指明编码方式
  15. xpp.setInput(is,"UTF-8");
  16. // 产生第一个事件
  17. int eventType = xpp.getEventType();
  18. while (eventType != XmlPullParser.END_DOCUMENT){
  19. switch (eventType) {
  20. // 判断当前事件是否为文档开始事件
  21. case XmlPullParser.START_DOCUMENT:
  22. mList = new ArrayList<Beauty>(); // 初始化books集合
  23. break;
  24. // 判断当前事件是否为标签元素开始事件
  25. case XmlPullParser.START_TAG:
  26. if (xpp.getName().equals("beauty")) { // 判断开始标签元素是否是book
  27. beauty = new Beauty();
  28. } else if (xpp.getName().equals("name")) {
  29. eventType = xpp.next();//让解析器指向name属性的值
  30. // 得到name标签的属性值,并设置beauty的name
  31. beauty.setName(xpp.getText());
  32. } else if (xpp.getName().equals("age")) { // 判断开始标签元素是否是book
  33. eventType = xpp.next();//让解析器指向age属性的值
  34. // 得到age标签的属性值,并设置beauty的age
  35. beauty.setAge(xpp.getText());
  36. }
  37. break;
  38. // 判断当前事件是否为标签元素结束事件
  39. case XmlPullParser.END_TAG:
  40. if (xpp.getName().equals("beauty")) { // 判断结束标签元素是否是book
  41. mList.add(beauty); // 将book添加到books集合
  42. beauty = null;
  43. }
  44. break;
  45. }
  46. // 进入下一个元素并触发相应事件
  47. eventType = xpp.next();
  48. }
  49. return mList;
  50. }
  51. @Override
  52. public String serialize(List<Beauty> beauties) throws Exception {
  53. // TODO Auto-generated method stub
  54. return null;
  55. }
  56. }

(3) 在layout目录下新建一个布局文件pulltest.xml,其内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:id="@+id/textView"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content" />
  10. </LinearLayout>

在src目录下的Activity内容如下:

  1. package com.pulltest;
  2. import java.io.InputStream;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.widget.TextView;
  7. import com.example.pulltest.R;
  8. public class PullTestActivity extends Activity{
  9. //装载Beauty类型的链表,其内容由XML文件解析得到
  10. private List<Beauty> beautyList;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.pulltest);
  15. try {
  16. //通过assertmanager的open方法获取到beauties.xml文件的输入流
  17. InputStream is = this.getAssets().open("beauties.xml");
  18. //初始化自定义的实现类BeautyParserImpl
  19. BeautyParserImpl pbp = new BeautyParserImpl();
  20. //调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList
  21. beautyList = pbp.parse(is);
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. setupViews();
  26. }
  27. /**
  28. * 将数据显示到手机界面上
  29. */
  30. private void setupViews(){
  31. String result = "";
  32. for (Beauty b : beautyList) {
  33. result += b.toString();
  34. }
  35. TextView textView = (TextView) findViewById(R.id.textView);
  36. textView.setText(result);
  37. }
  38. }

我们右键运行一下android  project,结果截图如下:

完整的实例代码下载地址:

Android之PULL解析XML

使用PULL解析XML文件的更多相关文章

  1. 使用XML序列化器生成XML文件和利用pull解析XML文件

    首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...

  2. pull解析xml文件

    pull解析xml文件 先自己写一个xml文件,存一些天气信息 拿到xml文件 InputStream is = getClassLoader().getResourceAsStream(" ...

  3. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

  4. Android pull解析xml文件

    本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...

  5. android——使用pull解析xml文件

    1.persons.xml 将persons.xml文件放到src目录下.其代码如下: <?xml version='1.0' encoding='UTF-8' standalone='yes' ...

  6. [android] 采用pull解析xml文件

    /***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...

  7. Android SAX、DOM、Pull解析xml文件剖析与案例讲解

    XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ...

  8. Android中pull解析XML文件的简单使用

    首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐 ...

  9. android 生成、pull解析xml文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

随机推荐

  1. python发送邮件方法总结

    python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点.     一.相关模块介绍 发送邮件主要用到了smtplib和ema ...

  2. Decorator Pattern (装饰者模式)

    装饰者模式( Decorator Pattern ) 意图 : 动态的给一个对象添加一些额外的功能,IO这块内容体现出了装饰模式,Decorator模式相比生成子类更为灵活. 角色 : 1)抽象构件角 ...

  3. 基于Unity3D云人脸监測技术

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师.CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  4. Linux-yum在线安装svn步骤

    yum -y install subversion httpd mod_dav_svn 使用yum命令安装svn(subversion),httpd(apache服务器)和svn在apache上的插件 ...

  5. EMQ 学习---MQTT消息QoS

    MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的.订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS. 客户端连接: 客户端完成TCP三次握手之后,还需要发 ...

  6. ulipad python相关设置

    1)在ulipad下编写的python raw_input/input没有办法正确输出?(获取用户输入) 菜单栏->Python->设置参数->Parameters 处填入 -u

  7. VMware Workstation unrecoverable error: (vmx)虚拟机挂起后无法启动问题

    为了方便,虚拟机都是采用挂起状态,今天在启动虚拟机的时候出现如下提示错误: VMware Workstation unrecoverable error: (vmx)Exception 0xc0000 ...

  8. HDU 1695 GCD(容斥定理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. RBAC权限模型及数据权限扩展的实践

    话说大家对RBAC权限模型应该是耳熟能详了.但真正用的好的并不多.并且原始的RBAC模型并不包括数据权限的管理,网上也差点儿没有相关的文章可以參考.本人经过几个项目的实战,在其基础上扩展出一套可行的. ...

  10. GDKOI2016 爆零记

    滚粗了非常伤心>_< day 0 老师通知能够去试机,于是非常愉快地将近三点半左右的时间到了二中.然后发现老师已经准备关机房了,说我怎么才来.. .喂喂喂不是说三点半到五点的么 晚上本来想 ...