通過XmlSerializer接口來生成xml文件


xml文件我們可以用來保存一些數據。例如用來備份短信。這個例子中,我們就用XmlSerializer接口來實現一個備份短信的程序。當然了,為了程序簡單化,這個程序我們並不是真的去備份短信。我們通過一個Message.java文件來作為javabean使用。用他來虛擬一個短信類。然后我們來備份虛擬出來的內容。

備份后,會在對應的目錄下生成一個xml文件。我們可以用瀏覽器來打開,解析出xml來看。

 先看程序運行效果。

然后我們直接看代碼,對了,清單文件我就不弄上來了。清單文件沒什么,因為要向sd卡寫文件嘛,所以要添加個向sd卡寫入的權限

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

下面看我生成的xml文件,運行程序后,便會在sd卡的根目錄下生成info.xml的文件。下面是我用瀏覽器打開后解析的效果。

下面看代碼

首先是布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.savexml.MainActivity" >

    <Button
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

然后是java文件(兩個類)

首先是Message.java (這個類的作用主要是用來做短信類而已,作為javabean的作用)

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

package com.example.savexml;

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 android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

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();

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM