前言

  在上一篇博客已经介绍了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文件内容:

<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="23">
<name >Jack</name>
<age>21</age>
</person>
<person id="20">
<name>Dick</name>
<age>23</age>
</person>
</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的方式比较妥当,无需关心各节点的名称。

本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_XMLForPull.html,如需转载请自行联系原作者

Android--解析XML之PULL相关推荐

  1. android解析XML总结(SAX、Pull、Dom三种方式)

    在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式. 今天解析的xml示例(channels.xml)如下: 1 <?xml v ...

  2. Android解析XML三种方式(PULL、SAX、DOM)

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  3. Android解析XML的三种方式

    在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式. 如图: 本篇博 ...

  4. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  5. Android解析XML文件

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

  6. xml解析 只有节点属性 android,and android:解析xml,一个节点标签中,有多个属性,怎样解析?...

    定义好对象关系的类. 解析以Course为例子 public static List getCourseList(InputStream stream){ List list=new ArrayLis ...

  7. Android解析xml文件获取数据练习

    前几天单词app中,已经可以显示单词了,对比有道词典的单词表,主要是有单词备注的功能,可以进行联想记忆,而且程序占用空间小,没有太多的通知信息. 以前使用有道词典的单词保存了一些单词,有道里的单词可以 ...

  8. android解析xml文件思维导图,xmind思维导图格式转化xml格式

    前期准备 1 xmind 文件 2 python环境 3 pip 步骤: 1 升级pip:python3 -m pip install --upgrade pip 2 安装插件:pip3 instal ...

  9. Android之解析XML总结(SAX、Pull、Dom三种方式)

    常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一 ...

  10. convert android layout xml,详解Android之解析XML文件三种方式(DOM,PULL,SAX)

    1.xml文件代码 ${fq.content} ${fq.time} 2.XML网页效果图 3.Android代码 1.布局文件 xmlns:tools="http://schemas.an ...

最新文章

  1. python3并发编程基础
  2. linux一个进程通知另外一个进程,Linux进程通信学习笔记
  3. 南京金陵中学2021高考成绩查询,2021高考成绩出炉 南京各大高中喜报来了!
  4. 2017年软件工程第七次作业-每周例行报告
  5. JDK源码解析-Collection.iterator方法
  6. 阿里云物联网生活平台简介
  7. IOS(objective-c)实现md5加密(32位小写)的工具类
  8. springbot集成finereport后在web中使用iframe引用报表
  9. OAuth 2.0攻击方法及案例总结
  10. c语言实践教程实验题答案,C语言课后实验教程习题答案
  11. JavaScript是如何工作的:Web推送通知的机制
  12. Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405
  13. Yii集成PHPWord
  14. win10开始菜单添加磁贴_Windows 10开始菜单磁贴美化教程
  15. python源码剖析, 第0部分 -- 编译python
  16. jersey restful 测试_Jersey 开发RESTful(七)Jersey快速入门
  17. 【NLP】文本分类算法-基于字符级的无词嵌入双向循环神经网络(双向 GRU)
  18. 【贪玩巴斯】一文通过操作实例——学会 知网专业检索 2022年3月21日
  19. LaTex学习-安装
  20. 天空灰蒙蒙的,心情有点像这天气

热门文章

  1. C/C++中存储类型
  2. 模拟器真机环境_Appium+python自动化(二)- 环境搭建—下(超详解)
  3. 【pwnable】asm之write up
  4. SolrQuery的使用
  5. angular2 学习二 最简单的模板
  6. 「追根溯源」Ruby数组的uniq方法
  7. WdOS系统上samba服务的基本配置
  8. 浅谈Dynamic 关键字系列之二:调用属性,方法,字段
  9. Java——String类中的compareTo方法总结
  10. mysql 执行sql导出表格形式