在上一篇博客中介绍了使用xml序列化器保存数据,并且使用xml保存了模拟的10条短信,这篇博客介绍使用pull解析以xml方式保存在本地的那10条短信
和上一篇博客一样首先制作一个下图所示的界面,单击按钮后可以解析xml文件
点击解析xml文件按钮后,会在控制台中看到解析后的数据
实现方式,首先使用Android Studio创建一个Android工程,并且创建一个Message类用于处理短信数据
Message类中的代码如下
package com.fyt.resolvexml;
//创建一个Message类,用于处理短信数据
public class Message {
//短信的内容
private String body;
//短信的发送日期
private String date;
//收信人的地址(收信人的手机号码)
private String address;
//短信的类型
//0表示短信是发出去的
//1表示短信是收到的
private String type;
//无参构造方法
public Message() {
}
//构造方法
public Message(String body, String date, String address, String type) {
this.body = body;
this.date = date;
this.address = address;
this.type = 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;
}
@Override
public String toString() {
return "Message{" +
"body='" + body + '\'' +
", date='" + date + '\'' +
", address='" + address + '\'' +
", type='" + type + '\'' +
'}';
}
}
然后修改MainActivity.java中的代码
package com.fyt.resolvexml;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
import org.xmlpull.v1.XmlPullParser;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
//用于创建储存短信的集合
private List<Message> messageList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//解析xml文件
public void resolveXml(View view) {
//如果SD卡的状态为正常挂载状态
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//创建File对象
//参数为用户名和密码的储存路径
File file = new File("sdcard/sms.xml");
//如果SD卡中存在sms.xml文件
if (file.exists()) {
//捕获文件操作中可能出现的异常
try {
//获得SD卡下的sms.xml文件
FileInputStream fis = new FileInputStream(file);
//获得pull解析器对象
XmlPullParser xp = Xml.newPullParser();
//将文件以gbk编码的方式输入到xml中
xp.setInput(fis, "utf-8");
//获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
int type = xp.getEventType();
//创建信息对象(用于处理短信数据)
Message message = null;
while(type != XmlPullParser.END_DOCUMENT)
{
//根据节点的类型,要做不同的操作
switch (type)
{
case XmlPullParser.START_TAG:
//获取当前节点的名字
if("message".equals(xp.getName()))
{
//创建一个用于保存短信的集合
messageList = new ArrayList<Message>();
}
else if("sms".equals(xp.getName()))
{
//创建短信对象
message = new Message();
}
else if("body".equals(xp.getName()))
{
//获取当前节点的下一个节点的文本
String body = xp.nextText();
message.setBody(body);
}
else if("date".equals(xp.getName()))
{
//获取当前节点的下一个节点的文本
String date = xp.nextText();
message.setDate(date);
}
else if("address".equals(xp.getName()))
{
//获取当前节点的下一个节点的文本
String address = xp.nextText();
message.setAddress(address);
}
else if("type".equals(xp.getName()))
{
String Type = xp.nextText();
message.setType(Type);
}
break;
case XmlPullParser.END_TAG:
if("sms".equals(xp.getName()))
{
//把city的javabean放入集合中
messageList.add(message);
}
break;
}
//把指针移动到下一个节点,并返回该节点的事件类型
type = xp.next();
}
for (Message m : messageList)
{
System.out.println(m.toString());
}
//处理文件操作中产生的异常
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
最后在配置文件中添加两条权限
<!--对SD卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--对SD卡的读取权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>