Android Pull解析xml

本文出自:http://www.iteye.com/topic/763949

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

book.xml如下:

Xml代码 收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <books>
  3. <bookid="12">
  4. <name>thinkinginjava</name>
  5. <price>85.5</price>
  6. </book>
  7. <bookid="15">
  8. <name>SpringinAction</name>
  9. <price>39.0</price>
  10. </book>
  11. </books>

Pull解析的代码如下PullParseService.java

Java代码 收藏代码
  1. importjava.io.InputStream;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importorg.xmlpull.v1.XmlPullParser;
  5. importandroid.util.Xml;
  6. importcom.xtlh.cn.entity.Book;
  7. publicclassPullParseService{
  8. publicstaticList<Book>getBooks(InputStreaminputStream)throwsException{
  9. List<Book>books=null;
  10. Bookbook=null;
  11. XmlPullParserparser=Xml.newPullParser();
  12. parser.setInput(inputStream,"UTF-8");
  13. intevent=parser.getEventType();//产生第一个事件
  14. while(event!=XmlPullParser.END_DOCUMENT){
  15. switch(event){
  16. caseXmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件
  17. books=newArrayList<Book>();//初始化books集合
  18. break;
  19. caseXmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件
  20. if("book".equals(parser.getName())){//判断开始标签元素是否是book
  21. book=newBook();
  22. book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id
  23. }
  24. if(book!=null){
  25. if("name".equals(parser.getName())){//判断开始标签元素是否是name
  26. book.setName(parser.nextText());
  27. }elseif("price".equals(parser.getName())){//判断开始标签元素是否是price
  28. book.setPrice(Float.parseFloat(parser.nextText()));
  29. }
  30. }
  31. break;
  32. caseXmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件
  33. if("book".equals(parser.getName())){//判断结束标签元素是否是book
  34. books.add(book);//将book添加到books集合
  35. book=null;
  36. }
  37. break;
  38. }
  39. event=parser.next();//进入下一个元素并触发相应事件
  40. }//endwhile
  41. returnbooks;
  42. }
  43. }

里面使用到的Book.java类

Java代码 收藏代码
  1. publicclassBook{
  2. privateintid;
  3. privateStringname;
  4. privatefloatprice;
  5. publicintgetId(){
  6. returnid;
  7. }
  8. publicvoidsetId(intid){
  9. this.id=id;
  10. }
  11. publicStringgetName(){
  12. returnname;
  13. }
  14. publicvoidsetName(Stringname){
  15. this.name=name;
  16. }
  17. publicfloatgetPrice(){
  18. returnprice;
  19. }
  20. publicvoidsetPrice(floatprice){
  21. this.price=price;
  22. }
  23. @Override
  24. publicStringtoString(){
  25. returnthis.id+":"+this.name+":"+this.price;
  26. }
  27. }

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

Java代码 收藏代码
  1. importjava.io.InputStream;
  2. importjava.util.List;
  3. importandroid.test.AndroidTestCase;
  4. importandroid.util.Log;
  5. importcom.xtlh.cn.entity.Book;
  6. importcom.xtlh.cn.service.PullParseService;
  7. publicclasstestPullParseServiceextendsAndroidTestCase{
  8. privatestaticfinalStringTAG="testPullParseService";
  9. publicvoidtestPull()throwsException{
  10. InputStreaminput=this.getClass().getClassLoader().getResourceAsStream("book.xml");
  11. PullParseServicepull=newPullParseService();
  12. List<Book>books=pull.getBooks(input);
  13. for(Bookbook:books){
  14. Log.i(TAG,book.toString());
  15. }
  16. }
  17. }

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

Xml代码 收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.xlth.cn.demo"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7. <uses-libraryandroid:name="android.test.runner"/>
  8. <activityandroid:name=".PullParseDemo"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <actionandroid:name="android.intent.action.MAIN"/>
  12. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  13. </intent-filter>
  14. </activity>
  15. </application>
  16. <uses-sdkandroid:minSdkVersion="7"/>
  17. <instrumentationandroid:name="android.test.InstrumentationTestRunner"
  18. android:targetPackage="com.xlth.cn.demo"android:label="TestsforMyApp"/>
  19. </manifest>
Pull解析可以用于很多场合,例如接受google天气,rss新闻等,希望对大家有帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值