Andorid- 反序列化,采用pull解析 xml 文件


MainActivity.java

     主入口,通过获得 XML文件 ,然后将解析后的文件标签以及文本内容拼接到 StringBuffer中,最后显示在TextView上

 1 package com.example.test_pullxml;
 2 
 3 import java.util.List;
 4 
 5 import com.test.MsgInfo.MsgInfo;
 6 import com.test.Msgservice.Msgservice;
 7 
 8 import android.os.Bundle;
 9 import android.app.Activity;
10 import android.widget.TextView;
11 import android.widget.Toast;
12 
13 /**
14  * @author daomul
15  *
16  */
17 public class MainActivity extends Activity {
18 
19     TextView tv_showTextView=null;
20     
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25         
26         tv_showTextView = (TextView) this.findViewById(R.id.tv_show);
27         
28         try {
29             
30             List<MsgInfo> infos = Msgservice.getMsgInfos(MainActivity.class.getClassLoader()
31                     .getResourceAsStream("test.xml"));  //获得当前src 目录下的文件
32             
33             StringBuffer sBuffer = new StringBuffer();
34             for (MsgInfo info : infos) {    //将文件的内容 循环拼接到Stringbuffer中
35                 String str = info.toString();
36                 sBuffer.append(str);
37                 sBuffer.append("
");
38             }
39             
40             tv_showTextView.setText(sBuffer);//显示在textview上
41             Toast.makeText(this, "解析成功", Toast.LENGTH_LONG).show();
42             
43         } catch (Exception e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46             Toast.makeText(this, "解析失败", Toast.LENGTH_LONG).show();
47         }
48     }
49 
50 }

Msgservice.java

       通过新建一个解析器,然后初始化解析器,然后开始解析XML文件,通过特殊的解析器标签判定解析的时机和位置,

每结束一次列表的解析,就将它添加,循环添加。

 1 package com.test.Msgservice;
 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 android.util.Xml;
 9 
10 import com.test.MsgInfo.MsgInfo;
11 
12 public class Msgservice {
13 
14     /**
15      * 利用解析器解析XML文件
16      * @param is
17      * @return
18      * @throws Exception
19      * 
20      * XmlPullParser是解析器  xPsraer是解析的到得XML
21      */
22     public static List<MsgInfo> getMsgInfos(InputStream is) throws Exception{
23          
24         XmlPullParser xParser = Xml.newPullParser();//解析得到的xml
25         
26         //初始化解析器
27         xParser.setInput(is,"utf-8");
28          
29         List<MsgInfo>  msgInfos = null;
30         MsgInfo msgInfo = null;
31         int type = xParser.getEventType();  //解析出来的XML标签类
32          
33         while (type != XmlPullParser.END_DOCUMENT) {
34              
35             switch (type) {
36             case XmlPullParser.START_TAG:
37                 if ("msgs".equals(xParser.getName())) { // 解析到 全局开始的标签
38                     msgInfos = new ArrayList<MsgInfo>();// 新建一个 列表数组
39                      
40                     
41                 }else if ("msg".equals(xParser.getName())) {
42                     msgInfo = new MsgInfo();            // 新建一个需要重复取出的列表
43                     String mId = xParser.getAttributeValue(0);// 获得标签的属性值 ,只有一个属性 :0
44                     msgInfo.setId(Integer.parseInt(mId));    //将属性添加到列表的ID中
45                      
46                     
47                 }else if ("body".equals(xParser.getName())) {
48                     String mBodyStr = xParser.nextText();   //直接添加到列表中
49                     msgInfo.setBody(mBodyStr);              //将子标签的值添加到列表的body中
50                      
51                     
52                 }else if ("address".equals(xParser.getName())) {
53                     String maddressStr = xParser.nextText();   //直接添加到列表中
54                     msgInfo.setAddress(maddressStr);              //将子标签的值添加到列表的address中
55 
56                      
57                 }else if ("type".equals(xParser.getName())) {
58                     String mtypeStr = xParser.nextText();       //直接添加到列表中
59                     msgInfo.setType(Integer.parseInt(mtypeStr));   //将子标签的值添加到列表的type中
60 
61                      
62                 }else if ("date".equals(xParser.getName())) {
63                     String mdateStr = xParser.nextText();       //直接添加到列表中
64                     msgInfo.setDate(mdateStr);   //将子标签的值添加到列表的date中
65 
66                      
67                 }
68                 break;
69             case XmlPullParser.END_TAG:
70                 if ("msg".equals(xParser.getName())) {
71                     // it is end_tag that end a list ,that over a msg list 
72                     msgInfos.add(msgInfo);  // add a list goto the lists
73                     msgInfo = null;      // 制空list 
74                 }
75                 break;
76 
77             default:
78                 break;
79             }
80             type = xParser.next();
81             
82         }
83         return msgInfos;  //get the lists back to return 
84         
85     }
86 }

MsgInfo.java

     model层,封装构造方法和属性函数,不过值得注意的是,这里对比前面一篇的XML序列化 有 少许改动,特别是date 字段的类型的改变

 1 package com.test.MsgInfo;
 2 
 3 /**
 4  * @author daomul
 5  * 短信信息
 6  */
 7 
 8 public class MsgInfo {
 9     
10     private String date;
11     private int type;
12     private String body;
13     private String address;
14     private int id;
15     
16     //无参构造方法
17     public MsgInfo() {
18         
19     }
20     
21     //有参构造方法 Generate Constructor use fields...
22     public MsgInfo(String date, int type, String body, String address,int id) {
23         super();
24         this.date = date;
25         this.type = type;
26         this.body = body;
27         this.address = address;
28         this.id = id;
29     }
30 
31     @Override
32     public String toString() {
33         return "[日期=" + date + ", 类型=" + type + ", 正文=" + body
34                 + ", 来源=" + address + ", 信息id=" + id + "]";
35     }
36 
37     //setter and getter
38     public int getId() {
39         return id;
40     }
41 
42     public void setId(int id) {
43         this.id = id;
44     }
45 
46     public String getDate() {
47         return date;
48     }
49     public void setDate(String date) {
50         this.date = date;
51     }
52     public int getType() {
53         return type;
54     }
55     public void setType(int type) {
56         this.type = type;
57     }
58     public String getBody() {
59         return body;
60     }
61     public void setBody(String body) {
62         this.body = body;
63     }
64     public String getAddress() {
65         return address;
66     }
67     public void setAddress(String address) {
68         this.address = address;
69     }
70     
71     
72 
73 }

XML 文件打开的预览图:

结果界面显示:

原文地址:https://www.cnblogs.com/daomul/p/3599247.html