之前備份短信的時候生成xml都是手動拼寫的,有一個問題:當短信里面存在</body>這樣的標簽的時候,最后結果就不是完整的xml文件,顯然出錯。但是,今天使用序列化器的方式,就能有效的解決上邊遇到的問題。就看一下序列化器如何生成xml文件:
給活動定義一個布局文件,里面知識簡單的加入一個按鈕:
<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="備分短信" android:onClick="click"/>
看主活動中的代碼如下:
package com.itydl.xmlserializer;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.xmlpull.v1.XmlSerializer;import com.itydl.createxml.domain.Message;import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
//為了更好地保存不同,且負責的數據,使用xml序列器
public class MainActivity extends Activity {List<Message> smsList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 虛擬10條短信smsList = new ArrayList<Message>();for (int i = 0; i < 10; i++) {Message sms = new Message("小志好棒" + i, System.currentTimeMillis()+ "", "138" + i + i, "1");smsList.add(sms);}}public void click(View v){//使用xml序列化器生成xml文件。序列化器會把亂七八糟的東西(短信里有標簽屬性)過濾掉//1.拿到序列化器對象XmlSerializer xs = Xml.newSerializer();//2.初始化.因為涉及到xml文件,因此初始化也包含文件名和路徑File file = new File(Environment.getExternalStorageDirectory(),"sms.xml");try {FileOutputStream fos = new FileOutputStream(file);//enconding:指定用什么編碼生成xml文件xs.setOutput(fos, "utf-8");//setOutput(OutputStream os, String encoding) ,編碼方式默認u8//3.開始生成xml文件//enconding:指定頭結點中的enconding屬性的值xs.startDocument("utf-8", true);//生成頭結點(最高一行),startDocument(String encoding, Boolean standalone) xs.startTag(null, "message");//生成一個根節點,開始標簽節點for (Message sms : smsList) {xs.startTag(null, "sms");xs.startTag(null, "body");//start和end一對一對的寫。還有四個子節點xs.text(sms.getBody() + "<body>");//這樣不會報錯。而是把<body>當做了內容了xs.endTag(null, "body");xs.startTag(null, "date");xs.text(sms.getDate());xs.endTag(null, "date");xs.startTag(null, "type");xs.text(sms.getType());xs.endTag(null, "type");xs.startTag(null, "address");xs.text(sms.getAddress());xs.endTag(null, "address");xs.endTag(null, "sms");}xs.endTag(null, "message");//告訴序列化器,文件生成完畢xs.endDocument();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} }
}
當然,對sdcard寫,需要寫權限。加入即可:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
運行程序,點擊備份按鈕。我們可以在sdcard目錄找到這個文件:
導出來看一下里面的格式如下:
后邊省略,生成的xml文件是沒有問題的。看到即使文本里面出現了<body>標簽,也不會出現錯誤