Android

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

book.xml如下:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <books>  

  3.     <book id="12">  

  4.         <name>thinking in javaname>  

  5.         <price>85.5price>  

  6.     book>  

  7.     <book id="15">  

  8.         <name>Spring in Actionname>  

  9.         <price>39.0price>  

  10.     book>  

  11. books>  

 

Pull解析的代码如下PullParseService.java

Java代码  

  1. import java.io.InputStream;  

  2. import java.util.ArrayList;  

  3. import java.util.List;  

  4.   

  5. import org.xmlpull.v1.XmlPullParser;  

  6.   

  7. import android.util.Xml;  

  8.   

  9. import com.xtlh.cn.entity.Book;  

  10.   

  11. public class PullParseService {  

  12.     public static List getBooks(InputStream inputStream) throws Exception{  

  13.         List books = null;  

  14.         Book book = null;  

  15.         XmlPullParser parser = Xml.newPullParser();  

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

  17.           

  18.         int event = parser.getEventType();//产生第一个事件  

  19.         while(event!=XmlPullParser.END_DOCUMENT){  

  20.             switch(event){  

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

  22.                 books = new ArrayList();//初始化books集合  

  23.                 break;  

  24.             case XmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件  

  25.                 if("book".equals(parser.getName())){//判断开始标签元素是否是book  

  26.                     book = new Book();  

  27.                     book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id  

  28.                 }  

  29.                 if(book!=null){  

  30.                     if("name".equals(parser.getName())){//判断开始标签元素是否是name  

  31.                         book.setName(parser.nextText());  

  32.                     }else if("price".equals(parser.getName())){//判断开始标签元素是否是price  

  33.                         book.setPrice(Float.parseFloat(parser.nextText()));  

  34.                     }  

  35.                 }  

  36.                 break;  

  37.             case XmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件  

  38.                 if("book".equals(parser.getName())){//判断结束标签元素是否是book  

  39.                     books.add(book);//将book添加到books集合  

  40.                     book = null;  

  41.                 }  

  42.                 break;  

  43.             }  

  44.             event = parser.next();//进入下一个元素并触发相应事件  

  45.         }//end while  

  46.         return books;  

  47.     }  

  48. }  

 里面使用到的Book.java类

Java代码  

  1. public class Book {  

  2.     private int id;  

  3.     private String name;  

  4.     private float price;  

  5.     public int getId() {  

  6.         return id;  

  7.     }  

  8.     public void setId(int id) {  

  9.         this.id = id;  

  10.     }  

  11.     public String getName() {  

  12.         return name;  

  13.     }  

  14.     public void setName(String name) {  

  15.         this.name = name;  

  16.     }  

  17.     public float getPrice() {  

  18.         return price;  

  19.     }  

  20.     public void setPrice(float price) {  

  21.         this.price = price;  

  22.     }  

  23.     @Override  

  24.     public String toString(){  

  25.         return this.id+":"+this.name+":"+this.price;  

  26.     }  

  27. }  

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

Java代码  

  1. import java.io.InputStream;  

  2. import java.util.List;  

  3.   

  4. import android.test.AndroidTestCase;  

  5. import android.util.Log;  

  6.   

  7. import com.xtlh.cn.entity.Book;  

  8. import com.xtlh.cn.service.PullParseService;  

  9.   

  10. public class testPullParseService extends AndroidTestCase{  

  11.     private static final String TAG = "testPullParseService";  

  12.     public void testPull() throws Exception{  

  13.         InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");  

  14.         PullParseService pull = new PullParseService();  

  15.         List books = pull.getBooks(input);  

  16.         for(Book book : books){  

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

  18.         }  

  19.     }  

  20. }  

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

Xml代码  

  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  

  3.       package="com.xlth.cn.demo"  

  4.       android:versionCode="1"  

  5.       android:versionName="1.0">  

  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  

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

  8.         <activity android:name=".PullParseDemo"  

  9.                   android:label="@string/app_name">  

  10.             <intent-filter>  

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

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

  13.             intent-filter>  

  14.         activity>  

  15.   

  16.     application>  

  17.     <uses-sdk android:minSdkVersion="7" />  

  18.     <instrumentation android:name="android.test.InstrumentationTestRunner"  

  19.       android:targetPackage="com.xlth.cn.demo" android:label="Tests for My App" />  

  20. manifest>   

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


更多相关文章

  1. Android 监听Home键按键事件
  2. Android事件传递(分发)机制
  3. 如何在自己的程序中添加appWidget(附简单代码)
  4. Android ViewGroup中事件触发和传递机制
  5. Android两行代码真正杀死你的App
  6. android 事件模型原理2
  7. Android代码混淆之混淆规则
  8. Android Handler 异步消息处理机制 《第一行代码》

随机推荐

  1. 升级博客网站遇到的坑
  2. bootstrap高亮显示代码,且横向滚动
  3. 对Java之父的感谢多于敬仰
  4. Android(安卓)App Widget中如何调用Remot
  5. 啃一啃 Spring 的官方文档
  6. Java中的读写锁ReadWriteLock
  7. Collection总览
  8. Java 自动提交 git
  9. java后端面试高薪必备知识点-WeakHashMap
  10. 做了 454 道 Java 面试题,我依然是个【青