本文共 6266 字,大约阅读时间需要 20 分钟。
什么是XML?
首先我们先了解一下什么是XML。XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释。而XML是一种在Internet中传输数据的常见格式,它与HTML一样,都是SGML(标准通用标记语言),无论你是需要通过Internet访问数据,或者发送数据给Web服务,都可能需要用到XML的知识。恰恰Android应用程序需要和网络交互,否则只是一款单机的无互动的应用程序,所以很可能在Android应用程序开发的过程中使用到XML。
由于XML的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则需要注意的是:
XML序列化
当获取到一段数据后,如果需要把它序列化成XML的格式,通常有两种办法:
使用拼接字符串的方式很简单,就是个体力活,把需要序列化的对象,依照一定的格式序列化即可。下面通过一个示例讲解来演示如何拼接字符串,在示例中模拟联系人数据,然后对其进行序列化成XML,最后保存在SD卡上。
1 private void backupToContact1(){ 2 StringBuilder sbuilder=new StringBuilder(); 3 // 设置XML的数据头 4 sbuilder.append(" "); 5 sbuilder.append(""); 6 // 遍历联系人信息 7 for(Contact contact:Contacts){ 8 if(contact!=null){ 9 sbuilder.append(" ");26 try {27 // 在SD卡上创建一个xml文件28 File file=new File(Environment.getExternalStorageDirectory(),"backup1.xml");29 FileOutputStream fos=new FileOutputStream(file);30 // 把序列化的数据写入到XML文件中31 fos.write(sbuilder.toString().getBytes());32 fos.close();33 Toast.makeText(MainActivity.this, "备份成功", 0).show();34 } catch (IOException e) {35 Toast.makeText(MainActivity.this, "备份失败", 0).show();36 e.printStackTrace();37 }38 }");10 sbuilder.append(" ");23 }24 } 25 sbuilder.append("");11 sbuilder.append(contact.getName());12 sbuilder.append(" ");13 14 sbuilder.append("");15 sbuilder.append(contact.getNumber());16 sbuilder.append(" ");17 18 sbuilder.append(" ");19 sbuilder.append(contact.getAddress());20 sbuilder.append("");21 22 sbuilder.append("
执行完之后,可以把SD卡上的XML文件导出到电脑上,查看其内容。
对于拼接字符串而言,可以看出,很容易出错,尤其是每个标签内如果还存在属性值就更需要细心了。而且如果其内容存在特殊的符号,如“<、>”等,就会导致XML序列化后的XML文件出错,而使用XmlSerializer来序列化XML文件就不存在这些问题。
下面介绍第二种方式,通过类来序列化XML。那先了解一下XmlSerializer,XmlSerializer主要是是以数据流的形式序列化XML,而它是一个接口类型,无法直接实例化,需要通过一个静态方法Xml.newSerializer()获取对象。
以下是一些常用方法:
上面已经介绍过了XmlSerializer的常用方法,下面通过一个示例来演示XmlSerializer的使用。在示例中实现的功能和上面拼接字符串序列化XML一致,都是序列化模拟的联系人信息,然后以XML的格式保存在SD卡上。
1 private void backupToContact2(){ 2 try { 3 // 在SD卡上创建一个文件 4 File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml"); 5 FileOutputStream fos=new FileOutputStream(file); 6 // 获取一个XmlSerializer 7 XmlSerializer serializer = Xml.newSerializer(); 8 // 设置XML的输出流以及编码格式 9 serializer.setOutput(fos,"utf-8");10 // 设置文档的开头,以及编码格式11 serializer.startDocument("utf-8", true);12 13 // 开始标签14 serializer.startTag(null, "contacts");15 for(Contact contact:Contacts){16 serializer.startTag(null, "contact");17 // 设置contact标签的id属性18 serializer.attribute(null, "id", contact.getId()+"");19 serializer.startTag(null, "name");20 serializer.text(contact.getName());21 serializer.endTag(null, "name");22 23 serializer.startTag(null, "number");24 serializer.text(contact.getNumber());25 serializer.endTag(null, "number");26 27 serializer.startTag(null, "address");28 serializer.text(contact.getAddress());29 serializer.endTag(null, "address");30 serializer.endTag(null, "contact");31 }32 // 一个结束标签33 serializer.endTag(null, "contacts");34 // 标记文档的结束35 serializer.endDocument();36 // 关闭输出流37 fos.close();38 Toast.makeText(MainActivity.this, "备份成功", 0).show();39 } catch (Exception e) {40 e.printStackTrace();41 Toast.makeText(MainActivity.this, "备份失败", 0).show();42 } 43 }
保存成功之后,可以通过File Explorer导出XML文件查看其内容,上面两个示例序列化的XML文件一致,如下:
1 23 4 8Damon0 518600000000 6 beijing0 79 13Damon1 1018600000001 11 beijing11214 18Damon2 1518600000002 16 beijing21719 23Damon3 2018600000003 21 beijing32224 28Damon4 2518600000004 26 beijing42729 33Damon5 3018600000005 31 beijing53234 38Damon6 3518600000006 36 beijing63739 43Damon7 4018600000007 41 beijing74244 48Damon8 4518600000008 46 beijing84749 53Damon9 5018600000009 51 beijing952
在示例中,访问了SD卡,所以需要在清单文件中加入SD卡写入权限:
1
总结
因为拼接字符串的方式比较不直观,容易出错,量大了需要很细心才行,基本上是个体力活,而且如果内容存在对于一些对于XML格式数据有特殊意义的符号,会导致拼接后的XML数据无法正常被解析。一般情况下,推荐使用XmlSerializer来序列化XML数据,使用XmlSerializer来序列化XML不存在这方面的问题,对于一些特殊符号,它会自动对其进行转义。
本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_XmlSerializer.html,如需转载请自行联系原作者