Android序列化XML数据
程序员文章站
2023-11-18 12:24:52
什么是xml?首先我们先了解一下什么是xml。xml,可扩展标记语言 (extensible markup language) ,用于标记电子文件使其具有结构性的标记语言,...
什么是xml?
首先我们先了解一下什么是xml。xml,可扩展标记语言 (extensible markup language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释。而xml是一种在internet中传输数据的常见格式,它与html一样,都是sgml(标准通用标记语言),无论你是需要通过internet访问数据,或者发送数据给web服务,都可能需要用到xml的知识。恰恰android应用程序需要和网络交互,否则只是一款单机的无互动的应用程序,所以很可能在android应用程序开发的过程中使用到xml。
由于xml的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则需要注意的是:
开始和结束标签匹配。
嵌套标签不能相互嵌套。
区分大小写。
xml序列化
当获取到一段数据后,如果需要把它序列化成xml的格式,通常有两种办法:
拼接字符串的形式序列化一个xml数据。
使用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,可扩展标记语言 (extensible markup language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释。而xml是一种在internet中传输数据的常见格式,它与html一样,都是sgml(标准通用标记语言),无论你是需要通过internet访问数据,或者发送数据给web服务,都可能需要用到xml的知识。恰恰android应用程序需要和网络交互,否则只是一款单机的无互动的应用程序,所以很可能在android应用程序开发的过程中使用到xml。
由于xml的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则需要注意的是:
开始和结束标签匹配。
嵌套标签不能相互嵌套。
区分大小写。
xml序列化
当获取到一段数据后,如果需要把它序列化成xml的格式,通常有两种办法:
拼接字符串的形式序列化一个xml数据。
使用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"/>