在开发过程中呢,会有生成一个xml文件的需要,那么下面,我们以备份短信为例,看一下如何生成一份xml文件。假如说我们要备份生成的短信文件是这样子的:
第一种方法:用StringBuffer拼接字符串生成一份xml文件。
/**
* 备份短信(往xml里写数据)。普通方法,用StringBuffer
*/
private void writeXml1() {
// TODO Auto-generated method stub
StringBuffer xmlStr = new StringBuffer();
xmlStr.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
xmlStr.append("<smss>");
//MsmInfo.java是短信对象的基本信息类
//msmList是短信集合(List)
for (MsmInfo info : msmList) {
xmlStr.append("<sms>");
// type;// 0发送,1接收
// date;// 短信时间
// address;// 收件人or发件人
// content;// 短信内容
xmlStr.append("<type>");
xmlStr.append(info.getType());
xmlStr.append("</type>");
xmlStr.append("<date>");
xmlStr.append(info.getDate());
xmlStr.append("</date>");
xmlStr.append("<address>");
xmlStr.append(info.getAddress());
xmlStr.append("</address>");
xmlStr.append("<content>");
xmlStr.append(info.getContent());
xmlStr.append("</content>");
xmlStr.append("</sms>");
}
xmlStr.append("</smss>");
try {
File file = new File(Environment.getExternalStorageDirectory(),
"msmBackup.xml");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(xmlStr.toString().getBytes());
outputStream.close();
Toast.makeText(getApplicationContext(), "备份成功", Toast.LENGTH_SHORT)
.show();
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(getApplicationContext(), "备份失败", Toast.LENGTH_SHORT)
.show();
e.printStackTrace();
}
}
这样,我们就可以生成一份xml文件了。
可是我们会发现,这样的方法虽然简单易懂,但实际编写起来很繁琐,并且特别容易出错,再者,如果我的短信内容里有特殊符号呢,估计事情就不会往预想的方向发展了。
那么,该怎么办呢?答案就是它:XmlSerializer。我们可以用XmlSerializer格式化生成文档,呐,下面我们来看具体用法:
第二种方法:XmlSerializer
/**
* 备份短信(往xml里写数据)。用XmlSerializer格式化生成文档
*/
private void writeXml2() {
// TODO Auto-generated method stub
XmlSerializer serializer = Xml.newSerializer();// 新建一个Xml Serializer
try {
File file = new File(Environment.getExternalStorageDirectory(),
"msmBackup2.xml");// 文件路径
FileOutputStream outputStream = new FileOutputStream(file);
serializer.setOutput(outputStream, "utf-8");// 用给定的编码设置二进制输出流。
serializer.startDocument("utf-8", true);
serializer.startTag(null, "msms");// 设置开始标签
for (MsmInfo info : msmList) {// 遍历短信集合
serializer.startTag(null, "msm");// 设置开始标签
serializer.attribute(null, "id", info.getId() + "");// 设置标签属性id
// type;// 0发送,1接收
// date;// 短信时间
// address;// 收件人or发件人
// content;// 短信内容
serializer.startTag(null, "type");// 设置开始标签
serializer.text(info.getType() + "");
serializer.endTag(null, "type");// 相对应的结束标签
serializer.startTag(null, "date");
serializer.text(info.getDate() + "");
serializer.endTag(null, "date");
serializer.startTag(null, "address");
serializer.text(info.getAddress());
serializer.endTag(null, "address");
serializer.startTag(null, "content");
serializer.text(info.getContent());
serializer.endTag(null, "content");
serializer.endTag(null, "msm");// 设置结束标签,与其开始标签相对应
}
serializer.endTag(null, "msms");// 设置结束标签,与其开始标签相对应
serializer.endDocument();// 表示文档结束
outputStream.close();// 关闭输出流
Toast.makeText(getApplicationContext(), "备份成功", Toast.LENGTH_SHORT)
.show();
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(getApplicationContext(), "备份失败", Toast.LENGTH_SHORT)
.show();
e.printStackTrace();
}
}
下面是MsmInfo.java
public class MsmInfo {
private int id;
private int type;// 0发送,1接收
private long date;// 短信时间
private String address;// 收件人or发件人
private String content;// 短信内容
public MsmInfo() {
}
public MsmInfo(int id, int type, long date, String address, String content) {
this.id = id;
this.type = type;
this.date = date;
this.address = address;
this.content = content;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "[id=" + id + ", type=" + type + ", 时间=" + date + ", 电话="
+ address + ", 短信内容=" + content + "]";
}
}
ok,完工了,是不是发现XmlSerializer更好用一些呢。