Chinaunix

标题: Android Pull解析xml [打印本页]

作者: so_brave    时间: 2011-10-12 20:34
标题: Android Pull解析xml
Android Pull解析xml



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

book.xml如下:

Xml代码


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

02.<books>

03.        <book id="12">

04.                <name>thinking in java</name>

05.                <price>85.5</price>

06.        </book>

07.        <book id="15">

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

09.                <price>39.0</price>

10.        </book>

11.</books>
复制代码Pull解析的代码如下PullParseService.java

Java代码


01.import java.io.InputStream;

02.import java.util.ArrayList;

03.import java.util.List;

04.

05.import org.xmlpull.v1.XmlPullParser;

06.

07.import android.util.Xml;

08.

09.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.}
复制代码里面使用到的Book.java类

Java代码


01.public class Book {

02.        private int id;

03.        private String name;

04.        private float price;

05.        public int getId() {

06.                return id;

07.        }

08.        public void setId(int id) {

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

01.import java.io.InputStream;

02.import java.util.List;

03.

04.import android.test.AndroidTestCase;

05.import android.util.Log;

06.

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

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

09.

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.}
复制代码要使用android的单元测试,需要在AndroidManifest.xml文件中加入声明,AndroidManifest.xml如下:

Xml代码

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

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

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

04.      android:versionCode="1"

05.      android:versionName="1.0">

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

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

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

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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2