4.5使用pull解析XML文件
4.5.1使用序列化生成xml
/** * 写xml文件到本地 */
private void writeXmlToLocal(){
List<Person> personList = getPersonList();
//获取序列化对象
XmlSerializer serializer = Xml.newSerializer();
try {
File path = new File(Environment.getExternalStorageDirectory(),"person.xml");
FileOutputStream fos = new FileOutputStream(path);
//指定序列化对象输出的位置和编码
serializer.setOutput(fos,"utf-8");
serializer.startDocument("utf-8",true);//写开始信息<?xml version="1.0" encoding="utf-8" standalone="true"?>
serializer.startTag(null,"persons");//<persons>
for(Person person:personList){
//开始写人
serializer.startTag(null,"person");//<person>
serializer.attribute(null,"id",String.valueOf(person.getId()));
//写名字
serializer.startTag(null,"name");
serializer.text(person.getName());
serializer.endTag(null,"name");
//写年龄
serializer.startTag(null,"age");
serializer.text(String.valueOf(person.getAge()));
serializer.endTag(null,"age");
serializer.endTag(null,"person");//</person>
}
serializer.endTag(null,"persons");//</persons>
serializer.endDocument();//结束
} catch (Exception e) {
// TODO: handle exception
}
}
4.5.2使用pull解析xml
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。
下面是本例子要解析的XML文件:
private List<Person> parseXmlFromLocal(){
try {
File path = new File(Environment.getExternalStorageDirectory(),"person.xml");
FileInputStream fis = new FileInputStream(path);
//获得pull解析器对象
XmlPullParser parser = Xml.newPullParser();
//指定解析的文件和编码格式
parser.setInput(fis,"utf-8");
//获得事件类型
int eventType = parser.getEventType();
List<Person> personList = null;
Person person = null;
while(eventType!=XmlPullParser.END_DOCUMENT){
String tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if("persons".equals(tagName)){
personList = new ArrayList<Person>();
}else if("person".equals(tagName)){
person = new Person();
person.setId(Integer.parseInt(parser.getAttributeValue(null,"id")));
}else if("name".equals(tagName)){
person.setName(parser.nextText());
}else if("age".equals(tagName)){
person.setAge(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if("person".equals(tagName)){
//需要把上面设置好的person对象添加到集合中
personList.add(person);
}
default:
break;
}
eventType = parser.next();//获取下一个时间类型
}
return personList;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}