Android序列化XML資料

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

什麼是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序列化過程ParcelableAndroid應用中使用XmlSerializer序列化XML資料的教程解析Android中的Serializable序列化Android中Serializable和Parcelable序列化物件詳解Android中的Parcelable序列化物件Android中的序列化淺析Android xml檔案的序列化實現程式碼Android 序列化的儲存和讀取總結及簡單使用

相關文章

Android 開發 最新文章