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解析的文章,也未必靠谱,建议查看官网的说明,会比较方便。