Android--序列化XML数据

简介:

什么是XML?

  首先我们先了解一下什么是XML。XML,可扩展标记语言 (Extensible Markup Language) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,这是百度百科的解释。而XML是一种在Internet中传输数据的常见格式,它与HTML一样,都是SGML(标准通用标记语言),无论你是需要通过Internet访问数据,或者发送数据给Web服务,都可能需要用到XML的知识。恰恰Android应用程序需要和网络交互,否则只是一款单机的无互动的应用程序,所以很可能在Android应用程序开发的过程中使用到XML。

  由于XML的扩展性强,致使它需要有稳定的基础规则来支持扩展,该语法规则需要注意的是:

  1. 开始和结束标签匹配。
  2. 嵌套标签不能相互嵌套。
  3. 区分大小写。

 

XML序列化

  当获取到一段数据后,如果需要把它序列化成XML的格式,通常有两种办法:

  1. 拼接字符串的形式序列化一个XML数据。
  2. 使用XmlSerializer类序列化一个XML数据。

  使用拼接字符串的方式很简单,就是个体力活,把需要序列化的对象,依照一定的格式序列化即可。下面通过一个示例讲解来演示如何拼接字符串,在示例中模拟联系人数据,然后对其进行序列化成XML,最后保存在SD卡上。

复制代码
 1     private void backupToContact1(){
 2         StringBuilder sbuilder=new StringBuilder();
 3         // 设置XML的数据头
 4         sbuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
 5         sbuilder.append("<contacts>");
 6         // 遍历联系人信息
 7         for(Contact contact:Contacts){
 8             if(contact!=null){
 9                 sbuilder.append("<contact id='"+contact.getId()+"'>");
10                 sbuilder.append("<name>");
11                 sbuilder.append(contact.getName());
12                 sbuilder.append("</name>");
13                 
14                 sbuilder.append("<number>");
15                 sbuilder.append(contact.getNumber());
16                 sbuilder.append("</number>");
17                 
18                 sbuilder.append("<address>");
19                 sbuilder.append(contact.getAddress());
20                 sbuilder.append("</address>");
21                 
22                 sbuilder.append("</contact>");
23             }
24         }            
25         sbuilder.append("</contacts>");
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     }
复制代码

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

复制代码
 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 <?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格式数据有特殊意义的符号,会导致拼接后的XML数据无法正常被解析。一般情况下,推荐使用XmlSerializer来序列化XML数据,使用XmlSerializer来序列化XML不存在这方面的问题,对于一些特殊符号,它会自动对其进行转义。




本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/android_XmlSerializer.html,如需转载请自行联系原作者


相关文章
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
47 1
|
4月前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
143 7
使用Java和XPath在XML文档中精准定位数据
|
19天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
3月前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
52 2
|
2月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
76 0
|
2月前
|
XML Web App开发 数据格式
HTML 页面显示 XML 数据
10月更文挑战第2天
|
2月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
388 0
|
4月前
|
存储 Java 数据库
基于全志H713 Android 11:给TvSettings添加default.xml默认值
本文介绍了在全志H713 Android 11平台上为TvSettings应用添加HDMI CEC功能的默认设置值的方法,通过修改SettingsProvider的源码和配置文件来实现默认值的设置,并提供了详细的步骤和测试结果。
90 0
基于全志H713 Android 11:给TvSettings添加default.xml默认值
|
4月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
99 1
|
4月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
93 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