Android

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

book.xml如下:

Xml代码

<?xmlversion="1.0"encoding="UTF-8"?>

<books>

<bookid="12">

<name>thinkinginjava</name>

<price>85.5</price>

</book>

<bookid="15">

<name>SpringinAction</name>

<price>39.0</price>

</book>

</books>

Pull解析的代码如下PullParseService.java

Java代码

importjava.io.InputStream;

importjava.util.ArrayList;

importjava.util.List;

importorg.xmlpull.v1.XmlPullParser;

importandroid.util.Xml;

importcom.xtlh.cn.entity.Book;

publicclassPullParseService{

publicstaticList<Book>getBooks(InputStreaminputStream)throwsException{

List<Book>books=null;

Bookbook=null;

XmlPullParserparser=Xml.newPullParser();

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

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

while(event!=XmlPullParser.END_DOCUMENT){

switch(event){

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

books=newArrayList<Book>();//初始化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();//进入下一个元素并触发相应事件

}//endwhile

returnbooks;

}

}

里面使用到的Book.java类

Java代码

publicclassBook{

privateintid;

privateStringname;

privatefloatprice;

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicfloatgetPrice(){

returnprice;

}

publicvoidsetPrice(floatprice){

this.price=price;

}

@Override

publicStringtoString(){

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

}

}

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

Java代码

importjava.io.InputStream;

importjava.util.List;

importandroid.test.AndroidTestCase;

importandroid.util.Log;

importcom.xtlh.cn.entity.Book;

importcom.xtlh.cn.service.PullParseService;

publicclasstestPullParseServiceextendsAndroidTestCase{

privatestaticfinalStringTAG="testPullParseService";

publicvoidtestPull()throwsException{

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

PullParseServicepull=newPullParseService();

List<Book>books=pull.getBooks(input);

for(Bookbook:books){

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

}

}

}

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

Xml代码

<?xmlversion="1.0"encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.xlth.cn.demo"

android:versionCode="1"

android:versionName="1.0">

<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">

<uses-libraryandroid:name="android.test.runner"/>

<activityandroid:name=".PullParseDemo"

android:label="@string/app_name">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

<uses-sdkandroid:minSdkVersion="7"/>

<instrumentationandroid:name="android.test.InstrumentationTestRunner"

android:targetPackage="com.xlth.cn.demo"android:label="TestsforMyApp"/>

</manifest>

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