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