在Android中解析XML的方式有很多,我之前写过一篇Android中解析XML的文章(http://blog.csdn.net/afandaafandaafanda/article/details/41594835)及在JAVA中如何使用JDOM解析XML(http://blog.csdn.net/afandaafandaafanda/article/details/46699215),对于Android来说,需要找到一种对内存要求比较低的方式来解析XML。SAX及PULL是很好的选择,今天写了一个PULL解析XML的例子。

1.Model类:Person

package com.example.model;public class Person {private Integer id;private String name;private Short age;public Person(){}public Person(Integer id, String name, Short age) {this.id = id;this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}@Overridepublic String toString() {return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";}}

2.PULLPersonService

package com.wicresoft.service;import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.example.model.Person;
/*** 采用Pull解析XML内容*/
public class PULLPersonService {public static void save(List<Person> persons, Writer writer) throws Throwable{XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(writer);serializer.startDocument("UTF-8", true);serializer.startTag(null, "persons");for(Person person : persons){serializer.startTag(null, "person");serializer.attribute(null, "id", person.getId().toString());serializer.startTag(null, "name");serializer.text(person.getName());serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text(person.getAge().toString());serializer.endTag(null, "age");serializer.endTag(null, "person");}serializer.endTag(null, "persons");       serializer.endDocument();writer.flush();writer.close();}public static List<Person> getPersons(InputStream inStream) throws Throwable{List<Person> persons = null;Person person = null;XmlPullParser parser = Xml.newPullParser();parser.setInput(inStream, "UTF-8");int eventType = parser.getEventType();//产生第一个事件while(eventType != XmlPullParser.END_DOCUMENT){//只要不是文档结束事件switch (eventType) {case XmlPullParser.START_DOCUMENT:persons = new ArrayList<Person>();break;case XmlPullParser.START_TAG:String name = parser.getName();//获取解析器当前指向的元素的名称if("person".equals(name)){person = new Person();person.setId(Integer.valueOf(parser.getAttributeValue(0)));}if(person!=null){if("name".equals(name)){person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值}if("age".equals(name)){person.setAge(new Short(parser.nextText()));}}break;case XmlPullParser.END_TAG:if("person".equals(parser.getName())){persons.add(person);person = null;}break;}eventType = parser.next();}return persons;}
}

3.单元测试:PersonServiceTest

package com.example.myandroid_001;import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;import com.example.model.Person;
import com.wicresoft.service.PULLPersonService;import android.test.AndroidTestCase;
import android.util.Log;public class PersonServiceTest extends AndroidTestCase {private static final String TAG = "PersonServiceTest";public void testSave() throws Throwable{List<Person> persons = new ArrayList<Person>();persons.add(new Person(34, "lili", (short)12));persons.add(new Person(56, "zhang", (short)32));persons.add(new Person(39, "wang", (short)40));StringWriter writer = new StringWriter();PULLPersonService.save(persons, writer);Log.i(TAG, writer.toString());}public void testPullGetPersons() throws Throwable{InputStream inStream = getClass().getClassLoader().getResourceAsStream("person.xml");List<Person> persons = PULLPersonService.getPersons(inStream);for(Person person : persons){Log.i(TAG, person.toString());}}
}

3.person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons><person id="23"><name>liming</name><age>30</age></person><person id="20"><name>lixiangmei</name><age>25</age></person>
</persons>

总结:

PULL解析XML最大的特点在于使用了事件驱动机制,即遇到文档的开始或者结尾,都会触发相应的事件,用户根据触发的事件,做相应的相应。

Android PULL XML Praser相关推荐

  1. Android读写XML(上)

    XML 经常用作 Internet 上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,来说明Android SDK提供的读写XML的package. 首先介绍下Andro ...

  2. Android,XML解析

    XML解析三种方式 DOM 通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树.检索所需的数据: 简单直观,但需要将文档读取到内存,并不太适合移动设备: SAX ...

  3. Android中XML数据解析

    转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...

  4. Android实现XML解析技术 (转载http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html)...

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  5. Android实现XML解析技术

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  6. android操作XML的几种方式(转)

    XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现.其标准型,可靠性,安全性......毋庸置疑.在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml ...

  7. android 解析转义字符,Android常见XML转义字符(总结)

    Android常见XML转义字符(总结) 在安卓开发中我们经常会遇到一些特殊字符,这些特殊字符在程序中无法直接写,那么如何显示这些字符呢?这里就需要使用转义字符,所有编程语言,拥有转义字符的原因基本上 ...

  8. android 组装xml,Android中组装xml文件内容

    在Android开发中经常遇到组装xml格式数据的需求,下面是解决方法,希望给大家带来帮助. 下面这段xml文件内容是我们的需求. zhangsan 26 lisi 25 下面是组装xml文件内容的代 ...

  9. Android--应用开发3(Android layout XML属性)

    Android layout XML属性 转载:http://www.cnblogs.com/playing/archive/2011/04/07/2008620.html Layout对于迅速的搭建 ...

最新文章

  1. 如何将 Spring Boot Actuator 的指标信息输出到 InfluxDB 和 Prometheus
  2. 栈和队列的算法题总结
  3. 在京东、天猫、淘宝都存在情况下,为什么聚美还能崛起?
  4. group_concat 不是可以识别的 内置函数名称。_Python 函数库 APIs 编写指南
  5. react 动态路 嵌套动子路由_2020年,我是如何从一名Vueer转岗到React阵营
  6. linux 编译安装python,linux下编译安装python2.7.6
  7. C++_程序注释_以及_认识变量_输出变量_认识常量---C++语言工作笔记009
  8. JCL 清理 LOGREC 日志
  9. jni开发-java调用c函数,c调用java函数实现
  10. 面向面试编程-概念之-分布式与集群的区别和联系
  11. 管理感悟:学会推论及验证
  12. Win10 64bit安装VC6+VC6助手
  13. Win8驱动的兼容性问题
  14. Microbiome:鸡肠道微生物宏基因集的构建(张和平、魏泓、秦楠点评)
  15. 一个测试反应速度的小游戏
  16. 全网最后一个免费版本,永久可用
  17. 内网异地备份_用批处理实现局域网内的异地备份
  18. Laravel Excel实现Excel/CSV文件导入导出的功能详解(合并单元格,设置单元格样式)
  19. 解决方案:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to
  20. Git版本控制__分支管理

热门文章

  1. 服务器自定义npc音乐,Custom NPC 自定义NPC模组自定义音乐添加教程
  2. 海思芯片(hi3516dv300)uboot镜像生成过程详解
  3. jude(java建模软件)_JUDE(JAVA建模软件)
  4. 算法竞赛常见赛制及题目形式
  5. 使用 python 创建更改 word 文档
  6. 银河麒麟用QIFW制作安装包
  7. 程序设计C实验二题目一计算员工周工资
  8. 20年的嵌入式经验:如何从零开始开发一款嵌入式产品(值得收藏的高质量文章!)...
  9. 苹果语音输入最新资讯
  10. 创建springboot多模块项目(下)