xml文件作为一种数据存储文件是经常用得到的,下面针对xml文件的序列化和解析进行简单的总结
以短信备份为例:
1.找到控件设置点击事件
2.获取短信内容,以Bean对象的方式封装到list集合中
3.遍历list集合中的短信数据,存储到xml文件中
XmlSerializer
try{
//1.通过Xml获取一个XmlSerializer对象
XmlSerializer xs = Xml.newSerializer();
//2.设置要写入的xml文件的流信息
//os:要写入的xml文件的流 encoding:流的编码
xs.setOutput(context.openFileOutput("smsBackup2.xml", Context.MODE_PRIVATE), "utf-8");
//3.序列化xml文件的声明头
//encoding:xml声明头的编码 standalone:是否独立
xs.startDocument("utf-8", true);
//4.序列化一个根节点的开始标签
//namespace:命名空间 name:标签的名称
xs.startTag(null, "Smss");
//5.循环遍历list集合,序列化一条一条的短信内容
for (SmsBean smsBean : allSms) {
xs.startTag(null, "Sms");
//namespace:命名空间 name:属性的名称 value:属性的值
xs.attribute(null, "id", smsBean.id);//序列化一个属性
xs.startTag(null, "num");
xs.text(smsBean.num);//序列化一个文本内容
xs.endTag(null, "num");
xs.startTag(null, "msg");
xs.text(smsBean.msg);//序列化一个文本内容
xs.endTag(null, "msg");
xs.startTag(null, "date");
xs.text(smsBean.date);//序列化一个文本内容
xs.endTag(null, "date");
xs.endTag(null, "Sms");
}
//6.序列化一个根节点的结束标签
xs.endTag(null, "Smss");
//7.将xml写入文件
xs.endDocument();
return true;
}catch (Exception e) {
e.printStackTrace();
}
//xml文件的解析 *************************************************************************************************//
/**
*xml文件的解析有三种方法,dom解析 sax解析 pull解析 后两种方法一样,dom解析需要完全加载整个文档到内存中,如果文件较大
*就会浪费内存,所以使用了pull解析
*/
<pre name="code" class="html">try{
ArrayList<SmsBean> arrayList = null;
SmsBean bean = null;
//1.通过xml获取一个xmlPullParser对象
XmlPullParser xpp = Xml.newPullParser();
//2.设置要解析的是哪个xml文件
//inputStream:要解析的那个xml文件的读取流 inputEncoding:流的编码
xpp.setInput(context.openFileInput("smsBackup2.xml"), "utf-8");
//3.获取当前xml行的事件类型
int type = xpp.getEventType();
//4.循环判断事件类型是否是文档结束类型
while(type != XmlPullParser.END_DOCUMENT){
//5.如果不是文档结束类型,可以解析当前行的内容,需要判断标签的信息
String currentTagName = xpp.getName();//获取当前行的标签名称
switch (type) {
case XmlPullParser.START_TAG://开始标签
if("Smss".equals(currentTagName)){//如果当前标签是Smss,需要初始化一个集合
arrayList = new ArrayList<SmsBean>();
}else if("Sms".equals(currentTagName)){
bean = new SmsBean();
//获取Sms标签上的id属性
bean.id = xpp.getAttributeValue(null, "id");
}else if("num".equals(currentTagName)){
bean.num = xpp.nextText();//如果当前标签是开始标签,下一个标签是内容,该方法返回下一个元素的内容
}else if("msg".equals(currentTagName)){
bean.msg = xpp.nextText();//如果当前标签是开始标签,下一个标签是内容,该方法返回下一个元素的内容
}else if("date".equals(currentTagName)){
bean.date = xpp.nextText();//如果当前标签是开始标签,下一个标签是内容,该方法返回下一个元素的内容
}
break;
case XmlPullParser.END_TAG:
if("Sms".equals(currentTagName)){
arrayList.add(bean);
}
break;
default:
break;
}
//6.解析一行后需要获取下一行事件的类型进行判断解析。
type = xpp.next();
}
return arrayList.size();
}catch (Exception e) {
e.printStackTrace();
}