Android中使用PULL方式解析XML文件

         Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

         下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件。先看下如下工程的目录结构:

按以下步骤进行操作:

[1] 新建一个XML文件,命名为student.xml。同时把XML文件放置到assets目录下。student.xml文件的内容如下:


 
 
  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类。


 
 
  1. package com.andyidea.entity;
  2. public class Student {
  3. private String id;
  4. private String name;
  5. private int age;
  6. private String sex;
  7. public String getId() {
  8. return id;
  9. }
  10. public void setId(String id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. public String getSex() {
  26. return sex;
  27. }
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. }


[3] 定义一个使用PULL解析XML文件的工具类:ParserByPULL.java。


 
 
  1. package com.andyidea.util;
  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.xmlpull.v1.XmlPullParser;
  6. import org.xmlpull.v1.XmlPullParserFactory;
  7. import android.util.Xml;
  8. import com.andyidea.entity.Student;
  9. public class ParserByPULL {
  10. //采用XmlPullParser来解析XML文件
  11. public static List <Student> getStudents(InputStream inStream) throws Throwable
  12. {
  13. List <Student> students = null;
  14. Student mStudent = null;
  15. //========创建XmlPullParser,有两种方式=======
  16. //方式一:使用工厂类XmlPullParserFactory
  17. XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
  18. XmlPullParser parser = pullFactory.newPullParser();
  19. //方式二:使用Android提供的实用工具类android.util.Xml
  20. //XmlPullParser parser = Xml.newPullParser();
  21. //解析文件输入流
  22. parser.setInput(inStream, "UTF-8");
  23. //产生第一个事件
  24. int eventType = parser.getEventType();
  25. //只要不是文档结束事件,就一直循环
  26. while(eventType!=XmlPullParser.END_DOCUMENT)
  27. {
  28. switch (eventType)
  29. {
  30. //触发开始文档事件
  31. case XmlPullParser.START_DOCUMENT:
  32. students = new ArrayList <Student>();
  33. break;
  34. //触发开始元素事件
  35. case XmlPullParser.START_TAG:
  36. //获取解析器当前指向的元素的名称
  37. String name = parser.getName();
  38. if("student".equals(name))
  39. {
  40. //通过解析器获取id的元素值,并设置student的id
  41. mStudent = new Student();
  42. mStudent.setId(parser.getAttributeValue(0));
  43. }
  44. if(mStudent!=null)
  45. {
  46. if("name".equals(name))
  47. {
  48. //获取解析器当前指向元素的下一个文本节点的值
  49. mStudent.setName(parser.nextText());
  50. }
  51. if("age".equals(name))
  52. {
  53. //获取解析器当前指向元素的下一个文本节点的值
  54. mStudent.setAge(new Short(parser.nextText()));
  55. }
  56. if("sex".equals(name))
  57. {
  58. //获取解析器当前指向元素的下一个文本节点的值
  59. mStudent.setSex(parser.nextText());
  60. }
  61. }
  62. break;
  63. //触发结束元素事件
  64. case XmlPullParser.END_TAG:
  65. //
  66. if("student".equals(parser.getName()))
  67. {
  68. students.add(mStudent);
  69. mStudent = null;
  70. }
  71. break;
  72. default:
  73. break;
  74. }
  75. eventType = parser.next();
  76. }
  77. return students;
  78. }
  79. }

[4] Demo的入口类:MainActivity.java


 
 
  1. package com.andyidea.xmlparser;
  2. import java.io.InputStream;
  3. import java.util.List;
  4. import com.andyidea.entity.Student;
  5. import com.andyidea.util.ParserByPULL;
  6. import android.app.Activity;
  7. import android.content.res.AssetManager;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. public class MainActivity extends Activity {
  11. /** Called when the activity is first created. */
  12. @Override
  13. public void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.main);
  16. AssetManager asset = getAssets();
  17. try {
  18. InputStream input = asset.open("student.xml");
  19. List <Student> list = ParserByPULL.getStudents(input);
  20. for (Student stu : list) {
  21. Log.e("StudentInfo","Person ID: " + stu.getId() + ","
  22. + stu.getName() + ", " + stu.getAge() + ", "
  23. + stu.getSex());
  24. }
  25. } catch (Throwable e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }


[5]最后我们运行程序看看结果如下:


以上黑色方框中的内容就是采用PULL方式解析的结果。
转载:https://blog.csdn.net/cjjky/article/details/6667744
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值