a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統(tǒng) > Android > 正文

Android序列化XML數(shù)據(jù)

2020-04-11 12:01:09
字體:
供稿:網(wǎng)友
什么是XML?
首先我們先了解一下什么是XML。XML,可擴(kuò)展標(biāo)記語言 (Extensible Markup Language) ,用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言,這是百度百科的解釋。而XML是一種在Internet中傳輸數(shù)據(jù)的常見格式,它與HTML一樣,都是SGML(標(biāo)準(zhǔn)通用標(biāo)記語言),無論你是需要通過Internet訪問數(shù)據(jù),或者發(fā)送數(shù)據(jù)給Web服務(wù),都可能需要用到XML的知識。恰恰Android應(yīng)用程序需要和網(wǎng)絡(luò)交互,否則只是一款單機(jī)的無互動的應(yīng)用程序,所以很可能在Android應(yīng)用程序開發(fā)的過程中使用到XML。
由于XML的擴(kuò)展性強(qiáng),致使它需要有穩(wěn)定的基礎(chǔ)規(guī)則來支持?jǐn)U展,該語法規(guī)則需要注意的是:
開始和結(jié)束標(biāo)簽匹配。
嵌套標(biāo)簽不能相互嵌套。
區(qū)分大小寫。

XML序列化
當(dāng)獲取到一段數(shù)據(jù)后,如果需要把它序列化成XML的格式,通常有兩種辦法:
拼接字符串的形式序列化一個(gè)XML數(shù)據(jù)。
使用XmlSerializer類序列化一個(gè)XML數(shù)據(jù)。
使用拼接字符串的方式很簡單,就是個(gè)體力活,把需要序列化的對象,依照一定的格式序列化即可。下面通過一個(gè)示例講解來演示如何拼接字符串,在示例中模擬聯(lián)系人數(shù)據(jù),然后對其進(jìn)行序列化成XML,最后保存在SD卡上。
復(fù)制代碼 代碼如下:

private void backupToContact1(){
        StringBuilder sbuilder=new StringBuilder();
        // 設(shè)置XML的數(shù)據(jù)頭
        sbuilder.append("<?xml version=/"1.0/" encoding=/"utf-8/"?>");
        sbuilder.append("<contacts>");
        // 遍歷聯(lián)系人信息
        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卡上創(chuàng)建一個(gè)xml文件
            File file=new File(Environment.getExternalStorageDirectory(),"backup1.xml");
            FileOutputStream fos=new FileOutputStream(file);
            // 把序列化的數(shù)據(jù)寫入到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();
        }
    }

執(zhí)行完之后,可以把SD卡上的XML文件導(dǎo)出到電腦上,查看其內(nèi)容。
對于拼接字符串而言,可以看出,很容易出錯(cuò),尤其是每個(gè)標(biāo)簽內(nèi)如果還存在屬性值就更需要細(xì)心了。而且如果其內(nèi)容存在特殊的符號,如“<、>”等,就會導(dǎo)致XML序列化后的XML文件出錯(cuò),而使用XmlSerializer來序列化XML文件就不存在這些問題。
下面介紹第二種方式,通過XmlSerializer類來序列化XML。那先了解一下XmlSerializer,XmlSerializer主要是是以數(shù)據(jù)流的形式序列化XML,而它是一個(gè)接口類型,無法直接實(shí)例化,需要通過一個(gè)靜態(tài)方法Xml.newSerializer()獲取對象。
以下是一些常用方法:
setOutput(OutputStream,String):設(shè)置輸出流,以及編碼格式。
startDocument(String,boolean):第一個(gè)參數(shù)設(shè)置文檔的編碼格式,第二個(gè)參數(shù)設(shè)置是否是一個(gè)獨(dú)立的文檔,一般設(shè)置為true。
endDocument():標(biāo)記XML文檔的結(jié)束,XML文檔標(biāo)簽均為成對出現(xiàn),有始有終。
startTag(String,String):一個(gè)XML標(biāo)簽的開始,第一個(gè)參數(shù)為命名空間,一般為null即可,第二個(gè)參數(shù)為標(biāo)簽名。
endTag(String,String):一個(gè)XML標(biāo)簽的結(jié)束,第一個(gè)參數(shù)為命名空間,一般為null即可,第二個(gè)參數(shù)為標(biāo)簽名,有始有終。
attribute(String,String,String):設(shè)置一個(gè)標(biāo)簽的屬性,第一個(gè)參數(shù)為命名空間,第二個(gè)參數(shù)是屬性名,第三個(gè)參數(shù)為屬性值。
上面已經(jīng)介紹過了XmlSerializer的常用方法,下面通過一個(gè)示例來演示XmlSerializer的使用。在示例中實(shí)現(xiàn)的功能和上面拼接字符串序列化XML一致,都是序列化模擬的聯(lián)系人信息,然后以XML的格式保存在SD卡上。  
復(fù)制代碼 代碼如下:

private void backupToContact2(){
        try {
            // 在SD卡上創(chuàng)建一個(gè)文件
            File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml");
            FileOutputStream fos=new FileOutputStream(file);
            // 獲取一個(gè)XmlSerializer
            XmlSerializer serializer = Xml.newSerializer();
            // 設(shè)置XML的輸出流以及編碼格式
            serializer.setOutput(fos,"utf-8");
            // 設(shè)置文檔的開頭,以及編碼格式
            serializer.startDocument("utf-8", true);

            // 開始標(biāo)簽
            serializer.startTag(null, "contacts");
            for(Contact contact:Contacts){
                serializer.startTag(null, "contact");
                // 設(shè)置contact標(biāo)簽的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");
            }
            // 一個(gè)結(jié)束標(biāo)簽
            serializer.endTag(null, "contacts");
            // 標(biāo)記文檔的結(jié)束
            serializer.endDocument();
            // 關(guān)閉輸出流
            fos.close();
            Toast.makeText(MainActivity.this, "備份成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "備份失敗", 0).show();
        }       
    }

保存成功之后,可以通過File Explorer導(dǎo)出XML文件查看其內(nèi)容,上面兩個(gè)示例序列化的XML文件一致,如下:
復(fù)制代碼 代碼如下:

<?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卡寫入權(quán)限:
復(fù)制代碼 代碼如下:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: www97影院 | 成人看片免费 | 色av综合| 国产精品久久久一区二区 | 精品99在线 | 天天综合永久入口 | 国产91大片| 亚洲网站免费看 | 精品久久久久久久久久久久久久 | 中文字幕毛片 | 国产一区二区三区免费视频 | 日本色视频 | 精品中文字幕一区 | 99精品欧美一区二区蜜桃免费 | 亚洲精品福利 | 亚洲精品久久久久久久久久久 | 综合二区| 精品国产一区二区三区成人影院 | 男人的天堂视频 | 国产精品久久久久久亚洲调教 | 成人久久久精品国产乱码一区二区 | 国产精品一区一区三区 | 日韩欧美精品在线 | 久久99深爱久久99精品 | 男人的天堂视频 | 国产日韩视频在线观看 | 国产精品8 | 久久精品国产99国产 | 欧美jizz18性欧美 | 一级篇| 一级篇| 亚洲va中文字幕 | 免费观看一级特黄欧美大片 | 岛国一区 | 精久视频 | 中文字幕一区二区在线观看 | 91高清免费 | 精品久久久久久久久久久久久久 | 精品一区视频 | 欧美日韩中字 | 一区二区三区四区在线播放 |