Android--序列化XML数据
2013-11-08 07:28
375 查看
前言
之前有讲过在Android下如何解析XML文件的内容,这篇博客讲讲如何把一个对象序列化为XML格式,有时候一些项目中需要传递一些XML格式的数据。而对于如何解析XML,不了解的朋友可以看看其他三篇博客:SAX解析XML、PULL解析XML、DOM解析XML。
什么是XML?
首先我们先了解一下什么是XML。XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释。而XML是一种在Internet中传输数据的常见格式,它与HTML一样,都是SGML(标准通用标记语言),无论你是需要通过Internet访问数据,或者发送数据给Web服务,都可能需要用到XML的知识。恰恰Android应用程序需要和网络交互,否则只是一款单机的无互动的应用程序,所以很可能在Android应用程序开发的过程中使用到XML。
由于XML的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则需要注意的是:
开始和结束标签匹配。
嵌套标签不能相互嵌套。
区分大小写。
XML序列化
当获取到一段数据后,如果需要把它序列化成XML的格式,通常有两种办法:
拼接字符串的形式序列化一个XML数据。
使用XmlSerializer类序列化一个XML数据。
使用拼接字符串的方式很简单,就是个体力活,把需要序列化的对象,依照一定的格式序列化即可。下面通过一个示例讲解来演示如何拼接字符串,在示例中模拟联系人数据,然后对其进行序列化成XML,最后保存在SD卡上。
执行完之后,可以把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卡上。
保存成功之后,可以通过File Explorer导出XML文件查看其内容,上面两个示例序列化的XML文件一致,如下:
在示例中,访问了SD卡,所以需要在清单文件中加入SD卡写入权限:
源码下载
总结
因为拼接字符串的方式比较不直观,容易出错,量大了需要很细心才行,基本上是个体力活,而且如果内容存在对于一些对于XML格式数据有特殊意义的符号,会导致拼接后的XML数据无法正常被解析。一般情况下,推荐使用XmlSerializer来序列化XML数据,使用XmlSerializer来序列化XML不存在这方面的问题,对于一些特殊符号,它会自动对其进行转义。
之前有讲过在Android下如何解析XML文件的内容,这篇博客讲讲如何把一个对象序列化为XML格式,有时候一些项目中需要传递一些XML格式的数据。而对于如何解析XML,不了解的朋友可以看看其他三篇博客:SAX解析XML、PULL解析XML、DOM解析XML。
什么是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数据无法正常被解析。一般情况下,推荐使用XmlSerializer来序列化XML数据,使用XmlSerializer来序列化XML不存在这方面的问题,对于一些特殊符号,它会自动对其进行转义。
相关文章推荐
- Android中使用xml保存数据(xml文件序列化)及使用pull解析xml文件
- 【黑马Android】(02)短信发送器/布局演示/android下单位/android下Junit/保存数据/android下权限/xml解析和序列化
- Android序列化XML数据
- Android序列化XML数据
- Android应用中使用XmlSerializer序列化XML数据的教程
- Android--3种解析XML数据的步骤
- Android--3种解析XML数据的步骤
- unity3d,序列化将数据类的内容生成为XML配置
- 11.PHP生成XML数据,android解析XML案例简介
- XML序列化数据对象(三)
- 【C#】解决进行反序列化时出错:。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。
- Android中XML数据解析
- Android中SharedPreferences使用和xml解析和序列化
- 【android, 3】3.操作数据保存到rom,sd卡上,sharedpreference的使用,pul解析xml
- android程序开发之sharepreference的数据存储及xml文件的序列化
- android中将内存中的数据以xml的文件格式写到sdcard中
- Android XML数据解析——SAX解析
- android xml解析技术 json数据传输技术
- Android 网络获取数据之XML解析
- Android Sax解析XML出现空值或脏数据的解决方案