xml布局

android中xml解析和生成
无论使用高层编程语言(如 XSLT)还是低层 Java 编程,第一步都是要读入 XML 文件,解码结构和检索信息等等,这就是解析。这里讲讲解析常用方法:
package com.example.smsxml.util;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import com.example.smsxml.bean.SmsBean;
import com.example.smsxml.dao.SmsDao;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Xml;

public class SmsUtils {
	public static boolean backupSms_android(Context context){
		try{
			
			//0.获取短信数据
			ArrayList allSms = SmsDao.getAllSms();
			//1.通过Xml获取一个XmlSerializer对象
			XmlSerializer xs = Xml.newSerializer();
			//2.设置XmlSerializer的一些参数,比如:设置xml写入到哪个文件中
			//os:xml文件写入流   encoding:流的编码
			xs.setOutput(context.openFileOutput("backupsms2.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");
					//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写入到文件中,完成xml的序列化
				xs.endDocument();
				return true;
		}catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	
	
	
	
	//备份的逻辑
	public static boolean backupSms(Context context) {
		// 获取短信内容,list

		ArrayList allSms = SmsDao.getAllSms();

		// 将数据以xml格式封装到StringBuffer中,
		StringBuffer sb = new StringBuffer();
		// 封装一个声明头
		sb.append("");
		sb.append("");
		// 循环遍历list封装集合的短信
		for (SmsBean smsBean : allSms) {
			sb.append("Sms id =\"" + smsBean.id + "\">");

			sb.append("");
			sb.append(smsBean.num);
			sb.append("");

			sb.append("");
			sb.append(smsBean.msg);
			sb.append("");

			sb.append("");
			sb.append(smsBean.date);
			sb.append("");

			sb.append("");

		// 将stringbuffer中的xml字符串写入目录的文件
		try {
			FileOutputStream openFileOutput = context.openFileOutput("backupsms.xml", Context.MODE_PRIVATE);
			openFileOutput.write(sb.toString().getBytes());
			openFileOutput.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
	
	//解析xml文件读取短信内容
	public static int restoreSms(Context context) {
		ArrayList arrayList = null;
		SmsBean smsBean = null;
		try{
			//1.通过Xml获取一个XmlPullParser对象
			XmlPullParser xpp = Xml.newPullParser();
			//2.设置XmlPullParser对象的参数,需要解析的是哪个xml文件,设置一个文件读取流
		
			//通过context获取一个资产管理者对象
			AssetManager assets = context.getAssets();
			//通过资产管理者对象能获取一个文件读取流
			InputStream inputStream = assets.open("backupsms2.xml");
			xpp.setInput(inputStream,"utf-8");
			//xpp.setInput(context.openFileInput("backupsms2.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(currentTagName.equals("Smss")){
						//如果当前标签是Smss,需要初始化一个集合
						arrayList = new ArrayList();
					}else if(currentTagName.equals("Sms")){

						smsBean = new SmsBean();
						smsBean.id = Integer.valueOf(xpp.getAttributeValue(null, "id"));

					}else if(currentTagName.equals("num")){
						smsBean.num =  xpp.nextText();
					}else if(currentTagName.equals("msg")){
						smsBean.msg =  xpp.nextText();
					}else if(currentTagName.equals("date")){
						smsBean.date =  xpp.nextText();
					}
					break;
				case XmlPullParser.END_TAG:
					//当前结束标签是Sms的话,一条短信数据封装完成, 可以加入list中
					if(currentTagName.equals("Sms")){
						arrayList.add(smsBean);
					}
					break;
				default:
					break;
				}

				type = xpp.next();//获取下一行的事件类型
			}

			return arrayList.size();

		}catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

}
看代码而知:第一种是直接根据根节点的字符串来循环遍历一个List集合,完成sml的序列化,这就是xml的解析。
生产xml文件,有一种也是直接添加根节点的字符串来生产xml文件的。
第二种解析方式是最常用的:.通过Xml获取一个XmlPullParser对象:XmlPullParser xpp = Xml.newPullParser();在获取一个文件读取流:InputStream inputStream = assets.open("backupsms2.xml");xpp.setInput(inputStream,"utf-8");在循环遍历每一行的数据,根据根节点的开始和结尾分别执行不同的语句:
while(type != XmlPullParser.END_DOCUMENT){
				//5.如果不是,循环遍历解析每一行的数据。解析一行后,获取下一行的事件类型

				String currentTagName = xpp.getName();
				//判断当前行的事件类型是开始标签还是结束标签
				switch (type) {
				case XmlPullParser.START_TAG:
					if(currentTagName.equals("Smss")){
						//如果当前标签是Smss,需要初始化一个集合
						arrayList = new ArrayList();
					}else if(currentTagName.equals("Sms")){

						smsBean = new SmsBean();
						smsBean.id = Integer.valueOf(xpp.getAttributeValue(null, "id"));

					}else if(currentTagName.equals("num")){
						smsBean.num =  xpp.nextText();
					}else if(currentTagName.equals("msg")){
						smsBean.msg =  xpp.nextText();
					}else if(currentTagName.equals("date")){
						smsBean.date =  xpp.nextText();
					}
					break;
				case XmlPullParser.END_TAG:
					//当前结束标签是Sms的话,一条短信数据封装完成, 可以加入list中
					if(currentTagName.equals("Sms")){
						arrayList.add(smsBean);
					}
					break;
				default:
					break;
				}

				type = xpp.next();//获取下一行的事件类型
			}
可以对比下xml的源文件如下:


		
				
				110
				
				来警局一趟
				2016-8-10
		
		
		
				
				110
				
				来警局一趟
				2016-8-10
		
		
		
				
				120
				
				来警局二趟
				2016-8-10
		
		
		
				
				130
				
				来警局三趟
				2016-8-10
		
		
		
				
				140
				
				来警局四趟
				2016-8-10
		


总结:了解xml常用的解析和生成方法就行




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值