Android序列化XML數(shù)據(jù)
首先我們先了解一下什么是XML。XML,可擴(kuò)展標(biāo)記語(yǔ)言 (Extensible Markup Language) ,用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言,可以用來(lái)標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類(lèi)型,是一種允許用戶(hù)對(duì)自己的標(biāo)記語(yǔ)言進(jìn)行定義的源語(yǔ)言,這是百度百科的解釋。而XML是一種在Internet中傳輸數(shù)據(jù)的常見(jiàn)格式,它與HTML一樣,都是SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言),無(wú)論你是需要通過(guò)Internet訪問(wèn)數(shù)據(jù),或者發(fā)送數(shù)據(jù)給Web服務(wù),都可能需要用到XML的知識(shí)。恰恰Android應(yīng)用程序需要和網(wǎng)絡(luò)交互,否則只是一款單機(jī)的無(wú)互動(dòng)的應(yīng)用程序,所以很可能在Android應(yīng)用程序開(kāi)發(fā)的過(guò)程中使用到XML。
由于XML的擴(kuò)展性強(qiáng),致使它需要有穩(wěn)定的基礎(chǔ)規(guī)則來(lái)支持?jǐn)U展,該語(yǔ)法規(guī)則需要注意的是:
開(kāi)始和結(jié)束標(biāo)簽匹配。
嵌套標(biāo)簽不能相互嵌套。
區(qū)分大小寫(xiě)。
XML序列化
當(dāng)獲取到一段數(shù)據(jù)后,如果需要把它序列化成XML的格式,通常有兩種辦法:
拼接字符串的形式序列化一個(gè)XML數(shù)據(jù)。
使用XmlSerializer類(lèi)序列化一個(gè)XML數(shù)據(jù)。
使用拼接字符串的方式很簡(jiǎn)單,就是個(gè)體力活,把需要序列化的對(duì)象,依照一定的格式序列化即可。下面通過(guò)一個(gè)示例講解來(lái)演示如何拼接字符串,在示例中模擬聯(lián)系人數(shù)據(jù),然后對(duì)其進(jìn)行序列化成XML,最后保存在SD卡上。
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ù)寫(xiě)入到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)容。
對(duì)于拼接字符串而言,可以看出,很容易出錯(cuò),尤其是每個(gè)標(biāo)簽內(nèi)如果還存在屬性值就更需要細(xì)心了。而且如果其內(nèi)容存在特殊的符號(hào),如“<、>”等,就會(huì)導(dǎo)致XML序列化后的XML文件出錯(cuò),而使用XmlSerializer來(lái)序列化XML文件就不存在這些問(wèn)題。
下面介紹第二種方式,通過(guò)XmlSerializer類(lèi)來(lái)序列化XML。那先了解一下XmlSerializer,XmlSerializer主要是是以數(shù)據(jù)流的形式序列化XML,而它是一個(gè)接口類(lèi)型,無(wú)法直接實(shí)例化,需要通過(guò)一個(gè)靜態(tài)方法Xml.newSerializer()獲取對(duì)象。
以下是一些常用方法:
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)簽均為成對(duì)出現(xiàn),有始有終。
startTag(String,String):一個(gè)XML標(biāo)簽的開(kāi)始,第一個(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)介紹過(guò)了XmlSerializer的常用方法,下面通過(guò)一個(gè)示例來(lái)演示XmlSerializer的使用。在示例中實(shí)現(xiàn)的功能和上面拼接字符串序列化XML一致,都是序列化模擬的聯(lián)系人信息,然后以XML的格式保存在SD卡上?! ?BR>
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è)置文檔的開(kāi)頭,以及編碼格式
serializer.startDocument("utf-8", true);
// 開(kāi)始標(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();
}
}
保存成功之后,可以通過(guò)File Explorer導(dǎo)出XML文件查看其內(nèi)容,上面兩個(gè)示例序列化的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>
在示例中,訪問(wèn)了SD卡,所以需要在清單文件中加入SD卡寫(xiě)入權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
相關(guān)文章
詳解Android如何實(shí)現(xiàn)自定義的動(dòng)畫(huà)曲線(xiàn)
最近在寫(xiě)動(dòng)畫(huà)相關(guān)的篇章,經(jīng)常會(huì)用到 Curve 這個(gè)動(dòng)畫(huà)曲線(xiàn)類(lèi),那這個(gè)類(lèi)到底怎么實(shí)現(xiàn)的?如果想自己來(lái)一個(gè)自定義的動(dòng)畫(huà)曲線(xiàn)該怎么弄?本文將為大家詳細(xì)解答2022-04-04
Android設(shè)置TextView樣式SpannableString教程
這篇文章主要為大家介紹了Android設(shè)置TextView樣式SpannableString教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
解決Android Studio一直停留在MyApplication:syncing的問(wèn)題
這篇文章主要介紹了Android Studio一直停留在MyApplication:syncing的完美解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Android 自定義ContentProvider簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android 自定義ContentProvider簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
一文徹底了解Android中的線(xiàn)程和線(xiàn)程池
眾所周知線(xiàn)程池能很高地提升程序的性能,下面這篇文章主要給大家介紹了關(guān)于Android中線(xiàn)程和線(xiàn)程池的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Android輕量級(jí)存儲(chǔ)SharedPreferences?MMKV?Jetpack?DataStore方案
這篇文章主要為大家介紹了Android輕量級(jí)存儲(chǔ)SharedPreferences?MMKV?Jetpack?DataStore方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Android開(kāi)發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能,涉及Android權(quán)限控制及屏幕亮度相關(guān)屬性操作技巧,需要的朋友可以參考下2018-03-03
eclipse中運(yùn)行monkeyrunner腳本之環(huán)境搭建(4)
這篇文章主要為大家詳細(xì)介紹了eclipse中運(yùn)行monkeyrunner腳本之環(huán)境搭建的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Kotlin開(kāi)發(fā)中open關(guān)鍵字與類(lèi)名函數(shù)名和變量名的使用方法淺析
這篇文檔中,我們將解釋如何以及為什么將 open 關(guān)鍵字與類(lèi)名、函數(shù)名和變量名一起使用,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的2023-02-02

