前言

  在上一篇博客已经介绍了Android解析XML的几种方式,分别有:SAX、DOM、PULL。详细的可以看看上一篇博客:http://www.cnblogs.com/plokmju/p/android_XMLForSAX.html。这篇博客就介绍一下PULL解析XML。

  XMLPULL的一些特点:

  • 简单的接口:XMLPULL由一个接口(XmlPullParser)、一个例外(XmlPullParserException)、一个工厂(XmlPullParserFactory)来创建。
  • 易用性:只有一个关键的next()方法,用于检索下一事件。
  • 易扩展:使用通用的接口,并允许多个实现功能,具有更好的扩展性。
  • 性能:XMLPULL被设计为允许执行速度非常快的XML解析器。
  • 内存要求低:XMLPULL被设计为兼容J2ME,在小型设备上,解析XML时占用非常小的内存。

关键方法next()

  对于XMLPULL,只有一个关键的next()方法需要了解一下,它是用于检索下一个事件,并有五个事件,这五个分别是:

  • START_DOCUMENT:文档的开始,解析器尚未读取任何输入。
  • START_TAG:开始标签的解析。
  • TEXT:标签内元素的内容解析。
  • END_TAG:结束标签的解析。
  • END_DOCUMENT:文档的结束。

  虽然说关键方法只有一个用于检索下一事件的方法next(),但是还存在一些方法也可以检索下一事件,用于不同的情况下使用,如:nextText():用于检索下一元素的文本;nextTag():用于检索下一元素的标签。

XMLPULL的简单步骤

  • 需要建立一个XMLPULL解析器对象。通过XmlPullParserFactory对象得到解析器对象XmlPullParser。
  • 再使用XmlPullParser.setInput()方法设置解析器的输入。
  • 之后再通过判断事件类型,循环调用next()方法获得解析的数据。

  对于XmlPullParserFactory类,没有提供公开的构造方法(单例模式),必须使用它的静态方法newInstance()来获得对象实例。获得XmlPullParser必须使用XmlPullParserFactory.newPullParser()获得。

示例

  现在通过一个示例程序来讲解一下XMLPULL的使用。

  这是一个Android应用程序,需要增加访问网络的权限,解析IIS服务器上的一个静态的.XML文件。布局界面也比较简单,就是一个按钮,这里不展示代码了,具体的可以下载代码查看。

  待解析的XML文件内容:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <persons>
  3. <person id="">
  4. <name >Jack</name>
  5. <age></age>
  6. </person>
  7. <person id="">
  8. <name>Dick</name>
  9. <age></age>
  10. </person>
  11. </persons>

  IIS服务器上的XML文件,使用的HTTPURLConnection的方式获得,具体参见另外一篇博客:http://www.cnblogs.com/plokmju/p/java-HTTP.html。这里就再重复给出。

  新建一个Person类,用于存放通过XML解析之后的数据,只有三个字段id、name、age并提供对于的get()set()方法,还有toString()方法,这里不展示代码了。

  以下是PullXML的解析类:

  1. package cn.bgxt.parser;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7.  
  8. import org.xmlpull.v1.XmlPullParser;
  9. import org.xmlpull.v1.XmlPullParserException;
  10. import org.xmlpull.v1.XmlPullParserFactory;
  11.  
  12. import cn.pull.domain.Person;
  13.  
  14. public class PullXMLTools {
  15.  
  16. public PullXMLTools() {
  17. // TODO Auto-generated constructor stub
  18. }
  19.  
  20. /**
  21. * 把服务器传递过的XML流数据解析成对象
  22. * @param inputStream XML流
  23. * @param encode 编码格式
  24. * @return
  25. */
  26. public static List<Person> parserXML(InputStream inputStream, String encode)
  27. throws XmlPullParserException, IOException {
  28. List<Person> list = null;
  29. Person person = null;
  30. //获得一个XMLPULL工厂类的实例
  31. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  32. //获得一个XML解析器的实例
  33. XmlPullParser parser = factory.newPullParser();
  34. //设置解析器的输入,使用inputStream流式数据。
  35. parser.setInput(inputStream, encode);
  36. //判断当前的事件类型
  37. int eventType = parser.getEventType();
  38. //循环读取,知道事件类型为文档结束
  39. while (eventType != XmlPullParser.END_DOCUMENT) {
  40. switch (eventType) {
  41. // 通过判断事件类型来选择执行不同的代码
  42. case XmlPullParser.START_DOCUMENT:
  43. //文档开始的时候,实例化list对象,用于存放XML解析后的数据
  44. list=new ArrayList<Person>();
  45. break;
  46. case XmlPullParser.START_TAG:
  47. //读取标签的时候触发这个事件
  48. if(parser.getName().equals("person"))
  49. {
  50. //如果当前读取到的节点是person节点,那么实例化一个person对象。
  51. person=new Person();
  52. //获得person节点中的属性ID
  53. int id=Integer.parseInt(parser.getAttributeValue(0));
  54. person.setId(id);
  55. }
  56. else if(parser.getName().equals("name"))
  57. {
  58. if(person!=null)
  59. {
  60. //获得name节点的下一个element Text
  61. String name=parser.nextText();
  62. person.setName(name);
  63. }
  64. }
  65. else if(parser.getName().equals("age"))
  66. {
  67. if(person!=null)
  68. {
  69. //获得age节点的下一个element Text
  70. int age=Integer.parseInt(parser.nextText());
  71. person.setAge(age);
  72. }
  73. }
  74. break;
  75. case XmlPullParser.END_TAG:
  76. if(parser.getName().equals("person"))
  77. {
  78. //读到结束节点标签,如果为person,则把之前读取到的person对象加入list中,
  79. //并且制空person对象。
  80. list.add(person);
  81. person=null;
  82. }
  83. break;
  84. }
  85. //读取
  86. eventType=parser.next();
  87. }
  88. return list;
  89. }
  90.  
  91. }

  Activity中的代码,需要实现一个按钮的点击事件,因为是在Android4.0+的环境下,需要使用多线程访问网络。

  1. package cn.bgxt.xmlforpull;
  2.  
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import cn.bgxt.Http.HttpUtils;
  6. import cn.bgxt.parser.PullXMLTools;
  7. import cn.pull.domain.Person;
  8. import android.os.Bundle;
  9. import android.app.Activity;
  10. import android.view.Menu;
  11. import android.view.View;
  12. import android.widget.Button;
  13.  
  14. public class MainActivity extends Activity {
  15.  
  16. private Button btn;
  17.  
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22.  
  23. btn=(Button)findViewById(R.id.btn);
  24.  
  25. btn.setOnClickListener(new View.OnClickListener() {
  26.  
  27. @Override
  28. public void onClick(View v) {
  29. // TODO Auto-generated method stub
  30. Thread thread=new Thread(new Runnable() {
  31. @Override
  32. public void run() {
  33. String path="http://192.168.1.107:1231/persons.xml";
  34. InputStream inputStream=HttpUtils.getXML(path);
  35. List<Person> list=null;
  36. try {
  37. list = PullXMLTools.parserXML(inputStream, "utf-8");
  38. for(Person person:list)
  39. {
  40. System.out.println(person.toString());
  41. }
  42. } catch (Exception e) {
  43. // TODO: handle exception
  44. }
  45.  
  46. }
  47. });
  48. thread.start();
  49. }
  50. });
  51. }
  52.  
  53. }

  在设备上运行程序,如果读取成功,可以在LogCat中查看到输出内容。

  提供一下示例程序的源码,有需要的朋友可以下载观看:http://download.csdn.net/detail/plokmju88/5640375

