展会信息港展会大全

android开发之序列化XML数据
来源:互联网   发布日期:2016-01-19 12:09:46   浏览:1657次  

导读:什么是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卡上。

1private void backupToContact1(){

2StringBuilder sbuilder=new StringBuilder();

3// 设置XML的数据头

4sbuilder.append("<?xml version="1.0" encoding="utf-8"?>");

5sbuilder.append("<contacts>");

6// 遍历联系人信息

7for(Contact contact:Contacts){

8if(contact!=null){

9sbuilder.append("<contact id='"+contact.getId()+"'>");

10sbuilder.append("<name>");

11sbuilder.append(contact.getName());

12sbuilder.append("</name>");

13

14sbuilder.append("<number>");

15sbuilder.append(contact.getNumber());

16sbuilder.append("</number>");

17

18sbuilder.append("<address>");

19sbuilder.append(contact.getAddress());

20sbuilder.append("</address>");

21

22sbuilder.append("</contact>");

23}

24}

25sbuilder.append("</contacts>");

26try {

27// 在SD卡上创建一个xml文件

28File file=new File(Environment.getExternalStorageDirectory(),"backup1.xml");

29FileOutputStream fos=new FileOutputStream(file);

30// 把序列化的数据写入到XML文件中

31fos.write(sbuilder.toString().getBytes());

32fos.close();

33Toast.makeText(MainActivity.this, "备份成功", 0).show();

34} catch (IOException e) {

35Toast.makeText(MainActivity.this, "备份失败", 0).show();

36e.printStackTrace();

37}

38}

执行完之后,可以把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卡上。

1private void backupToContact2(){

2try {

3// 在SD卡上创建一个文件

4File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml");

5FileOutputStream fos=new FileOutputStream(file);

6// 获取一个XmlSerializer

7XmlSerializer serializer = Xml.newSerializer();

8// 设置XML的输出流以及编码格式

9serializer.setOutput(fos,"utf-8");

10// 设置文档的开头,以及编码格式

11serializer.startDocument("utf-8", true);

12

13// 开始标签

14serializer.startTag(null, "contacts");

15for(Contact contact:Contacts){

16serializer.startTag(null, "contact");

17// 设置contact标签的id属性

18serializer.attribute(null, "id", contact.getId()+"");

19serializer.startTag(null, "name");

20serializer.text(contact.getName());

21serializer.endTag(null, "name");

22

23serializer.startTag(null, "number");

24serializer.text(contact.getNumber());

25serializer.endTag(null, "number");

26

27serializer.startTag(null, "address");

28serializer.text(contact.getAddress());

29serializer.endTag(null, "address");

30serializer.endTag(null, "contact");

31}

32// 一个结束标签

33serializer.endTag(null, "contacts");

34// 标记文档的结束

35serializer.endDocument();

36// 关闭输出流

37fos.close();

38Toast.makeText(MainActivity.this, "备份成功", 0).show();

39} catch (Exception e) {

40e.printStackTrace();

41Toast.makeText(MainActivity.this, "备份失败", 0).show();

42}

43}

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

1 <?xml version="1.0" encoding="utf-8"?>

2 <contacts>

3 <contact id="0">

4 <name>Damon0</name>

5 <number>18600000000</number>

6 <address>beijing0</address>

7 </contact>

8 <contact id="1">

9 <name>Damon1</name>

10 <number>18600000001</number>

11 <address>beijing1</address>

12 </contact>

13 <contact id="2">

14 <name>Damon2</name>

15 <number>18600000002</number>

16 <address>beijing2</address>

17 </contact>

18 <contact id="3">

19 <name>Damon3</name>

20 <number>18600000003</number>

21 <address>beijing3</address>

22 </contact>

23 <contact id="4">

24 <name>Damon4</name>

25 <number>18600000004</number>

26 <address>beijing4</address>

27 </contact>

28 <contact id="5">

29 <name>Damon5</name>

30 <number>18600000005</number>

31 <address>beijing5</address>

32 </contact>

33 <contact id="6">

34 <name>Damon6</name>

35 <number>18600000006</number>

36 <address>beijing6</address>

37 </contact>

38 <contact id="7">

39 <name>Damon7</name>

40 <number>18600000007</number>

41 <address>beijing7</address>

42 </contact>

43 <contact id="8">

44 <name>Damon8</name>

45 <number>18600000008</number>

46 <address>beijing8</address>

47 </contact>

48 <contact id="9">

49 <name>Damon9</name>

50 <number>18600000009</number>

51 <address>beijing9</address>

52 </contact>

53 </contacts>

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

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

赞助本站

人工智能实验室

相关热词: 序列化 XML

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港