分享

Android Pull解析xml-中国移动开发者社区

 啵啵比 2011-03-31
       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 java< /name>

  5. < price>85.5< /price>

  6. < /book>

  7. < book id="15">

  8. < name>Spring in Action< /name>

  9. < price>39.0< /price>

  10. < /book>

  11. < /books>

  < ?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

  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< Book> getBooks(InputStream inputStream) throws Exception{

  13. List< Book> 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< Book>();//初始化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. }

  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类

  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. }

  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的单元测试,代码如下:

  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< Book> books = pull.getBooks(input);

  16. for(Book book : books){

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

       18. }

  19. }

  20. }

  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代码

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

  2. < manifest xmlns:android="http://schemas./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>

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

  < manifest xmlns:android="http://schemas./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新闻等,希望对大家有帮助

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多