前言

  之前有讲过在Android下如何解析XML文件的内容,这篇博客讲讲如何把一个对象序列化为XML格式,有时候一些项目中需要传递一些XML格式的数据。而对于如何解析XML,不了解的朋友可以看看其他三篇博客:SAX解析XMLPULL解析XMLDOM解析XML

什么是XML?

  首先我们先了解一下什么是XML。XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释。而XML是一种在Internet中传输数据的常见格式,它与HTML一样,都是SGML(标准通用标记语言),无论你是需要通过Internet访问数据,或者发送数据给Web服务,都可能需要用到XML的知识。恰恰Android应用程序需要和网络交互,否则只是一款单机的无互动的应用程序,所以很可能在Android应用程序开发的过程中使用到XML。

  由于XML的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则需要注意的是:

  1. 开始和结束标签匹配。
  2. 嵌套标签不能相互嵌套。
  3. 区分大小写。

XML序列化

  当获取到一段数据后,如果需要把它序列化成XML的格式,通常有两种办法:

  1. 拼接字符串的形式序列化一个XML数据。
  2. 使用XmlSerializer类序列化一个XML数据。

  使用拼接字符串的方式很简单,就是个体力活,把需要序列化的对象,依照一定的格式序列化即可。下面通过一个示例讲解来演示如何拼接字符串,在示例中模拟联系人数据,然后对其进行序列化成XML,最后保存在SD卡上。

     private void backupToContact1(){
StringBuilder sbuilder=new StringBuilder();
// 设置XML的数据头
sbuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sbuilder.append("<contacts>");
// 遍历联系人信息
for(Contact contact:Contacts){
if(contact!=null){
sbuilder.append("<contact id='"+contact.getId()+"'>");
sbuilder.append("<name>");
sbuilder.append(contact.getName());
sbuilder.append("</name>"); sbuilder.append("<number>");
sbuilder.append(contact.getNumber());
sbuilder.append("</number>"); sbuilder.append("<address>");
sbuilder.append(contact.getAddress());
sbuilder.append("</address>"); sbuilder.append("</contact>");
}
}
sbuilder.append("</contacts>");
try {
// 在SD卡上创建一个xml文件
File file=new File(Environment.getExternalStorageDirectory(),"backup1.xml");
FileOutputStream fos=new FileOutputStream(file);
// 把序列化的数据写入到XML文件中
fos.write(sbuilder.toString().getBytes());
fos.close();
Toast.makeText(MainActivity.this, "备份成功", 0).show();
} catch (IOException e) {
Toast.makeText(MainActivity.this, "备份失败", 0).show();
e.printStackTrace();
}
}

  执行完之后,可以把SD卡上的XML文件导出到电脑上,查看其内容。

  对于拼接字符串而言,可以看出,很容易出错,尤其是每个标签内如果还存在属性值就更需要细心了。而且如果其内容存在特殊的符号,如“<、>”等,就会导致XML序列化后的XML文件出错,而使用XmlSerializer来序列化XML文件就不存在这些问题。

  下面介绍第二种方式,通过XmlSerializer类来序列化XML。那先了解一下XmlSerializer,XmlSerializer主要是是以数据流的形式序列化XML,而它是一个接口类型,无法直接实例化,需要通过一个静态方法Xml.newSerializer()获取对象。

  以下是一些常用方法:

  • setOutput(OutputStream,String):设置输出流,以及编码格式。
  • startDocument(String,boolean):第一个参数设置文档的编码格式,第二个参数设置是否是一个独立的文档,一般设置为true。
  • endDocument():标记XML文档的结束,XML文档标签均为成对出现,有始有终。
  • startTag(String,String):一个XML标签的开始,第一个参数为命名空间,一般为null即可,第二个参数为标签名。
  • endTag(String,String):一个XML标签的结束,第一个参数为命名空间,一般为null即可,第二个参数为标签名,有始有终。
  • attribute(String,String,String):设置一个标签的属性,第一个参数为命名空间,第二个参数是属性名,第三个参数为属性值。

  上面已经介绍过了XmlSerializer的常用方法,下面通过一个示例来演示XmlSerializer的使用。在示例中实现的功能和上面拼接字符串序列化XML一致,都是序列化模拟的联系人信息,然后以XML的格式保存在SD卡上。  

     private void backupToContact2(){
try {
// 在SD卡上创建一个文件
File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml");
FileOutputStream fos=new FileOutputStream(file);
// 获取一个XmlSerializer
XmlSerializer serializer = Xml.newSerializer();
// 设置XML的输出流以及编码格式
serializer.setOutput(fos,"utf-8");
// 设置文档的开头,以及编码格式
serializer.startDocument("utf-8", true); // 开始标签
serializer.startTag(null, "contacts");
for(Contact contact:Contacts){
serializer.startTag(null, "contact");
// 设置contact标签的id属性
serializer.attribute(null, "id", contact.getId()+"");
serializer.startTag(null, "name");
serializer.text(contact.getName());
serializer.endTag(null, "name"); serializer.startTag(null, "number");
serializer.text(contact.getNumber());
serializer.endTag(null, "number"); serializer.startTag(null, "address");
serializer.text(contact.getAddress());
serializer.endTag(null, "address");
serializer.endTag(null, "contact");
}
// 一个结束标签
serializer.endTag(null, "contacts");
// 标记文档的结束
serializer.endDocument();
// 关闭输出流
fos.close();
Toast.makeText(MainActivity.this, "备份成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "备份失败", 0).show();
}
}

  保存成功之后,可以通过File Explorer导出XML文件查看其内容,上面两个示例序列化的XML文件一致,如下:

 <?xml version="1.0" encoding="utf-8"?>
<contacts>
<contact id="0">
<name>Damon0</name>
<number>18600000000</number>
<address>beijing0</address>
</contact>
<contact id="1">
<name>Damon1</name>
<number>18600000001</number>
<address>beijing1</address>
</contact>
<contact id="2">
<name>Damon2</name>
<number>18600000002</number>
<address>beijing2</address>
</contact>
<contact id="3">
<name>Damon3</name>
<number>18600000003</number>
<address>beijing3</address>
</contact>
<contact id="4">
<name>Damon4</name>
<number>18600000004</number>
<address>beijing4</address>
</contact>
<contact id="5">
<name>Damon5</name>
<number>18600000005</number>
<address>beijing5</address>
</contact>
<contact id="6">
<name>Damon6</name>
<number>18600000006</number>
<address>beijing6</address>
</contact>
<contact id="7">
<name>Damon7</name>
<number>18600000007</number>
<address>beijing7</address>
</contact>
<contact id="8">
<name>Damon8</name>
<number>18600000008</number>
<address>beijing8</address>
</contact>
<contact id="9">
<name>Damon9</name>
<number>18600000009</number>
<address>beijing9</address>
</contact>
</contacts>

  在示例中,访问了SD卡,所以需要在清单文件中加入SD卡写入权限:

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  源码下载

总结

  因为拼接字符串的方式比较不直观,容易出错,量大了需要很细心才行,基本上是个体力活,而且如果内容存在对于一些对于XML格式数据有特殊意义的符号,会导致拼接后的XML数据无法正常被解析。一般情况下,推荐使用XmlSerializer来序列化XML数据,使用XmlSerializer来序列化XML不存在这方面的问题,对于一些特殊符号,它会自动对其进行转义。

Android--序列化XML数据的更多相关文章

  1. android基础---->XMl数据的解析

    在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...

  2. Android 之XML数据解析(2)—— SAX解析

    (以下文章基本照抄郭霖大神的<第一行代码>) 在Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件.今天讲另外一种方式,SAX解析XML文件. ...

  3. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  4. java三方---->dom4j解析xml数据

    Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP.今天我们就开始Dom4j的学习. Dom4j的使用 ...

  5. Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)

    1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

  6. Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  7. Android学习记录(1)—Android中XML文件的序列化生成与解析

    xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...

  8. Android(java)学习笔记130:Android中操作XML数据(使用Pull解析器)

    1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

  9. 二、Android XML数据解析

    XML,可扩展标记语言.可以用来存储数据,可以看做是一个小型的数据库,SharedPreference就是使用XML文件存储数据的,SQLite底层也是一个XML文件,而在网络应用方面,通常作为信息的 ...

