萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> Android:序列化XML數據

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
						
copyright © 萬盛學電腦網 all rights reserved