---------------------如有兴趣,请加AndroidQQ群242431704,500人的超级群,欢迎各位的加入--------------

---------------------如有兴趣,请加AndroidQQ群242431704,500人的超级群,欢迎各位的加入--------------




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新闻等,希望对大家有帮助!

更多相关文章

  1. android平台解析epub格式的书籍信息
  2. Android界面基本属性
  3. Android的事件转递机制
  4. Android(安卓)dumpstate 工具解析
  5. android的五大布局详解
  6. Android(安卓)Notification通知栏、点击事件、悬浮通知的简单实
  7. android 布局实例解析 柱状图效果
  8. Android(安卓)事件触发机制
  9. Android热插拔事件处理流程--Vold

随机推荐

  1. Android NDK: Are you sure your NDK_MOD
  2. Android(安卓)之 按两次关闭窗口
  3. android去除标题栏和状态栏
  4. Unity Android Callback
  5. Flutter——flutter版本升级到1.2.1后遇
  6. Error: Failed to find 'ANDROID_HOME' e
  7. Android中的onCreateOptionsMenu()方法和on
  8. 升级到 Android Studio 3.0 + Gradle 4.1
  9. 【android】RxJava原理简述
  10. so文件静态分析&&Android录屏技术