Android序列化XML数据

Android序列化XML数据,第1张

概述什么是XML?首先我们先了解一下什么是XML。XML,可扩展标记语言(ExtensibleMarkupLanguage),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的 什么是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"/>
  总结

以上是内存溢出为你收集整理的Android序列化XML数据全部内容,希望文章能够帮你解决Android序列化XML数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1141515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存