Android下使用Pull解析器
1,Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件。
2,使用parser.next()可以进入下一个元素并触发相应事件。
3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理。
4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
5,相关API:
获得当前节点事件类型:parser.getEventType();
获得下一节点事件类型:parser.next();
获得标签属性值: parser.getAttributeValue();
获得标签后面文本内容:parser.nextText();
例子:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id=“18">
<name>allen</name>
<age>36</age>
</person>
<person id=“28">
<name>james</name>
<age>25</age>
</person>
</persons>
// 使用Pull解析器生成XML文件,并写到本地
private void writeXmlToLocal() {
List<Person> personList = getPersonList();
// 获得序列化对象
XmlSerializer serializer = Xml.newSerializer();
// XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
try {
File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
FileOutputStream fos = new FileOutputStream(path);
// 指定序列化对象输出的位置和编码
serializer.setOutput(fos, "utf-8");
// 写开始 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
serializer.startDocument("utf-8", true);
serializer.startTag(null, "persons"); // <persons>
for (Person person : personList) {
// 开始写person
serializer.startTag(null, "person"); // <person>
serializer.attribute(null, "id", String.valueOf(person.getId()));
// 写person的name
serializer.startTag(null, "name"); // <name>
serializer.text(person.getName());
serializer.endTag(null, "name"); // </name>
// 写person的age
serializer.startTag(null, "age"); // <age>
serializer.text(String.valueOf(person.getAge()));
serializer.endTag(null, "age"); // </age>
serializer.endTag(null, "person"); // </person>
}
serializer.endTag(null, "persons"); // </persons>
serializer.endDocument(); // 结束
} catch (Exception e) {
e.printStackTrace();
}
}
// 使用Pull解析器读取本地的XML文件
private List<Person> parserXmlFromLocal() {
try {
File path = new File(Environment.getExternalStorageDirectory(), "persons.xml");
FileInputStream fis = new FileInputStream(path);
// 获得pull解析器对象
XmlPullParser parser = Xml.newPullParser();
// XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
// 指定解析的文件和编码格式
parser.setInput(fis, "utf-8");
// 获得事件类型
int eventType = parser.getEventType();
List<Person> personList = null;
Person person = null;
String id;
while(eventType != XmlPullParser.END_DOCUMENT) {
// 获得当前节点的名称
String tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG: // 当前等于开始节点 <person>
if("persons".equals(tagName)) { // <persons>
personList = new ArrayList<Person>();
} else if("person".equals(tagName)) { // <person id="1">
person = new Person();
id = parser.getAttributeValue(null, "id");
person.setId(Integer.valueOf(id));
} else if("name".equals(tagName)) { // <name>
person.setName(parser.nextText());
} else if("age".equals(tagName)) { // <age>
person.setAge(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG: // </persons>
if("person".equals(tagName)) {
// 需要把上面设置好值的person对象添加到集合中
personList.add(person);
}
break;
default:
break;
}
// 获得下一个事件类型
eventType = parser.next();
}
return personList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Android下使用pull解析器生成XML文件、读取XML文件
原文地址:http://blog.csdn.net/wodewutai17quiet/article/details/46419981