Android:序列化XML資料

來源:互聯網
上載者:User

 什麼是XML?

  首先我們先瞭解一下什麼是XML。XML,可延伸標記語言 (XML) (Extensible Markup Language) ,用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料類型,是一種允許使用者對自己的標記語言進行定義的源語言,這是百度百科的解釋。而XML是一種在Internet中傳輸資料的常見格式,它與HTML一樣,都是SGML(標準通用標記語言 (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"/>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.