什麼是XML?
首先我們先了解一下什麼是XML。XML,可擴展標記語言 (Extensible Markup Language) ,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言,這是百度百科的解釋。而XML是一種在Internet中傳輸數據的常見格式,它與HTML一樣,都是SGML(標准通用標記語言),無論你是需要通過Internet訪問數據,或者發送數據給Web服務,都可能需要用到XML的知識。恰恰Android應用程序需要和網絡交互,否則只是一款單機的無互動的應用程序,所以很可能在Android應用程序開發的過程中使用到XML。
由於XML的擴展性強,致使它需要有穩定的基礎規則來支持擴展,該語法規則需要注意的是:
XML序列化
當獲取到一段數據後,如果需要把它序列化成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()獲取對象。
以下是一些常用方法:
上面已經介紹過了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