通过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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现