1. 程式人生 > >_042_Android_使用Serializer去生成xml檔案

_042_Android_使用Serializer去生成xml檔案

轉自https://www.cnblogs.com/linfenghp/p/5393832.html,感謝作者的無私分享。

xml檔案我們可以用來儲存一些資料。例如用來備份簡訊。這個例子中,我們就用XmlSerializer介面來實現一個備份簡訊的程式。當然了,為了程式簡單化,這個程式我們並不是真的去備份簡訊。我們通過一個Message.java檔案來作為javabean使用。用他來虛擬一個簡訊類。然後我們來備份虛擬出來的內容。

備份後,會在對應的目錄下生成一個xml檔案。我們可以用瀏覽器來開啟,解析出xml來看。

            直接看程式碼,對了,清單檔案我就不弄上來了。清單檔案沒什麼,因為要向sd卡寫檔案嘛,所以要添加個向sd卡寫入的許可權

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Message.java檔案:

package com.example.savexml;

public class Message {

    // 定義簡訊內容
    private String body;
    // 定義簡訊日期
    private String date;
    // 定義發件人號碼
    private String address;
    // 定義收發型別
    private String type;

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Message(String body, String date, String address, String type) {
        super();
        this.body = body;
        this.date = date;
        this.address = address;
        this.type = type;
    }

}

MainActivity.java:

public class MainActivity extends Activity {

    List<Message> smsList;
    private Button btButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 存放簡訊的集合
        smsList = new ArrayList<Message>();
        // 虛擬出20條簡訊
        for (int i = 0; i <= 20; i++) {
            Message msm = new Message("簡訊內容" + i, System.currentTimeMillis()
                    + "", "10086", "1");
            smsList.add(msm);
        }
        btButton = (Button) findViewById(R.id.bt);
        btButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    backup();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

    }

    private void backup() throws IOException {
        // 拿到xml序列化器
        XmlSerializer xs = Xml.newSerializer();
        // 包裝外部儲存路徑
        File file = new File(Environment.getExternalStorageDirectory(),
                "info.xml");
        FileOutputStream fos = null;
        try {
            // 用輸出流輸出info.xml
            fos = new FileOutputStream(file);
            // 指定用utf-8編碼生成檔案
            xs.setOutput(fos, "UTF_8");
            // 生成xml表頭,兩個引數表示表頭屬性
            xs.startDocument("UTF-8", true);
            // 生成根節點
            /*
             * 其實拼接的過程有點像寫html檔案, 無非就是一對標籤,一對標籤的寫而已。
             * 從程式碼可以看出,xs.startTag(),表示標籤開始,endTag()表示標籤結束。
             * 第二個引數表示節點名稱。
             */
            xs.startTag(null, "message");
            for (Message sms : smsList) {
                xs.startTag(null, "sms");

                xs.startTag(null, "body");
                xs.text(sms.getBody());
                xs.endTag(null, "body");

                xs.startTag(null, "date");
                xs.text(sms.getDate());
                xs.endTag(null, "date");

                xs.startTag(null, "address");
                xs.text(sms.getAddress());
                xs.endTag(null, "address");

                xs.startTag(null, "type");
                xs.text(sms.getType());
                xs.endTag(null, "type");

                xs.endTag(null, "sms");
            }
            xs.endTag(null, "message");

            // 表示文件生成結束
            xs.endDocument();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                fos.close();
                Log.i("Back", "33333");
            }
        }
        Toast.makeText(this, "備份完成", 0).show();

    }
}