安卓下的XML编程

安卓下的XML编程

今天是我第一次认识到XML的厉害。以前做J2EE的时候一直使用JSON作为前端和后端的数据传输对象。JSON也就是JavaScript Object Notion,意思就是JavaScript对象准则,即一个对象标准。具有轻量便捷的有点。在遇到特殊字符的处理的时候有时会很棘手。正是因为这个原因所以我才会写这篇博客。

1.JSON的问题

我在做手机卫士的短信功能的时候,原计划是使用JSON作为文本格式的持久化形式。测试时前几次没出现问题,知道出现了这样一条测试短信内容:“halo ,whats 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();
			}
		}
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值