- 论坛徽章:
- 0
|
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新闻等,希望对大家有帮助! |
|