Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。下面看我自己做的demo,来跟大家讲解下:

xml代码:

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="20">
<name>zhangqian</name>
<age>20</age>
</person>
<person id="23">
<name>zhangmeili</name>
<age>23</age>
</person>
</persons>
<?xml version="1.0" encoding="UTF-8"?>  这是xml头文件 也叫做start document
<persons>这是xml节点(element)  xml节点有两种类型(Node Type)1,element 2,text(就是上个element和下一个element之间称作文本类型)

通过对XML文件的大致特征,我们首先要建立一个javabean,建在一个domian包下,代码如下
package com.example.domian;

public class Person {

    private Integer id;
private String name;
private Integer 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Person(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person(){} }

下面我们要开始处理业务层,对xml文件进行解析了,建在service包下,代码如下

package com.example.service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; import com.example.domian.Person; public class PersonService {
public static List<Person> getPerson(InputStream xml) throws Exception {
List<Person> persons =null;
Person person = null;
XmlPullParser pullParse = Xml.newPullParser();
pullParse.setInput(xml,"UTF-8");
int event = pullParse.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break; case XmlPullParser.START_TAG :
if("person".equals(pullParse.getName())){
int id =new Integer(pullParse.getAttributeValue(0));
person = new Person();
person.setId(id);
}
if("name".equals(pullParse.getName())){
String name = pullParse.nextText();
person.setName(name);
}
if("age".equals(pullParse.getName())){
int age = new Integer(pullParse.nextText());
person.setAge(age);
} break; case XmlPullParser.END_TAG :
if("person".equals(pullParse.getName())){
persons.add(person);
person = null;
} break;
}
event = pullParse.next(); }
return persons;
}
}

下面我们要对解析的方法是否正确,进行测试,写一个测试类,建立一个test包,代买如下

package com.example.test;

import java.io.InputStream;
import java.util.List; import com.example.domian.Person;
import com.example.service.PersonService; import android.test.AndroidTestCase;
import android.util.Log; public class TestPersonService extends AndroidTestCase {
private static final String TAG = "TestPersonService";
public void testPerson() throws Exception{
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PersonService.getPerson(xml);
for(Person person:persons){
Log.i(TAG, person.toString());
}
} }

要使用android的单元测试,需要在AndroidManifest.xml文件中加入声明,AndroidManifest.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xml"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="17" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.xml.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="android.test.runner"/> //主要配置这条
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner" android:label="Tests for My APP" android:targetPackage="com.example.xml"></instrumentation>
//主要配置这条
</manifest>

看JUnit 是否正确,绿色代表成功,红色代表失败

如图所示 成功!

看logcat日志,看运行结果!如图

很高兴和大家分享,如有什么问题及时和我交流,我会尽快回复。版权所有,如转载请注明出处http://www.cnblogs.com/jianrong-zheng/p/3548053.html谢谢!




android之xmlpullparse解析器的更多相关文章

  1. Android -------- 用XmlPullParser解析器解析XML文件

  2. 黎活明8天快速掌握android视频教程--15_采用Pull解析器解析和生成XML内容

    1.该项目主要有下面的两个作用 (1)将xml文件解析成对象的List对象,xml文件可以来自手机本地,也可以来自服务器返回的xml数据 (2)强list对象保存成xml文件,xml保存到手机的内存卡 ...

  3. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  4. android XML解析器全解案例

    1.使用pull解析 package com.example.myxml; import java.io.InputStream; import java.util.ArrayList; import ...

  5. Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)

    1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

  6. Android XML解析器的问题

    最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串 ...

  7. Android Multimedia框架总结(八)Stagefright框架之AwesomePlayer及数据解析器

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52503057 前言:前面一篇分析了medi ...

  8. Android开发8——利用pull解析器读写XML文件

    一.基本介绍 对XML解析有SAX和DOM等多种方式,Android中极力推荐xmlpull方式解析xml.xmlpull不仅可用在Android上同样也适用于javase,但在javase环境中需自 ...

  9. Android解析XML之SAX解析器

    SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...

随机推荐

  1. stella mccartney falabella foldover tote a few eye observed

    Lately, the particular Heyuan City Courtroom retrial, in order to commit the criminal offense of cou ...

  2. AngularJs的UI组件ui-Bootstrap分享(一)

    最近几个月学习了AngularJs和扩展的UI组件,并在公司小组内做了一次分享交流,感觉很有收获,在此记录下个人的学习心得. 目录: AngularJs的UI组件ui-Bootstrap分享(一) A ...

  3. jquery checkbox实例

    <!DOCTYPE html><html> <head><meta charset="utf-8" /><title>& ...

  4. VMware-workstation-full-12.0.0-2985596&VMware-player-12.0.0-2985596

    VMware-workstation-full-12.0.0-2985596 永久KEY:YV3D2-A0D50-481XP-KPNGE-ZV2ZF VMware-player-12.0.0-2985 ...

  5. 【iCore2 模块相关资料】iM_LAN 100M 以太网模块UDP例程

    ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:h ...

  6. 对“Git”认知。

    并没有接触过这个名词,相信在今后的学习和生活中会接触.不过在网上大致看了一下,应该是一种类似于后台控制的系统吧,希望以后自己会了解这个陌生的东西(软件?系统?程序?).

  7. iOS保存cookie的方法

    SURLRequest*request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/ ...

  8. 好久没写Blog了

    上一年的经历: <炸年兽>搞了一阵后,美术去创业了.. 和另一个美术断断续续,做了个<斗战圣佛>,挺山寨的,都没敢跟别人说. 不管怎么说也算是自己上了一个appStore的游戏 ...

  9. SQL Server 2005 处理交叉表

    假设有一个表如下: 日期 时间 售货金额 2006-01-02 早上 50 2006-01-02 中午 20 2006-01-02  晚上 30 2006-01-02 零晨 40 2006-01-03 ...

  10. C语言格式化输入不定长数组

    先随便写写,有空再整理. 直接贴代码 #include <stdio.h> #include <stdlib.h> //从一行标准输入中格式化输入一个不定长数组 void in ...