Android中使用PULL方式解析XML文件
?Pull解析器的运行方式与?SAX?解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是,?Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
???????? 下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

按以下步骤进行操作:
[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:
[html]?view plaincopy- <?xml?version="1.0"?encoding="utf-8"?>??
- <students>??
- ????<student?id="20110806100">??
- ????????<name>小明</name>??
- ????????<age>22</age>??
- ????????<sex>男</sex>??
- ????</student>??
- ????<student?id="20110806101">??
- ????????<name>小李</name>??
- ????????<age>24</age>??
- ????????<sex>男</sex>??
- ????</student>??
- ????<student?id="20110806102">??
- ????????<name>小丽</name>??
- ????????<age>21</age>??
- ????????<sex>女</sex>??
- ????</student>??
- </students>??
[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。
- package?com.andyidea.entity;??
- ??
- public?class?Student?{??
- ??????
- ????private?String?id;??
- ????private?String?name;??
- ????private?int?age;??
- ????private?String?sex;??
- ??????
- ????public?String?getId()?{??
- ????????return?id;??
- ????}??
- ????public?void?setId(String?id)?{??
- ????????this.id?=?id;??
- ????}??
- ????public?String?getName()?{??
- ????????return?name;??
- ????}??
- ????public?void?setName(String?name)?{??
- ????????this.name?=?name;??
- ????}??
- ????public?int?getAge()?{??
- ????????return?age;??
- ????}??
- ????public?void?setAge(int?age)?{??
- ????????this.age?=?age;??
- ????}??
- ????public?String?getSex()?{??
- ????????return?sex;??
- ????}??
- ????public?void?setSex(String?sex)?{??
- ????????this.sex?=?sex;??
- ????}??
- ??
- }??
[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。
- package?com.andyidea.util;??
- ??
- import?java.io.InputStream;??
- import?java.util.ArrayList;??
- import?java.util.List;??
- ??
- import?org.xmlpull.v1.XmlPullParser;??
- import?org.xmlpull.v1.XmlPullParserFactory;??
- ??
- import?android.util.Xml;??
- ??
- import?com.andyidea.entity.Student;??
- ??
- public?class?ParserByPULL?{??
- ??????
- ????//采用XmlPullParser来解析XML文件????
- ????public?static?List<Student>?getStudents(InputStream?inStream)?throws?Throwable???
- ????{????
- ????????List<Student>?students?=?null;????
- ????????Student?mStudent?=?null;????
- ??????????
- ????????//========创建XmlPullParser,有两种方式=======??
- ????????//方式一:使用工厂类XmlPullParserFactory??
- ????????XmlPullParserFactory?pullFactory?=?XmlPullParserFactory.newInstance();??
- ????????XmlPullParser?parser?=?pullFactory.newPullParser();??
- ????????//方式二:使用Android提供的实用工具类android.util.Xml??
- ????????//XmlPullParser?parser?=?Xml.newPullParser();????
- ??????????
- ????????//解析文件输入流????
- ????????parser.setInput(inStream,?"UTF-8");????
- ????????//产生第一个事件????
- ????????int?eventType?=?parser.getEventType();????
- ????????//只要不是文档结束事件,就一直循环????
- ????????while(eventType!=XmlPullParser.END_DOCUMENT)????
- ????????{????
- ????????????switch?(eventType)?????
- ????????????{????
- ????????????????//触发开始文档事件????
- ????????????????case?XmlPullParser.START_DOCUMENT:????
- ????????????????????students?=?new?ArrayList<Student>();????
- ????????????????????break;????
- ????????????????//触发开始元素事件????
- ????????????????case?XmlPullParser.START_TAG:????
- ????????????????????//获取解析器当前指向的元素的名称????
- ????????????????????String?name?=?parser.getName();????
- ????????????????????if("student".equals(name))????
- ????????????????????{????
- ????????????????????????//通过解析器获取id的元素值,并设置student的id????
- ????????????????????????mStudent?=?new?Student();????
- ????????????????????????mStudent.setId(parser.getAttributeValue(0));????
- ????????????????????}????
- ????????????????????if(mStudent!=null)????
- ????????????????????{????
- ????????????????????????if("name".equals(name))????
- ????????????????????????{????
- ????????????????????????????//获取解析器当前指向元素的下一个文本节点的值????
- ????????????????????????????mStudent.setName(parser.nextText());????
- ????????????????????????}????
- ????????????????????????if("age".equals(name))????
- ????????????????????????{????
- ????????????????????????????//获取解析器当前指向元素的下一个文本节点的值????
- ????????????????????????????mStudent.setAge(new?Short(parser.nextText()));????
- ????????????????????????}??
- ????????????????????????if("sex".equals(name))??
- ????????????????????????{??
- ????????????????????????????//获取解析器当前指向元素的下一个文本节点的值????
- ????????????????????????????mStudent.setSex(parser.nextText());??
- ????????????????????????}??
- ????????????????????}????
- ????????????????????break;????
- ????????????????//触发结束元素事件????
- ????????????????case?XmlPullParser.END_TAG:????
- ????????????????????//????
- ????????????????????if("student".equals(parser.getName()))????
- ????????????????????{????
- ????????????????????????students.add(mStudent);????
- ????????????????????????mStudent?=?null;????
- ????????????????????}????
- ????????????????????break;????
- ????????????????default:????
- ????????????????????break;????
- ????????????}????
- ????????????eventType?=?parser.next();????
- ????????}????
- ????????return?students;????
- ????}????
- ??
- }??
[4]?该Demo的入口类:MainActivity.java
[html]?view plaincopy- package?com.andyidea.xmlparser;??
- ??
- import?java.io.InputStream;??
- import?java.util.List;??
- ??
- import?com.andyidea.entity.Student;??
- import?com.andyidea.util.ParserByPULL;??
- ??
- import?android.app.Activity;??
- import?android.content.res.AssetManager;??
- import?android.os.Bundle;??
- import?android.util.Log;??
- ??
- public?class?MainActivity?extends?Activity?{??
- ????/**?Called?when?the?activity?is?first?created.?*/??
- ????@Override??
- ????public?void?onCreate(Bundle?savedInstanceState)?{??
- ????????super.onCreate(savedInstanceState);??
- ????????setContentView(R.layout.main);??
- ??????????
- ????????AssetManager?asset?=?getAssets();??
- ????????try?{??
- ????????????InputStream?input?=?asset.open("student.xml");??
- ????????????List<Student>?list?=?ParserByPULL.getStudents(input);??
- ????????????for?(Student?stu?:?list)?{??
- ???????????????????Log.e("StudentInfo","Person?ID:?"?+?stu.getId()?+?","??
- ?????????????????????????+?stu.getName()?+?",?"?+?stu.getAge()?+?",?"??
- ?????????????????????????+?stu.getSex());??
- ????????????}??
- ????????}?catch?(Throwable?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- }??
[5]最后我们运行程序看看结果如下:
