上一篇介绍了如何序列化一份xml文件,那接下来必不可少的肯定是解析它了,那现在我们就来解析一下上一篇生成的那份xml文件。如下:对了,方便起见,这份msmInfo.xml文件我把它放到src根目录下
序列化xml用的是XmlSerializer,那相应的解析就是用的XmlPullParser。具体要怎么做呢?
解析过程XmlParserService.java
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Xml;
import com.example.practice.domino.MsmInfo;
public class XmlParserService {
public static List<MsmInfo> xmlMsmParser(InputStream inputStream)
throws XmlPullParserException, IOException {
List<MsmInfo> msmlist = null;
MsmInfo msmInfo = null;
XmlPullParser parser = Xml.newPullParser();// 新建一个Xml Pull Parser
parser.setInput(inputStream, "utf-8");// 设置输入流解析器将开始。这个调用重置解析器的状态并设置初始值START_DOCUMENT事件类型
int eventType = parser.getEventType();// 返回当前事件的类型(START_TAG、END_TAG、文本等)。
while (eventType != XmlPullParser.END_DOCUMENT) {// 只要文档没结束,循环一直执行
switch (eventType) {
case XmlPullParser.START_TAG:// 当事件类型为START_TAG时,也就是解析到开始标签
if ("msms".equals(parser.getName())) {
msmlist = new ArrayList<MsmInfo>();
} else if ("msm".equals(parser.getName())) {
msmInfo = new MsmInfo();
int id = Integer.parseInt(parser.getAttributeValue(0));// 解析当前标签的属性
msmInfo.setId(id);
} else if ("type".equals(parser.getName())) {
int type = Integer.parseInt(parser.nextText().trim());
msmInfo.setType(type);
} else if ("date".equals(parser.getName())) {
long date = Long.parseLong(parser.nextText().trim());
msmInfo.setDate(date);
} else if ("address".equals(parser.getName())) {
String address = parser.nextText().trim();
msmInfo.setAddress(address);
} else if ("content".equals(parser.getName())) {
String content = parser.nextText().trim();
msmInfo.setContent(content);
}
break;
case XmlPullParser.END_TAG:// 当事件类型为END_TAG时,也就是解析到结束标签
if ("msm".equals(parser.getName())) {
msmlist.add(msmInfo);// 将对象添加到集合
msmInfo = null;// 重置短信对象
}
break;
}
eventType = parser.next();// 游标下移,继续解析下一个对象,切记:这个不可少
}
return msmlist;
}
}
呐,我们肯定不会只解析就放那里不管了,当然要把解析到的内容显示出来嘛,代码如下:
//得到msmInfo.xml文件的输入流
InputStream inputStream = XmlParse_Aty.class.getClassLoader()
.getResourceAsStream("msmInfo.xml");
try {
List<MsmInfo> msmList = XmlParserService
.xmlMsmParser(inputStream);
StringBuffer buffer = new StringBuffer();
for (MsmInfo msmInfo2 : msmList) {
buffer.append(msmInfo2.toString());
buffer.append("\n\n");
}
textView.setText(buffer.toString());
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MsmInfo.java
public class MsmInfo {
private int id;
private int type;// 1发送,0接收
private long date;// 短信时间
private String address;// 收件人or发件人
private String content;// 短信内容
public MsmInfo() {
}
public MsmInfo(int id, int type, long date, String address, String content) {
this.id = id;
this.type = type;
this.date = date;
this.address = address;
this.content = content;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public long getDate() {
return date;
}
public void setDate(long date) {
this.date = date;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "[id=" + id + ", type=" + type + ", 时间=" + date + ", 电话=" + address + ", 短信内容=" + content + "]";
}
}
到这里简单的代码思路就完成啦!