转载博文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. 区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理【转】

    基于HTML5的PACS--图像伪彩 摘要: 要查看此系统更多的图像处理功能请参考:区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理套用句广告语:哪里不会点哪里,so e ...

  2. UNIX网络编程读书笔记:地址操纵函数

    地址格式转换函数:它们在ASCII字符串(人们比较喜欢用的格式)与网络字节序的二进制值(此值存于套接口地址结构中)间转换地址. 1.inet_aton.inet_addr.inet_ntoa inet ...

  3. SLAX初体验

    Slax是一个便捷.便携的Linux操作系统.它的界面既充满时尚感,又可基于不同模块的功能运作.它的界面富有时尚感,并集成了不同的模块的界面.尽 管它的容量十分娇小,Slax依然预载了不少日常应用的软 ...

  4. QtGui.QSplitter

    A QtGui.QSplitter lets the user control the size of child widgets by dragging the boundary between t ...

  5. QtGui.QPixmap

    A QtGui.QPixmap is one of the widgets used to work with images. It is optimized for showing images o ...

  6. alitomcat maven以及Autoconfig

    maven概述 Maven的核心是POM(Project Object Model),即项目对象模型.最直观的,maven对项目依赖进行统一的管理,让开发者从纷杂错乱的jar包世界摆脱出来,更加专注于 ...

  7. mysql 5.5安装手记

    从MySQL5.5 开始就要用cmake安装,本次安装的版本为mysql-5.5.22.tar.gz #准备工作 yum install -y gcc gcc-c++ libtool autoconf ...

  8. javascript 获取页面尺寸/位置

    ************************************************************************//ie中如果全部不给定值则会都为零(宽和高在设置一个的 ...

  9. 【LeetCode】94. Binary Tree Inorder Traversal (3 solutions)

    Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...

  10. 使用vs调试.net源代码

    使用.NET Framework库参考源进行调试 您可能会想知道使用.NET Framework参考源的调试方式.在下面的示例中,您将看到一个我调用公用Console.WriteLine方法的工具.从 ...