一、理论准备

    Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

    工程结构如下:

                     

    为什么把xml放在assets目录下呢,它和res/values目录的区别是系统不分配ID,好像没解决问题,暂时没查到资料。

二、上代码

package com.example.and_0003;

import java.io.InputStream;
import java.util.List;

import com.hpu.entity.Student;
import com.hpu.util.PullService;

import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AssetManager asset = getAssets();
        try {
            InputStream input = asset.open("student.xml");
            List<Student> list = PullService.getStudents(input);
            for (Student stu : list) {
                   Log.e("StudentInfo","Person ID: " + stu.getId() + ","
                         + stu.getName() + ", " + stu.getAge() + ", "
                         + stu.getSex());
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

  1: <?xml version="1.0" encoding="utf-8"?>
  2: <students>
  3:   <student id="20110806100">
  4:     <name>小明</name>
  5:     <age>22</age>
  6:     <sex>男</sex>
  7:   </student>
  8:   <student id="20110806101">
  9:     <name>小李</name>
 10:     <age>24</age>
 11:     <sex>男</sex>
 12:   </student>
 13:   <student id="20110806102">
 14:     <name>小丽</name>
 15:     <age>21</age>
 16:     <sex>女</sex>
 17:   </student>
 18: </students>

package com.hpu.entity;
public class Student { private String id;
private String name;
private int age;
private String sex; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} }

  1: package com.hpu.util;
  2:
  3: import java.io.InputStream;
  4: import java.util.ArrayList;
  5: import java.util.List;
  6:
  7: import org.xmlpull.v1.XmlPullParser;
  8: import org.xmlpull.v1.XmlPullParserFactory;
  9:
 10: import com.hpu.entity.Student;
 11:
 12: import android.util.Xml;
 13:
 14: public class PullService {
 15:
 16:   // 采用XmlPullParser来解析XML文件
 17:   public static List<Student> getStudents(InputStream inStream)
 18:       throws Throwable {
 19:     List<Student> students = null;
 20:     Student mStudent = null;
 21:
 22:     // ========创建XmlPullParser,有两种方式=======
 23:     // 方式一:使用工厂类XmlPullParserFactory
 24:     XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
 25:     XmlPullParser parser = pullFactory.newPullParser();
 26:     // 方式二:使用Android提供的实用工具类android.util.Xml
 27:     // XmlPullParser parser = Xml.newPullParser();
 28:
 29:     // 解析文件输入流
 30:     parser.setInput(inStream, "UTF-8");
 31:     // 产生第一个事件
 32:     int eventType = parser.getEventType();
 33:     // 只要不是文档结束事件,就一直循环
 34:     while (eventType != XmlPullParser.END_DOCUMENT) {
 35:       switch (eventType) {
 36:       // 触发开始文档事件
 37:       case XmlPullParser.START_DOCUMENT:
 38:         students = new ArrayList<Student>();
 39:         break;
 40:       // 触发开始元素事件
 41:       case XmlPullParser.START_TAG:
 42:         // 获取解析器当前指向的元素的名称
 43:         String name = parser.getName();
 44:         if ("student".equals(name)) {
 45:           // 通过解析器获取id的元素值,并设置student的id
 46:           mStudent = new Student();
 47:           mStudent.setId(parser.getAttributeValue(0));
 48:         }
 49:         if (mStudent != null) {
 50:           if ("name".equals(name)) {
 51:             // 获取解析器当前指向元素的下一个文本节点的值
 52:             mStudent.setName(parser.nextText());
 53:           }
 54:           if ("age".equals(name)) {
 55:             // 获取解析器当前指向元素的下一个文本节点的值
 56:             mStudent.setAge(new Short(parser.nextText()));
 57:           }
 58:           if ("sex".equals(name)) {
 59:             // 获取解析器当前指向元素的下一个文本节点的值
 60:             mStudent.setSex(parser.nextText());
 61:           }
 62:         }
 63:         break;
 64:       // 触发结束元素事件
 65:       case XmlPullParser.END_TAG:
 66:         //
 67:         if ("student".equals(parser.getName())) {
 68:           students.add(mStudent);
 69:           mStudent = null;
 70:         }
 71:         break;
 72:       default:
 73:         break;
 74:       }
 75:       eventType = parser.next();
 76:     }
 77:     return students;
 78:   }
 79:
 80: }
 81: 

四、运行结果

            

五、遗留问题及参考文献

    Dom和SAX和Pull的适用范围分别是什么?

              http://blog.csdn.net/cjjky/article/details/6667744

Android使用pull解析xml的更多相关文章

  1. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  2. Android中用PULL解析XML

    解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大 ...

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

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

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

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

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

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

  6. Android使用pull解析xml格式的数据

    dom解析:基于全文加载的解析方式   sax解析:基于事件的逐行解析方式  pull解析:同sax              XmlPullParser     //解析xml文件读取短信内容    ...

  7. 使用PULL解析XML文件

    转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...

  8. Android——PULL解析XML

    简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关 ...

  9. Android系列--DOM、SAX、Pull解析XML

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

随机推荐

  1. 转:Oracle EBS FND User Info API

    转自:http://www.cnblogs.com/quanweiru/p/3775635.html 1. 与用户信息相关API PKG. --和用户处理有关的API FND_USER_PKG; -- ...

  2. java 从String中匹配数字,并提取数字

    方法如下: private List<FieldList> GetTmpFieldsList(List<String> FieldsList,String tmptableNa ...

  3. T-SQL基础 (子查询,连接查询,交叉查询,事务|| 笔记0807)

    一: A.子查询: 1.select 字段名 from table where 字段名=(select 字段名 from table 条件)  //只能做1个匹配 2.select 字段名 from ...

  4. Log4Net 在多层项目中的使用小记

    原文地址:http://www.cnblogs.com/zdh8675/p/3645556.html 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用 ...

  5. 20160409 javaweb 数据库连接池

    1.自己编写数据库连接池: package com.dzq.pool; import java.io.PrintWriter; import java.lang.reflect.InvocationH ...

  6. 20151213Jquery学习笔记--插件

    插件(Plugin)也成为 jQuery 扩展(Extension),是一种遵循一定规范的应用程序接口编 写出来的程序.目前 jQuery 插件已超过几千种,由来自世界各地的开发者共同编写.验证 和完 ...

  7. AWK详细用法

    awk非常的优秀,运行效率高,而且代码简单,对格式化的文本处理能力超强.基本上grep和sed能干的活awk全部都能干,而且干得更好. 先来一个很爽的例子:文件a,统计文件a的第一列中是浮点数的行的浮 ...

  8. sublimeText3中 less2css error: `lessc` is not available的解决办法

    昨天在sublimeText3中安装了less 以及 less2css插件,但是在编译保存的时候总是出现错误: less2css error: `lessc` is not available 就go ...

  9. 在终端里使用 Solarized 配色方案

    在终端里使用 Solarized 配色方案 参考: 1.在 Mac OS X 终端里使用 Solarized 配色方案 2.solarized

  10. bzoj1007:[HNOI2008]水平可见直线

    思路:首先按斜率排序,如果斜率相同就取截距最大的,显然截距小的会被覆盖而对答案没有贡献,然后考虑斜率不同的如何统计答案,可以用一个单调栈维护,当前新插入的直线显然斜率是要比当前栈顶斜率要大的,然后如果 ...