Android基于Pull方式解析xml的方法详解
程序员文章站
2024-03-05 22:31:07
本文实例讲述了android基于pull方式解析xml的方法。分享给大家供大家参考,具体如下:
pull解析和sax解析很相似,都是轻量级的解析,在android的内核中...
本文实例讲述了android基于pull方式解析xml的方法。分享给大家供大家参考,具体如下:
pull解析和sax解析很相似,都是轻量级的解析,在android的内核中已经嵌入了pull,所以我们不需要再添加第三方jar包来支持pull。
pull解析和sax解析不一样的地方有:
(1)pull读取xml文件后触发相应的事件调用方法返回的是数字
(2)pull可以在程序中控制想解析到哪里就可以停止解析。
来看看实例:
book.xml如下:
<?xml version="1.0" encoding="utf-8"?> <books> <book id="12"> <name>thinking in java</name> <price>85.5</price> </book> <book id="15"> <name>spring in action</name> <price>39.0</price> </book> </books>
pull解析的代码如下pullparseservice.java
import java.io.inputstream; import java.util.arraylist; import java.util.list; import org.xmlpull.v1.xmlpullparser; import android.util.xml; import com.xtlh.cn.entity.book; public class pullparseservice { public static list<book> getbooks(inputstream inputstream) throws exception{ list<book> books = null; book book = null; xmlpullparser parser = xml.newpullparser(); parser.setinput(inputstream, "utf-8"); int event = parser.geteventtype();//产生第一个事件 while(event!=xmlpullparser.end_document){ switch(event){ case xmlpullparser.start_document://判断当前事件是否是文档开始事件 books = new arraylist<book>();//初始化books集合 break; case xmlpullparser.start_tag://判断当前事件是否是标签元素开始事件 if("book".equals(parser.getname())){//判断开始标签元素是否是book book = new book(); book.setid(integer.parseint(parser.getattributevalue(0)));//得到book标签的属性值,并设置book的id } if(book!=null){ if("name".equals(parser.getname())){//判断开始标签元素是否是name book.setname(parser.nexttext()); }else if("price".equals(parser.getname())){//判断开始标签元素是否是price book.setprice(float.parsefloat(parser.nexttext())); } } break; case xmlpullparser.end_tag://判断当前事件是否是标签元素结束事件 if("book".equals(parser.getname())){//判断结束标签元素是否是book books.add(book);//将book添加到books集合 book = null; } break; } event = parser.next();//进入下一个元素并触发相应事件 }//end while return books; } }
里面使用到的book.java类
public class book { private int id; private string name; private float price; public int getid() { return id; } public void setid(int id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public float getprice() { return price; } public void setprice(float price) { this.price = price; } @override public string tostring(){ return this.id+":"+this.name+":"+this.price; } }
测试使用的是android的单元测试,代码如下:
import java.io.inputstream; import java.util.list; import android.test.androidtestcase; import android.util.log; import com.xtlh.cn.entity.book; import com.xtlh.cn.service.pullparseservice; public class testpullparseservice extends androidtestcase{ private static final string tag = "testpullparseservice"; public void testpull() throws exception{ inputstream input = this.getclass().getclassloader().getresourceasstream("book.xml"); pullparseservice pull = new pullparseservice(); list<book> books = pull.getbooks(input); for(book book : books){ log.i(tag,book.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.xlth.cn.demo" android:versioncode="1" android:versionname="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="android.test.runner" /> <activity android:name=".pullparsedemo" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> <uses-sdk android:minsdkversion="7" /> <instrumentation android:name="android.test.instrumentationtestrunner" android:targetpackage="com.xlth.cn.demo" android:label="tests for my app" /> </manifest>
pull解析可以用于很多场合,例如接受google天气,rss新闻等。
更多关于android相关内容感兴趣的读者可查看本站专题:《android操作xml数据技巧总结》、《android编程之activity操作技巧总结》、《android资源操作技巧汇总》、《android文件操作技巧汇总》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》、《android视图view技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。