Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:
按以下步骤进行操作:
[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:
[html] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <students>
3. <student id="20110806100">
4. <name>小明</name>
5. <age>22</age>
6. <sex>男</sex>
7. </student>
8. <student id="20110806101">
9. <name>小李</name>
10. <age>24</age>
11. <sex>男</sex>
12. </student>
13. <student id="20110806102">
14. <name>小丽</name>
15. <age>21</age>
16. <sex>女</sex>
17. </student>
18. </students>
[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。
[html] view plain copy
1. package com.andyidea.entity;
2.
3. public class Student {
4.
5. private String id;
6. private String name;
7. private int age;
8. private String sex;
9.
10. public String getId() {
11. return id;
12. }
13. public void setId(String id) {
14. this.id = id;
15. }
16. public String getName() {
17. return name;
18. }
19. public void setName(String name) {
20. this.name = name;
21. }
22. public int getAge() {
23. return age;
24. }
25. public void setAge(int age) {
26. this.age = age;
27. }
28. public String getSex() {
29. return sex;
30. }
31. public void setSex(String sex) {
32. this.sex = sex;
33. }
34.
35. }
[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。
[html] view plain copy
1. package com.andyidea.util;
2.
3. import java.io.InputStream;
4. import java.util.ArrayList;
5. import java.util.List;
6.
7. import org.xmlpull.v1.XmlPullParser;
8. import org.xmlpull.v1.XmlPullParserFactory;
9.
10. import android.util.Xml;
11.
12. import com.andyidea.entity.Student;
13.
14. public class ParserByPULL {
15.
16. //采用XmlPullParser来解析XML文件
17. public static List<Student> getStudents(InputStream inStream) throws Throwable
18. {
19. List<Student> students = null;
20. Student mStudent = null;
21.
22. //========创建XmlPullParser,有两种方式=======
23. //方式一:使用工厂类XmlPullParserFactory
24. XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
25. XmlPullParser parser = pullFactory.newPullParser();
26. //方式二:使用Android提供的实用工具类android.util.Xml
27. //XmlPullParser parser = Xml.newPullParser();
28.
29. //解析文件输入流
30. parser.setInput(inStream, "UTF-8");
31. //产生第一个事件
32. int eventType = parser.getEventType();
33. //只要不是文档结束事件,就一直循环
34. while(eventType!=XmlPullParser.END_DOCUMENT)
35. {
36. switch (eventType)
37. {
38. //触发开始文档事件
39. case XmlPullParser.START_DOCUMENT:
40. students = new ArrayList<Student>();
41. break;
42. //触发开始元素事件
43. case XmlPullParser.START_TAG:
44. //获取解析器当前指向的元素的名称
45. String name = parser.getName();
46. if("student".equals(name))
47. {
48. //通过解析器获取id的元素值,并设置student的id
49. mStudent = new Student();
50. mStudent.setId(parser.getAttributeValue(0));
51. }
52. if(mStudent!=null)
53. {
54. if("name".equals(name))
55. {
56. //获取解析器当前指向元素的下一个文本节点的值
57. mStudent.setName(parser.nextText());
58. }
59. if("age".equals(name))
60. {
61. //获取解析器当前指向元素的下一个文本节点的值
62. mStudent.setAge(new Short(parser.nextText()));
63. }
64. if("sex".equals(name))
65. {
66. //获取解析器当前指向元素的下一个文本节点的值
67. mStudent.setSex(parser.nextText());
68. }
69. }
70. break;
71. //触发结束元素事件
72. case XmlPullParser.END_TAG:
73. //
74. if("student".equals(parser.getName()))
75. {
76. students.add(mStudent);
77. mStudent = null;
78. }
79. break;
80. default:
81. break;
82. }
83. eventType = parser.next();
84. }
85. return students;
86. }
87.
88. }
[4] 该Demo的入口类:MainActivity.java
[html] view plain copy
1. package com.andyidea.xmlparser;
2.
3. import java.io.InputStream;
4. import java.util.List;
5.
6. import com.andyidea.entity.Student;
7. import com.andyidea.util.ParserByPULL;
8.
9. import android.app.Activity;
10. import android.content.res.AssetManager;
11. import android.os.Bundle;
12. import android.util.Log;
13.
14. public class MainActivity extends Activity {
15. /** Called when the activity is first created. */
16. @Override
17. public void onCreate(Bundle savedInstanceState) {
18. super.onCreate(savedInstanceState);
19. setContentView(R.layout.main);
20.
21. AssetManager asset = getAssets();
22. try {
23. InputStream input = asset.open("student.xml");
24. List<Student> list = ParserByPULL.getStudents(input);
25. for (Student stu : list) {
26. Log.e("StudentInfo","Person ID: " + stu.getId() + ","
27. + stu.getName() + ", " + stu.getAge() + ", "
28. + stu.getSex());
29. }
30. } catch (Throwable e) {
31. e.printStackTrace();
32. }
33. }
34. }
[5]最后我们运行程序看看结果如下:
Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:
按以下步骤进行操作:
[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:
[html] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <students>
3. <student id="20110806100">
4. <name>小明</name>
5. <age>22</age>
6. <sex>男</sex>
7. </student>
8. <student id="20110806101">
9. <name>小李</name>
10. <age>24</age>
11. <sex>男</sex>
12. </student>
13. <student id="20110806102">
14. <name>小丽</name>
15. <age>21</age>
16. <sex>女</sex>
17. </student>
18. </students>
[2] 根据XML文件中的节点目录,创建一个相对应的实体类,来保存解析的相应信息。在包:com.andyidea.entity下新建Student.java类。
[html] view plain copy
1. package com.andyidea.entity;
2.
3. public class Student {
4.
5. private String id;
6. private String name;
7. private int age;
8. private String sex;
9.
10. public String getId() {
11. return id;
12. }
13. public void setId(String id) {
14. this.id = id;
15. }
16. public String getName() {
17. return name;
18. }
19. public void setName(String name) {
20. this.name = name;
21. }
22. public int getAge() {
23. return age;
24. }
25. public void setAge(int age) {
26. this.age = age;
27. }
28. public String getSex() {
29. return sex;
30. }
31. public void setSex(String sex) {
32. this.sex = sex;
33. }
34.
35. }
[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。
[html] view plain copy
1. package com.andyidea.util;
2.
3. import java.io.InputStream;
4. import java.util.ArrayList;
5. import java.util.List;
6.
7. import org.xmlpull.v1.XmlPullParser;
8. import org.xmlpull.v1.XmlPullParserFactory;
9.
10. import android.util.Xml;
11.
12. import com.andyidea.entity.Student;
13.
14. public class ParserByPULL {
15.
16. //采用XmlPullParser来解析XML文件
17. public static List<Student> getStudents(InputStream inStream) throws Throwable
18. {
19. List<Student> students = null;
20. Student mStudent = null;
21.
22. //========创建XmlPullParser,有两种方式=======
23. //方式一:使用工厂类XmlPullParserFactory
24. XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
25. XmlPullParser parser = pullFactory.newPullParser();
26. //方式二:使用Android提供的实用工具类android.util.Xml
27. //XmlPullParser parser = Xml.newPullParser();
28.
29. //解析文件输入流
30. parser.setInput(inStream, "UTF-8");
31. //产生第一个事件
32. int eventType = parser.getEventType();
33. //只要不是文档结束事件,就一直循环
34. while(eventType!=XmlPullParser.END_DOCUMENT)
35. {
36. switch (eventType)
37. {
38. //触发开始文档事件
39. case XmlPullParser.START_DOCUMENT:
40. students = new ArrayList<Student>();
41. break;
42. //触发开始元素事件
43. case XmlPullParser.START_TAG:
44. //获取解析器当前指向的元素的名称
45. String name = parser.getName();
46. if("student".equals(name))
47. {
48. //通过解析器获取id的元素值,并设置student的id
49. mStudent = new Student();
50. mStudent.setId(parser.getAttributeValue(0));
51. }
52. if(mStudent!=null)
53. {
54. if("name".equals(name))
55. {
56. //获取解析器当前指向元素的下一个文本节点的值
57. mStudent.setName(parser.nextText());
58. }
59. if("age".equals(name))
60. {
61. //获取解析器当前指向元素的下一个文本节点的值
62. mStudent.setAge(new Short(parser.nextText()));
63. }
64. if("sex".equals(name))
65. {
66. //获取解析器当前指向元素的下一个文本节点的值
67. mStudent.setSex(parser.nextText());
68. }
69. }
70. break;
71. //触发结束元素事件
72. case XmlPullParser.END_TAG:
73. //
74. if("student".equals(parser.getName()))
75. {
76. students.add(mStudent);
77. mStudent = null;
78. }
79. break;
80. default:
81. break;
82. }
83. eventType = parser.next();
84. }
85. return students;
86. }
87.
88. }
[4] 该Demo的入口类:MainActivity.java
[html] view plain copy
1. package com.andyidea.xmlparser;
2.
3. import java.io.InputStream;
4. import java.util.List;
5.
6. import com.andyidea.entity.Student;
7. import com.andyidea.util.ParserByPULL;
8.
9. import android.app.Activity;
10. import android.content.res.AssetManager;
11. import android.os.Bundle;
12. import android.util.Log;
13.
14. public class MainActivity extends Activity {
15. /** Called when the activity is first created. */
16. @Override
17. public void onCreate(Bundle savedInstanceState) {
18. super.onCreate(savedInstanceState);
19. setContentView(R.layout.main);
20.
21. AssetManager asset = getAssets();
22. try {
23. InputStream input = asset.open("student.xml");
24. List<Student> list = ParserByPULL.getStudents(input);
25. for (Student stu : list) {
26. Log.e("StudentInfo","Person ID: " + stu.getId() + ","
27. + stu.getName() + ", " + stu.getAge() + ", "
28. + stu.getSex());
29. }
30. } catch (Throwable e) {
31. e.printStackTrace();
32. }
33. }
34. }
[5]最后我们运行程序看看结果如下: