Android中XML构建与解析

本文探讨了Android中XML的构建和解析,介绍了在应用程序开发中XML作为数据交换格式的作用。文章通过短信备份的示例代码,展示了XML的构建过程,并讲解了XML的Pull解析方法。虽然Android提供了多种解析方式,如SAX和DOM,但文中主要讲解了Pull解析。建议开发者参考官方文档以深入理解XML在Android中的应用。
摘要由CSDN通过智能技术生成


1、引言

要了解今天的主要内容,首先要知道什么事xml?xml的英文名字是Exteile Marku Laguage,中文翻译称之为可扩展标记语言。具体是什么含义,可以不用理解太深,毕竟我们做应用的,没涉及到这么深的理论。

在应用开发过程中,常见的从服务器返回的形式,有两种,一种是json格式,一种是xml格式,当然还有其它格式的返回形式,但是用到得比较少。今天我们重点理解在Android中的Xml构建与解析。

在Android中,它自身已经将xml文件的构建和解析放在里面,我们可以直接调用。


2、构建

下文是一段短信备份的代码,其中使用了xml文件对短信备份,

<pre name="code" class="java">/**
 * 备份短信
 * @author ljtyzhr
 * @version 1.0
 */
public class BackupSmsService extends Service {
	
	private SmsInfoService smsInfoService;		// 短信服务
	
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		smsInfoService = new SmsInfoService(this);
		super.onCreate();
		new Thread(){
			public void run() {
				try {
					List<SmsInfo>  smsinfos = smsInfoService.getSmsInfos();
					// 将短信备份到 sd 卡上
					File file = new File("/sdcard/smsbackup.xml");
					XmlSerializer serializer = Xml.newSerializer();			// 序列化
					FileOutputStream os = new FileOutputStream(file);		// 输出流
					
					/**
					 * 生成xml文件,先创建节点,然后创建内容
					 */
					serializer.setOutput(os, "utf-8");
					serializer.startDocument("utf-8", true);		/*文件头*/
					serializer.startTag(null, "smss");
					serializer.startTag(null, "count");
					serializer.text(smsinfos.size() + "");
					serializer.endTag(null, "count");
					
					for(SmsInfo info : smsinfos){
						//最外层节点开始标签
						serializer.startTag(null, "sms");
						
						serializer.startTag(null, "id");
						serializer.text(info.getId());
						serializer.endTag(null, "id");
						
						serializer.startTag(null, "address");
						serializer.text(info.getAddress());
						serializer.endTag(null, "address");
						
						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.startTag(null, "body");
						serializer.text(info.getBody());
						serializer.endTag(null, "body");
						//最外层节点结束标签
						serializer.endTag(null, "sms");
					}
					serializer.endTag(null, "smss");		/*文件尾*/
					serializer.endDocument();
					//把文件缓冲区的数据写出去
					os.flush();
					os.close();
					Looper.prepare();	//子线程没有消息队列,需要使用Looper
					Toast.makeText(getApplicationContext(), "备份完成", 1).show();
					Looper.loop();
				} catch (Exception e) {
					e.printStackTrace();
					Looper.prepare();
					Toast.makeText(getApplicationContext(), "备份失败", 1).show();
					Looper.loop();
				}
			}
		}.start();
	}
}


 

3、解析

在构建中的代码,关键点已经给出了注释,想必不需要过多解释说明,下面我们来看看如何解析上面的一段代码:

/**
	 * 还原短信
	 * @author ljtyzhr
	 * @version 1.0
	 * @param path	路径信息
	 * @param pd	进度条
	 * @throws Exception
	 */
	public void restoreSms(String path,ProgressDialog pd) throws Exception{
		File file = new File (path);
		ContentValues values = null;
		FileInputStream fis = new FileInputStream(file);
		XmlPullParser parser =  Xml.newPullParser();
		parser.setInput(fis, "utf-8");
		int type = parser.getEventType();
		int currentcount = 0;
		
		while ( type != XmlPullParser.END_DOCUMENT){
			switch (type) {
			case XmlPullParser.START_TAG:
				if("count".equals(parser.getName())){
				   String count =	parser.nextText();
				   pd.setMax(Integer.parseInt(count));
				}
				// id是由系统自增长的,所以没有添加插入
				if("sms".equals(parser.getName())){
					values = new ContentValues();
				}else if("address".equals(parser.getName())){
					values.put("address", parser.nextText());
				}else if("date".equals(parser.getName())){
					values.put("date", parser.nextText());
				}else if("type".equals(parser.getName())){
					values.put("type", parser.nextText());
				}else if("body".equals(parser.getName())){
					values.put("body", parser.nextText());
				}
				break;
			case XmlPullParser.END_TAG:
				if("sms".equals(parser.getName())){
					ContentResolver resolver = context.getContentResolver();
					resolver.insert(Uri.parse("content://sms/"), values);
					values = null;
					currentcount++;
					// 动态显示当前还原比
					pd.setProgress(currentcount);
				}
				break;
			}
			type = parser.next();
		}
	}

4、总结

上文的构建xml文件与解析xml文件,都是使用的Android自身的jar文件,并没有使用其它的jar包。而这里也仅仅使用了一种xml中的pull解析,xml文件还有sax,dom解析等多种方式。在Android自身提供的解析方式,基本能够满足相应的需求,如果还需要对在Android中xml构建与解析有更深的了解。可以点击查看dom解析

网络上还有一些介绍xml解析的文章,也未必靠谱,建议查看官网的说明,会比较方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值