android pull,android pull解析

本文介绍了Android中XML的Pull解析与Sax解析的异同,着重讲解了Pull解析的使用方法。通过示例展示了如何从XML文件中解析书籍信息,并存储到Book对象中。还提供了一个单元测试用例来验证解析的正确性。Pull解析在处理XML数据时具有轻量级和可控性强的特点,常用于接收网络数据,如天气和RSS新闻。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

book.xml如下:

Xml代码 icon_star.png<?xmlversion ="1.0"encoding="UTF-8"?>

thinking in java

85.5

Spring in Action

39.0

Pull解析的代码如下PullParseService.java

Java代码 icon_star.pngimportjava.io.InputStream;

importjava.util.ArrayList;

importjava.util.List;

importorg.xmlpull.v1.XmlPullParser;

importandroid.util.Xml;

importcom.xtlh.cn.entity.Book;

publicclassPullParseService {

publicstaticList getBooks(InputStream inputStream)throwsException{

List books = null;

Book book = null;

XmlPullParser parser = Xml.newPullParser();

parser.setInput(inputStream, "UTF-8");

intevent = parser.getEventType();//产生第一个事件

while(event!=XmlPullParser.END_DOCUMENT){

switch(event){

caseXmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件

books = newArrayList();//初始化books集合

break;

caseXmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件

if("book".equals(parser.getName())){//判断开始标签元素是否是book

book = newBook();

book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id

}

if(book!=null){

if("name".equals(parser.getName())){//判断开始标签元素是否是name

book.setName(parser.nextText());

}elseif("price".equals(parser.getName())){//判断开始标签元素是否是price

book.setPrice(Float.parseFloat(parser.nextText()));

}

}

break;

caseXmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件

if("book".equals(parser.getName())){//判断结束标签元素是否是book

books.add(book);//将book添加到books集合

book = null;

}

break;

}

event = parser.next();//进入下一个元素并触发相应事件

}//end while

returnbooks;

}

}

里面使用到的Book.java类

Java代码 icon_star.pngpublicclassBook {

privateintid;

privateString name;

privatefloatprice;

publicintgetId() {

returnid;

}

publicvoidsetId(intid) {

this.id = id;

}

publicString getName() {

returnname;

}

publicvoidsetName(String name) {

this.name = name;

}

publicfloatgetPrice() {

returnprice;

}

publicvoidsetPrice(floatprice) {

this.price = price;

}

@Override

publicString toString(){

returnthis.id+":"+this.name+":"+this.price;

}

}

测试使用的是android的单元测试,代码如下:

Java代码 icon_star.pngimportjava.io.InputStream;

importjava.util.List;

importandroid.test.AndroidTestCase;

importandroid.util.Log;

importcom.xtlh.cn.entity.Book;

importcom.xtlh.cn.service.PullParseService;

publicclasstestPullParseServiceextendsAndroidTestCase{

privatestaticfinalString TAG ="testPullParseService";

publicvoidtestPull()throwsException{

InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");

PullParseService pull = newPullParseService();

List books = pull.getBooks(input);

for(Book book : books){

Log.i(TAG,book.toString());

}

}

}

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

Xml代码 icon_star.png<?xmlversion ="1.0"encoding="utf-8"?>

package="com.xlth.cn.demo"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

android:targetPackage="com.xlth.cn.demo"android:label="Tests for My App"/>

Pull解析可以用于很多场合,例如接受google天气,rss新闻等,希望对大家有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值