安卓下的XML编程
今天是我第一次认识到XML的厉害。以前做J2EE的时候一直使用JSON作为前端和后端的数据传输对象。JSON也就是JavaScript Object Notion,意思就是JavaScript对象准则,即一个对象标准。具有轻量便捷的有点。在遇到特殊字符的处理的时候有时会很棘手。正是因为这个原因所以我才会写这篇博客。
1.JSON的问题
我在做手机卫士的短信功能的时候,原计划是使用JSON作为文本格式的持久化形式。测试时前几次没出现问题,知道出现了这样一条测试短信内容:“halo ,what’s your name?”。经过序列化对象的到的JSON串为:{"_id":"12","address":"13243180815","body":"halo,what\u0027s your name?","date":"1406274996057","type":1}这个时候短信还原的时候解析就出现问题了,包的错误是JSON格式不正确。
2.安卓中XML文件的使用
a) 将对象集合写入XML文件。
public void smsBackup(SMSBackupCallBack callBack) {
// 1.使用内容提供者取得所有短信对象(SMSInfo)
List<SMSInfo> smsInfos = this.getSMSInfos();
callBack.onBefore(smsInfos.size());
// 将转换好的JSON文本写入文件中
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 如果内存卡状态可读写
File file = new File(Environment.getExternalStorageDirectory(),
"smsbackup.xml");
try {
OutputStream os = new FileOutputStream(file);
// 使用写入到XML文件中
XmlSerializer serializer = Xml.newSerializer();
// 设置输出流和输出编码
serializer.setOutput(os, "utf-8");
// 写入XML文件头
serializer.startDocument("utf-8", true);
// 写入开始根标签
serializer.startTag(null, "smss");
int progress = 0;
for (SMSInfo info : smsInfos) {
// 写入对象开始标签
serializer.startTag(null, "sms");
serializer.attribute(null, "id", info.get_id());
serializer.startTag(null, "address");
serializer.text(info.getAddress());
serializer.endTag(null, "address");
serializer.startTag(null, "body");
serializer.text(info.getBody());
serializer.endTag(null, "body");
serializer.startTag(null, "date");
serializer.text(info.getDate());
serializer.endTag(null, "date");
serializer.startTag(null, "type");
serializer.text(info.getType() + "");
serializer.endTag(null, "type");
// 写入对象结束标签
serializer.endTag(null, "sms");
progress++;
callBack.onDoing(progress);
}
// 写入结束跟标签
serializer.endTag(null, "smss");
// xml文档结束
serializer.endDocument();
os.close();
callBack.onDone();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
b) 将XML文件中的数据转换成对象集合
public void smsRestore(SMSBackupCallBack callBack) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File file = new File(Environment.getExternalStorageDirectory(),
"smsbackup.xml");
try {
InputStream is = new FileInputStream(file);
XmlPullParser pullParser = Xml.newPullParser();
SMSInfo info = null;
List<SMSInfo> infos = new ArrayList<SMSInfo>();
pullParser.setInput(is, "UTF-8"); // 为Pull解释器设置要解析的XML数据
int event = pullParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if ("smss".equals(pullParser.getName())) {
infos = new ArrayList<SMSInfo>();
}
if ("sms".equals(pullParser.getName())) {
info = new SMSInfo();
info.set_id(pullParser.getAttributeName(0));
}
if ("address".equals(pullParser.getName())) {
String address = pullParser.nextText();
info.setAddress(address);
}
if ("body".equals(pullParser.getName())) {
String body = pullParser.nextText();
info.setBody(body);
}
if ("date".equals(pullParser.getName())) {
String date = pullParser.nextText();
info.setDate(date);
}
if ("type".equals(pullParser.getName())) {
String type = pullParser.nextText();
info.setType(Integer.valueOf(type));
}
break;
case XmlPullParser.END_TAG:
if ("sms".equals(pullParser.getName())) {
infos.add(info);
}
break;
}
event = pullParser.next();
}
callBack.onBefore(infos.size());
ContentResolver resolver = context.getContentResolver();
ContentValues values = null;
int progress = 0;
for (SMSInfo sms : infos) {
values = new ContentValues();
values.put("address", sms.getAddress());
values.put("type", sms.getType());
values.put("body", sms.getBody());
values.put("date", sms.getDate());
progress++;
resolver.insert(Uri.parse("content://sms/"), values);
callBack.onDoing(progress);
}
callBack.onDone();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}