随机推荐

  1. Jmeter 聚合报告---测试结果分析

    当我们测试完后,最关心就是结果数据了,下面一起来分析Jmeter聚合报告数据. 首先来看下Jmeter的help是如何解释这些含义的. 1.Label - The label of the sampl ...

  2. 受限filterbanks

    2.Related works to filterbank learning 虽然DNN-HMM模型的性能比GMM-HMM模型相比,具有很大的优势,但是训练集和测试集之间的失配问题,也使得DNN-HM ...

  3. 《Linux就该这么学》第十九天课程

    今天对“Linux就该这么学”课程做个收尾 最后一张使用LNMP架构部署动态网站环境 第1步:下载及解压源码包文件.为了方便在网络中传输,源码包文件通常会在归档后使用gzip或bzip2等格式进行压缩 ...

  4. Java整理

    基础篇 1.  面向对象 2.  Java平台 3.  值传递 4.  封装.继承.多态 5.  基本数据类型 6.  Java 装箱和拆箱 7.  String 8.  Java关键字 9.  集合 ...

  5. Greenplum 日常维护手册 (汇总、点评、备查)

    1. 数据库启动:gpstart常用可参数: -a : 直接启动,不提示终端用户输入确认-m:只启动master 实例,主要在故障处理时使用2. 数据库停止:gpstop:常用可参数:-a:直接停止, ...

  6. Linux-3.0.8中基于S5PV210的GPIO模块代码追踪和分析

    编写按键驱动时,想知道内核是如何管理GPIO的,所以开始追踪代码,中间走了一些弯路,现记录于此. 追踪代码之前,我猜测:第一,这部分代码应该在系统set up阶段执行:第二,GPIO的代码应该在mac ...

  7. ECharts常用设置记录

    一.配置文档 http://echarts.baidu.com/option.html#title 二.属性配置 1.图表与边框容器距离. grid: { top: '10%', left: '70' ...

  8. 逆向基本使用:IDA

    如何导出IDA数据中数组的内容进行编程? 如这种: .data:00427A54 ; char byte_427A54[] .data:00427A54 byte_427A54 db 0FEh ; D ...

  9. 解决nginx下connect() to 127.0.0.1:3000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: 错误信息

    尝试搭建nginx负载均衡,做域名转发时报如上错误,困扰了好长时间还好没放弃,还好百度找到解决办法: 是SeLinux导致: 1.执行下面的命令 setsebool -P httpd_can_netw ...

  10. st表(poj3264)

    st表很像线段树,但线段树既能查询和修改,而st表只能查询. 首先我们先用二维数组建立一个表,st[i][j]表内存的是从第i位开始1<<j范围内的best(st[i][j-1],st[i ...