总结

  现在已经说了两种在Android平台下解析XML的方式,分别是SAX和PULL,这两种方式都适用于Android平台,因为都是以流的形式访问数据,消耗的硬件资源小,速度快,但是也存在不同的适用环境。如果清楚的知道XML文档的结构,每一级节点的名称,那么使用PULL方式可以简化开发,但是如果不确定XML文档的结构,那还是使用SAX的方式比较妥当,无需关心各节点的名称。

  请支持原创,尊重原创,转载请注明出处。谢谢。

Android--解析XML之PULL的更多相关文章

  1. Android解析XML(PULL方式)

    PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...

  2. android解析XML总结(SAX、Pull、Dom三种方式) <转载>

    android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...

  3. Android解析XML

    在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...

  4. android解析xml文件的方式

    android解析xml文件的方式   作者:东子哥 ,发布于2012-11-26,来源:博客园   在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...

  5. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

  6. [android]解析XML文件的方法有三种:PULL,DOM,SAM

    PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...

  7. Android 解析XML—pull解析方式

    在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,其中PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部 ...

  8. android 解析XML方式(三)

    上一节中,我们使用SAX方式解析xml文档, SAX方式是基于事件驱动的.当然android的事件机制是基于回调函数的.在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SA ...

  9. android 解析XML方式(一)

    在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据呢? ...

  10. Android解析XML文件

    XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...

随机推荐

  1. require.js模块化

    require.js简单来说就是把js代码分装模块化了 模块化 模块就是实现特定功能的一组方法.只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块. 我拿一个运动框架来解释一下req ...

  2. squid 透明代理配置

    阿铭在教程中已经介绍过squid的安装和配置,http://study.lishiming.net/chapter22.html 教程中只介绍了初级的正向代理和反向代理,这篇文档将要介绍透明代理如何配 ...

  3. mui getJSON实现jsonp跨域

    //刚开始做APP的时候,后台给的方式是jsonp,然后就百度mui框架的jsonp跨域,看了好多文章,都说可以支持,但是大部分都是直接把别人复制来的,都不知道是不是真的能支持,做好打包完的时候,下载 ...

  4. Paper | Octave Convolution(OctConv)

    目录 1. 尺度空间理论(scale-space theory) 2. OctConv 3. 启发 论文:Drop an Octave: Reducing Spatial Redundancy in ...

  5. HDU 2516 斐波那契博弈

    点这里去看题 n为斐波那契数时,先手败,推断方法见算法讲堂 #include<bits/stdc++.h> using namespace std; int main() { ],i,n, ...

  6. Java 8 特性

    1.简介 毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程 ...

  7. VS2017 处理 Rdlc , microsoft report viewer 轻量级报表处理(WPF CS客户端版本)

    VS 2017没有安装处理Rdlc的包,需要手动安装: 点击主菜单中Tools 下拉菜单中 扩展和升级: 点选左侧Online  ,然后在右侧输入rdlc进行查询,然后 Download 下载安装 M ...

  8. Python环境安装及IDE介绍

    因为最近时间比较松散,公司的业务也不多,所以想趁机赶紧投入到人工智能的学习大业当中.经过多次比较,看到目前市面上还是使用Python做为基础语言较多,进儿学习算法.人工智能组件.机器学习.数据挖掘等课 ...

  9. Java学习前知识补充

    1  Java  面向对象的编程语言:为了实现人机交互需要语言的过渡(翻译)这时就需要Java虚拟机! 不同系统需要不同的虚拟机 2  学习语言第一件事 搭建环境(运行 Java需要的环境) 在甲骨文 ...

  10. SQL Server 自动循环归档分区数据脚本

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/表分区 概述 在很多业务场景下我们需要对一些记录量比较大的表进行分区,同时为了保证性能需要将一些旧的数据进行归档.在分区表很多的情 ...