Android

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上一些方法的区别和用法的注意事项
  2. "Failed to fetch URL https://dl-ssl.google.com/android/repos
  3. Android(安卓)P SystemUI之StatusBar UI布局status_bar.xml解析
  4. Android开发者实用代码片段 与大家分享
  5. android通过ksoap2对webservice的解析
  6. Android:使用OkHttp解析Json遇到的坑
  7. Android最全面试题库(转)
  8. [android]在上下文菜单的选中事件中获取列表选中的元素
  9. android上一些方法的区别和用法的注意事项

随机推荐

  1. xml学习(1)xml的几种文件格式
  2. XML—XML解析之DOM
  3. XML Http Request最新替代技术—— Fetch
  4. Java&Xml教程(十一)JAXB实现XML与Java对象
  5. php使用simplexml来解析xml
  6. Java对象、Json、Xml转换工具Jackson使用
  7. XML—XML文件约束之DTD详解
  8. 疯狂XML学习笔记(13)---------XML DOM
  9. Java&Xml教程(十)XML作为属性文件使用
  10. XML—XML介绍和基本语法