加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用PULL解析XML文件

发布时间:2020-12-16 00:18:34 所属栏目:百科 来源:网络整理
导读:XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整

XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。

下面来看一个pull解析xml的例子:

student.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <root>
  3. studentid="1"group="1">
  4. name>张三</sex>age>18email>zhangsan@163.combirthday>1987-06-08memo>好学生studentstudentid="2"group="2">李四>>lisi@163.comstudentid="3"group="3">小王>xiaowang@163.comstudentid="4"group="4">小张>xiaozhang@163.comstudentid="5"group="5">小明>xiaoming@163.com>
对应的bean:

copy

    publicclassStudent{
  1. privateintid;
  2. privateintgroup;
  3. privateStringname;
  4. privateStringsex;
  5. privateintage;
  6. privateStringemail;
  7. privateStringmemo;
  8. privateStringbirthday;
  9. publicintgetId(){
  10. returnid;
  11. }
  12. publicvoidsetId(intid){
  13. this.id=id;
  14. }
  15. publicintgetGroup(){
  16. returngroup;
  17. publicvoidsetGroup(intgroup){
  18. this.group=group;
  19. publicStringgetName(){
  20. returnname;
  21. publicvoidsetName(Stringname){
  22. this.name=name;
  23. publicStringgetSex(){
  24. returnsex;
  25. publicvoidsetSex(Stringsex){
  26. this.sex=sex;
  27. publicintgetAge(){
  28. returnage;
  29. publicvoidsetAge(intage){
  30. this.age=age;
  31. publicStringgetEmail(){
  32. returnemail;
  33. publicvoidsetEmail(Stringemail){
  34. this.email=email;
  35. publicStringgetMemo(){
  36. returnmemo;
  37. publicvoidsetMemo(Stringmemo){
  38. this.memo=memo;
  39. publicStringgetBirthday(){
  40. returnbirthday;
  41. publicvoidsetBirthday(Stringbirthday){
  42. this.birthday=birthday;
  43. }

主要的解析和现实类:

copy

    importjava.io.InputStream;
  1. importjava.util.ArrayList;
  2. importjava.util.List;
  3. importorg.xmlpull.v1.XmlPullParser;
  4. importorg.xmlpull.v1.XmlPullParserFactory;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.os.Handler;
  8. importandroid.os.Message;
  9. importandroid.view.ViewGroup.LayoutParams;
  10. importandroid.widget.LinearLayout;
  11. importandroid.widget.TextView;
  12. publicclassPullActivityextendsActivityimplementsRunnable{
  13. privateTextViewpullTextView;
  14. privateLinearLayoutlayout;
  15. privateHandlerhandler=newHandler(){
  16. publicvoidhandleMessage(android.os.Messagemsg){
  17. ListStudent>lists=(List>)msg.obj;
  18. for(inti=0;ilists.size();i++){
  19. Studentstudent=lists.get(i);
  20. StringBuffersb=newStringBuffer();
  21. sb.append(student.getId()+"").append(student.getName()+"")
  22. .append(student.getAge()+"").append(student.getSex()+"").append(student.getBirthday()+"")
  23. .append(student.getEmail()+"").append(student.getGroup()+"");
  24. TextViewtxt=newTextView(getApplicationContext());
  25. txt.setLayoutParams(newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
  26. txt.setText(sb.toString());
  27. layout.addView(txt);
  28. };
  29. };
  30. @Override
  31. protectedvoidonCreate(BundlesavedInstanceState){
  32. //TODOAuto-generatedmethodstub
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.pull);
  35. pullTextView=(TextView)this.findViewById(R.id.pullTextView);
  36. layout=(LinearLayout)this.findViewById(R.id.layout);
  37. newThread(this).start();
  38. //pull解析xml
  39. publicList>pullParseXml(){
  40. List>lists=null;
  41. Studentstudent=null;
  42. try{
  43. XmlPullParserFactoryfactory=XmlPullParserFactory.newInstance();
  44. //获取XmlPullParser实例
  45. XmlPullParserpullParser=factory.newPullParser();
  46. InputStreamin=this.getClass().getClassLoader().getResourceAsStream("student.xml");
  47. pullParser.setInput(in,"UTF-8");
  48. //开始
  49. inteventType=pullParser.getEventType();
  50. while(eventType!=XmlPullParser.END_DOCUMENT){
  51. StringnodeName=pullParser.getName();
  52. switch(eventType){
  53. //文档开始
  54. caseXmlPullParser.START_DOCUMENT:
  55. lists=newArrayList>();
  56. break;
  57. //开始节点
  58. caseXmlPullParser.START_TAG:
  59. if("student".equals(nodeName)){
  60. student=newStudent();
  61. student.setId(Integer.parseInt(pullParser.getAttributeValue(0)));
  62. student.setGroup(Integer.parseInt(pullParser.getAttributeValue(1)));
  63. }elseif("name".equals(nodeName)){
  64. student.setName(pullParser.nextText());
  65. }elseif("sex".equals(nodeName)){
  66. student.setSex(pullParser.nextText());
  67. }elseif("age".equals(nodeName)){
  68. student.setAge(Integer.parseInt(pullParser.nextText()));
  69. }elseif("email".equals(nodeName)){
  70. student.setEmail(pullParser.nextText());
  71. }elseif("birthday".equals(nodeName)){
  72. student.setBirthday(pullParser.nextText());
  73. }elseif("memo".equals(nodeName)){
  74. student.setMemo(pullParser.nextText());
  75. break;
  76. //结束节点
  77. caseXmlPullParser.END_TAG:
  78. lists.add(student);
  79. student=null;
  80. default:
  81. //手动的触发下一个事件
  82. eventType=pullParser.next();
  83. }catch(Exceptione){
  84. //TODOAuto-generatedcatchblock
  85. e.printStackTrace();
  86. returnlists;
  87. @Override
  88. publicvoidrun(){
  89. //TODOAuto-generatedmethodstub
  90. >lists=pullParseXml();
  91. Messagemsg=handler.obtainMessage();
  92. msg.obj=lists;
  93. handler.sendMessage(msg);
  94. }

注意xml中的<?xml version="1.0" encoding="utf-8"?> 这句话要顶格显示,不要留空隙,附则错了很难调试的。

解析后效果:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读