在Android中xml的生成有两种,其一是手工写入,其二是用XmlSerializer对象来生成。

比如要生成下面这中。

xml 生成javabean xml 生成_xml 生成javabean

先创建一个SmsBean.java 类用来封装信息。

xml 生成javabean xml 生成_序列化_02

xml 生成javabean xml 生成_序列化_03

1 package cn.starry.xml.bean;
2 
3 public class SmsBean {
4     public String num;
5     public String msg;
6     public String date;
7     public int id;
8 }

View Code

然后用SmsDao.java去设置信息。

xml 生成javabean xml 生成_序列化_02

xml 生成javabean xml 生成_序列化_03

1 package cn.starry.xml.dao;
 2 
 3 import java.util.ArrayList;
 4 
 5 import cn.starry.xml.bean.SmsBean;
 6 
 7 public class SmsDao {
 8     //获得短信数据,模拟一些假数据
 9     public static ArrayList<SmsBean> getAllSms() {
10             
11         ArrayList<SmsBean> arrayList = new ArrayList<SmsBean>();
12         
13         SmsBean smsBean = new SmsBean();
14         smsBean.id = 1;
15         smsBean.num = "120";
16         smsBean.msg = "dasdadas";
17         smsBean.date = "2017-7-17";
18         arrayList.add(smsBean);
19         
20         SmsBean smsBean1 = new SmsBean();
21         smsBean1.id = 2;
22         smsBean1.num = "110";
23         smsBean1.msg = "daAAAs";
24         smsBean1.date = "2017-7-17";
25         arrayList.add(smsBean1);
26         
27         SmsBean smsBean2 = new SmsBean();
28         smsBean2.id = 3;
29         smsBean2.num = "130";
30         smsBean2.msg = "daDDDs";
31         smsBean2.date = "2017-7-17";
32         arrayList.add(smsBean2);
33         return arrayList;
34         
35     }
36 
37 }

View Code

 

方法一:

创建一个StringBuffer对象,然后往里面手工append。

1 public static boolean backupSms(Context mContext) {
 2         
 3         allSms = SmsDao.getAllSms();
 4         StringBuffer sb = new StringBuffer();
 5         //封装一个头
 6         sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
 7         //封装根节点
 8         sb.append("<Smss>");
 9         //循环遍历list集合封装所有的短信
10         for (SmsBean smsBean : allSms) {
11             sb.append("<Sms id = \""+smsBean.id+"\">");
12             
13             sb.append("<num>");
14             sb.append(smsBean.num);
15             sb.append("</num>");
16             
17             sb.append("<msg>");
18             sb.append(smsBean.msg);
19             sb.append("</num>");
20             
21             sb.append("<date>");
22             sb.append(smsBean.date);
23             sb.append("</date>");
24             sb.append("</Sms>");
25         }
26         sb.append("</Smss>");
27         
28         try {
29             FileOutputStream openFileOutput = mContext.openFileOutput("backupsms.xml", Context.MODE_PRIVATE);
30             openFileOutput.write(sb.toString().getBytes());
31             openFileOutput.close();
32             return true;
33         } catch (Exception e) {
34             e.printStackTrace();
35         }
36         return false;
37     }

这种方法明显不好,只要有一个地方写错了,就有可能生成不了,比如把一个'/'丢了,肯定生成不了了。

正好Android里自带了一个XmlSerializer类,可以用来生成xml的。

里面有几个常用的方法

1、setOutput(os, encoding) :os表示写入的文件, encoding表示写入的编码

2、startDocument(encoding, standalone):序列化xml的声明头,比如<?xml version='1.0' encoding='utf-8' standalone='yes' ?>  

                    encoding表示xml的编码,standalone:是否独立

3、startTag(namespace, name):序列化一个根节点的开始节点,namespace表示命名空间,name表示根节点的名字

4、attribute(namespace, name, value):name属性的名称,value属性值。

4、text(text):text参数表示需要在根节点下添加的内容

5、endTag(namespace, name):与startTag相反,一个根节点的结束

6、endDocument 完成xml的序列化

