转载博文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. CA证书服务器从2003迁移到2008 R2!

    1.在源 CA 服务器中备份相应的 CA :

  2. 1、第一个JSP

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...

  3. 分享阿里云SLB-负载均衡的实现基本原理架构

    负载均衡技术原理浅析 https://help.aliyun.com/knowledge_detail/39444.html?spm=5176.7839438.2.6.XBbX5l 阿里定制版的LVC ...

  4. Java 的抽象特性:抽象类与接口深度解析

    要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...

  5. 使用maven拆分项目

    在开发环境中,有时需要专人负责专门的模块,其他模块不需接触,这就需要将项目拆分,如下 fund_demo项目具有三个模块,现将主业务core模块单独提出另建一个项目fund_core,拆分时需要注意相 ...

  6. 基于UML的面向对象分析与设计

          前言      经常听到有朋友抱怨,说学了UML不知该怎么用,或者画了UML却觉得没什么作用.其实,就UML本身来说,它只是一种交流工具,它作为一种标准化交流符号,在OOA&D过程 ...

  7. fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏

    问题出现背景: 原本电脑里是装着VS2015的,其使用的是.NET 4.5,当再安装VS2010之后,不能与当前的.NET平台兼容.卸载VS2015时,不会恢复.NET 4.0. l 当VS2015安 ...

  8. 14条最佳JS代码编写技巧

    http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...

  9. [Asp.net]Calendar+JqueryUi实现日程管理——添加日程

    引言 之前在博客园里看到一篇文章,介绍的云日程,所以就一直在想如果是自己该如何实现,所以就自己尝试弄了一个简单的demo. 项目 效果图 日历控件,本来想弄一个js版的,后来考虑,js版的会花费更多的 ...

  10. XML相关转换

    1.将DataTable转换成xml字符串 //将DataTable转换成xml字符串: public string ConvertDataTableToXml(DataTable dt) { Mem ...