Android--解析XML之PULL
前言
在上一篇博客已经介绍了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="">
<name >Jack</name>
<age></age>
</person>
<person id="">
<name>Dick</name>
<age></age>
</person>
</persons>
IIS服务器上的XML文件,使用的HTTPURLConnection的方式获得,具体参见另外一篇博客:http://www.cnblogs.com/plokmju/p/java-HTTP.html。这里就再重复给出。
新建一个Person类,用于存放通过XML解析之后的数据,只有三个字段id、name、age并提供对于的get()set()方法,还有toString()方法,这里不展示代码了。
以下是PullXML的解析类:
package cn.bgxt.parser; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; import cn.pull.domain.Person; public class PullXMLTools { public PullXMLTools() {
// TODO Auto-generated constructor stub
} /**
* 把服务器传递过的XML流数据解析成对象
* @param inputStream XML流
* @param encode 编码格式
* @return
*/
public static List<Person> parserXML(InputStream inputStream, String encode)
throws XmlPullParserException, IOException {
List<Person> list = null;
Person person = null;
//获得一个XMLPULL工厂类的实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//获得一个XML解析器的实例
XmlPullParser parser = factory.newPullParser();
//设置解析器的输入,使用inputStream流式数据。
parser.setInput(inputStream, encode);
//判断当前的事件类型
int eventType = parser.getEventType();
//循环读取,知道事件类型为文档结束
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
// 通过判断事件类型来选择执行不同的代码
case XmlPullParser.START_DOCUMENT:
//文档开始的时候,实例化list对象,用于存放XML解析后的数据
list=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
//读取标签的时候触发这个事件
if(parser.getName().equals("person"))
{
//如果当前读取到的节点是person节点,那么实例化一个person对象。
person=new Person();
//获得person节点中的属性ID
int id=Integer.parseInt(parser.getAttributeValue(0));
person.setId(id);
}
else if(parser.getName().equals("name"))
{
if(person!=null)
{
//获得name节点的下一个element Text
String name=parser.nextText();
person.setName(name);
}
}
else if(parser.getName().equals("age"))
{
if(person!=null)
{
//获得age节点的下一个element Text
int age=Integer.parseInt(parser.nextText());
person.setAge(age);
}
}
break;
case XmlPullParser.END_TAG:
if(parser.getName().equals("person"))
{
//读到结束节点标签,如果为person,则把之前读取到的person对象加入list中,
//并且制空person对象。
list.add(person);
person=null;
}
break;
}
//读取
eventType=parser.next();
}
return list;
} }
Activity中的代码,需要实现一个按钮的点击事件,因为是在Android4.0+的环境下,需要使用多线程访问网络。
package cn.bgxt.xmlforpull; import java.io.InputStream;
import java.util.List;
import cn.bgxt.Http.HttpUtils;
import cn.bgxt.parser.PullXMLTools;
import cn.pull.domain.Person;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
String path="http://192.168.1.107:1231/persons.xml";
InputStream inputStream=HttpUtils.getXML(path);
List<Person> list=null;
try {
list = PullXMLTools.parserXML(inputStream, "utf-8");
for(Person person:list)
{
System.out.println(person.toString());
}
} catch (Exception e) {
// TODO: handle exception
} }
});
thread.start();
}
});
} }
在设备上运行程序,如果读取成功,可以在LogCat中查看到输出内容。
提供一下示例程序的源码,有需要的朋友可以下载观看:http://download.csdn.net/detail/plokmju88/5640375
总结
现在已经说了两种在Android平台下解析XML的方式,分别是SAX和PULL,这两种方式都适用于Android平台,因为都是以流的形式访问数据,消耗的硬件资源小,速度快,但是也存在不同的适用环境。如果清楚的知道XML文档的结构,每一级节点的名称,那么使用PULL方式可以简化开发,但是如果不确定XML文档的结构,那还是使用SAX的方式比较妥当,无需关心各节点的名称。
请支持原创,尊重原创,转载请注明出处。谢谢。
Android--解析XML之PULL的更多相关文章
- Android解析XML(PULL方式)
PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...
- Android解析XML
在Android平台上可以使用Simple API for XML(SAX) . Document Object Model(DOM)和Android附带的pull解析器解析XML文件. 下面是本例子 ...
- android解析xml文件的方式
android解析xml文件的方式 作者:东子哥 ,发布于2012-11-26,来源:博客园 在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...
- Android解析xml文件-采用DOM,PULL,SAX三种方法解析
解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...
- [android]解析XML文件的方法有三种:PULL,DOM,SAM
PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocu ...
- Android 解析XML—pull解析方式
在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,其中PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部 ...
- android 解析XML方式(三)
上一节中,我们使用SAX方式解析xml文档, SAX方式是基于事件驱动的.当然android的事件机制是基于回调函数的.在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SA ...
- android 解析XML方式(一)
在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据呢? ...
- Android解析XML文件
XML文件和获取XML值 XML文件样例 <?xml version="1.0" encoding="utf-8"?> <citys> ...
随机推荐
- 将Paul替换成Ringo
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- java开发师笔试面试每日12题(3)
1.JDK和JRE的区别是什么? Java运行时环境(JRE)是将要执行Java程序的Java虚拟机.它同时也包含了执行applet需要的浏览器插件.Java开发工具包(JDK)是完整的Java软件开 ...
- 反编译看java for-each循环
java 1.5发行版引入的for-each循环.(引自<Effective Java>中文版第二版 第46条) 如以下对数组列表的for-each循环示例: public class F ...
- python2 python3区别
Python开发团队将在2020年1月1日停止对Python2.7的技术支持,但python2的库仍然比较强大(在 pip 官方下载源 pypi 搜索 Python2.7 和 Python3.5 的第 ...
- 我的C#跨平台之旅(二):开发最为简单的REST API
添加NuGet引用:Microsoft.AspNet.WebApi.Owin 在启动类启用WebApi: 添加一个Controller类,代码如下: 运行程序并访问:http://localhost: ...
- Git的分支管理
0.引言 本文参考最后的几篇文章,将git的分支管理整理如下.学习git的分支管理将可以版本进行灵活有效的控制. 1.如何建立与合并分支 1.1分支的新建与合并指令 新建分支 newBranch,并进 ...
- Asp.net Security框架(1)
Security框架主要用于身份认证的,基本上所有Asp.net项目有意或者无意的都在使用的,框架的源码包含在Katana项目下. 最常见的使用方式或许就是SignIn来给客户端浏览器生成包含身份信息 ...
- centos7安装git踩坑记
之前自己是按照Git 服务器搭建这篇博客来安装git服务器的,一步步顺序下来,但git clone的时候,每次都要求输入密码.说好的SSH免密登录呢.前后搞了一天多才搞定,现在记录下踩过的坑. 坑1: ...
- javascript之location详解
window.location.hash 使用说明 今天给大家详细汇总了关于window.location.hash的知识点,属性以及用法等等,非常的实用,并附上了例子,有需要的小伙伴可以参考下. l ...
- 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?
本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言 老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...