1 public static boolean backupSms_androind(Context mContext){
 2         try{
 3             allSms = SmsDao.getAllSms();
 4             //1创建一个XmlSerializer对象
 5             XmlSerializer xs = Xml.newSerializer();
 6             //2设置XmlSerializer的一些参数,比如:设置写入的xml文件的对象
 7             xs.setOutput(mContext.openFileOutput("backupsms2.xml", mContext.MODE_PRIVATE), "utf-8");
 8             //3序列化一个xml的声明头
 9             xs.startDocument("utf-8", true);
10             //4序列化一个根节点的开始节点
11             xs.startTag(null, "Smss");
12             //5循环遍历list集合序列化一条条短信
13             
14             for (SmsBean smsBean : allSms) {
15                 xs.startTag(null, "sms");
16                 //name:属性的名称   value:属性值
17                 xs.attribute(null, "id", smsBean.id+"");
18                 
19                 
20                 xs.startTag(null, "num");
21                 xs.text(smsBean.num);
22                 xs.endTag(null, "num");
23                 
24                 
25                 xs.startTag(null, "msg");
26                 xs.text(smsBean.msg);
27                 xs.endTag(null, "msg");
28                 
29                 xs.startTag(null, "date");
30                 xs.text(smsBean.date);
31                 xs.endTag(null, "date");
32                 
33                 
34                 xs.endTag(null, "sms");
35             }
36             
37             //6序列化一个跟根节点的结束节点
38             xs.endTag(null, "Smss");
39             //7将xml写入到文件中,完成xml的序列化
40             
41             xs.endDocument();
42             return true;
43         }catch (Exception e) {
44             e.printStackTrace();
45         }
46         return false;
47     }

 

 

 

 

xml的解析可以通过Xml获取一个XmlPullParse对象来操作。

XmlPullParse对象常用方法有:

1、getEventType():获取当前xml行的事件类型

2、getName():获取标签的名字

3、getAttributeValue(namespace, name):获取属性

4、nextText():获取当前标签的内容

然后可以通过XmlPullParser.END_DOCUMENT、XmlPullParser.START_TAG、XmlPullParser.END_TAG判断文档是否结束或标签是否开始或结束来操作。

 

除了从mContext下的目录获取xml外,还可以从assets中获取。

1 public static int restoreSms(Context mContext) {
 2         ArrayList<SmsBean> arrayList = null;
 3         SmsBean smsBean = null;
 4         try{
 5             //1通过Xml获取一个XMLPullParse对象
 6             XmlPullParser xpp = Xml.newPullParser();
 7             //2设置XmlPullParse对象的参数,需要解析的是哪个文件,设置一个文件读取流
 8             
 9             //通过context获取一个资产管理者对象
10             AssetManager assets = mContext.getAssets();
11             InputStream inputStream = assets.open("backupsms2.xml");
12             xpp.setInput(inputStream, "utf-8");
13             
14 //            xpp.setInput(mContext.openFileInput("backupsms2.xml"), "utf-8");
15             //3获取当前Xml行的事件类型
16             int type = xpp.getEventType();
17             //4判断事件类型是否是文档结束的事件类型
18             while(type != XmlPullParser.END_DOCUMENT) {
19                 //5如果不是,循环遍历解析每一行的数据,解析一行后,获取下一行的事件类型
20                 
21                 String currentTagName = xpp.getName();
22                 //判断当前行的事件类型是开始标签还是结束标签
23                 switch (type) {
24                 case XmlPullParser.START_TAG:
25                     if(currentTagName.equals("Smss")){
26                         arrayList = new ArrayList<SmsBean>();
27                     }else if(currentTagName.equals("sms")) {
28                         smsBean = new SmsBean();
29                         smsBean.id = Integer.parseInt(xpp.getAttributeValue(null, "id"));
30                     }else if(currentTagName.equals("num")) {
31                         smsBean.num = xpp.nextText();
32                     }else if(currentTagName.equals("msg")) {
33                         smsBean.msg = xpp.nextText();
34                     }else if(currentTagName.equals("date")) {
35                         smsBean.date = xpp.nextText();
36                     }
37                     break;
38                 case XmlPullParser.END_TAG:
39                     if(currentTagName.equals("sms")){
40                         arrayList.add(smsBean);
41                     }
42                     break;
43                 default:
44                     break;
45                 }
46                 
47                 type = xpp.next();
48             }
49             
50             return arrayList.size();
51             
52             
53             //6将解析的数据封装到list中
54         }catch (Exception e) {
55             e.printStackTrace();
56         }
57         return 0;
58     }