首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

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

2013-03-04 
Android中使用PULL方式解析XML文件?Pull解析器的运行方式与?SAX?解析器相似。它提供了类似的事件,如:开始元

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

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

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

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

按以下步骤进行操作:

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

[html]?view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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]最后我们运行程序看看结果如下:

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

以上黑色方框中的内容就是采用PULL方式解析的结果。?

热点排行