有时候,在android上需要使用xml存储数据,那又该怎样保存和读取xml文件呢?
1、序列化文件
举个例子,要保存成如下的xml文件格式:
代码如下:
private boolean storeStudent2Local() {
try {
// 创建序列化对象
XmlSerializer serializer = Xml.newSerializer();
FileOutputStream fos = new FileOutputStream(path);
serializer.setOutput(fos, "utf-8");//设置输出流及其编码方式
serializer.startDocument("utf-8", true);// 文档的开始
serializer.startTag(null, "infos");//节点的开始
for (Student student : listStudent) {
serializer.startTag(null, "student");
serializer.startTag(null, "name");
serializer.text(student.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "sex");
serializer.text(student.getSex());
serializer.endTag(null, "sex");
serializer.startTag(null, "age");
serializer.text(String.valueOf(student.getAge()));
serializer.endTag(null, "age");
serializer.endTag(null, "student");
}
serializer.endTag(null, "infos");
serializer.endDocument();// 文档结束
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
2、读取xml文件
读取文件也是从上到下,一个节点一个节点得读的
private boolean restoreStudentFromLocal() {
try {
XmlPullParser parser = Xml.newPullParser();//获取xml解析器
parser.setInput(new FileInputStream(path), "utf-8");//设置输入流以及解码方式
int eventType = parser.getEventType();
listStudent.clear();
Student stu = null;
String tagName = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if ("infos".equals(tagName)) {//如果头结点,就创建学生集合
listStudent = new ArrayList();
} else if ("student".equals(tagName)) {
stu = new Student();
} else if ("name".equals(tagName)) {
stu.setName(parser.getText());
} else if ("sex".equals(tagName)) {
stu.setSex(parser.getText());
} else if ("age".equals(tagName)) {
stu.setAge(Integer.parseInt(parser.getText()));
}
break;
case XmlPullParser.END_TAG://假如是节点,就把student加入到集合中
if ("student".equals(tagName)) {
listStudent.add(stu);
}
break;
default:
break;
}
eventType = parser.next();//解析下一个节点
}
refreshStudentList();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}