当前位置:  编程技术>移动开发

Android序列化XML数据

    来源: 互联网  发布时间:2014-10-21

    本文导语:  什么是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("");
        sbuilder.append("");
        // 遍历联系人信息
        for(Contact contact:Contacts){
            if(contact!=null){
                sbuilder.append("");
                sbuilder.append("");
                sbuilder.append(contact.getName());
                sbuilder.append("");

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

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

                sbuilder.append("");
            }
        }           
        sbuilder.append("");
        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文件一致,如下:
代码如下:




Damon0
18600000000
beijing0


Damon1
18600000001
beijing1


Damon2
18600000002
beijing2


Damon3
18600000003
beijing3


Damon4
18600000004
beijing4


Damon5
18600000005
beijing5


Damon6
18600000006
beijing6


Damon7
18600000007
beijing7


Damon8
18600000008
beijing8


Damon9
18600000009
beijing9



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

 
 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Android 元数据读取实用库 android-metadata
  • android开发教程之清除android数据缓存示例(清除本地数据缓存)
  • Android数据库加密SDK
  • 安装时加入外部数据库示例(android外部数据库)
  • Android 实现永久保存数据的方法详解
  • android实现关闭或开启移动网络数据
  • Android实现将已发送的短信写入短信数据库的方法
  • android读写sd卡操作写入数据读取数据示例
  • Android获取assets文件夹中的数据并写入SD卡示例
  • 解析Android中string-array数据源的简单使用
  • Android 清除SharedPreferences 产生的数据(实例代码)
  • android通过gps获取定位的位置数据和gps经纬度
  • android实现raw文件夹导入数据库代码
  • Android数据绑定框架 RoboBinding
  • Android学习笔记--通过Application传递数据代码示例
  • Android访问php取回json数据实例
  • android不同activity之间共享数据解决方法
  • Android TableLayout数据列表的回显清空实现思路及代码
  • Android webview与js交换JSON对象数据示例
  • android POST数据遇到的UTF-8编码(乱码)问题解决办法
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • Android访问与手机通讯相关类的介绍
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3