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

    }
}

 

posted @ 2016-04-15 01:36  _Vincent  阅读(4332)  评论(2编辑  收藏  举报