在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。
Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。
原理:将XML内容读取到一个字符数组中,switch,不同的元素触发不同的事件。
解析XML:
为了方便获取,XML文件直接放在SRC目录下
写一个java bean用来存储数据,在业务类中编写解析方法。
调用业务方法进行解析
测试时获得InputStream 类型的XML:this.getClass().getClassLoader().getResourceAsStream("person.xml");
parser.next()可以进入下一个元素并触发相应事件
空白节点属于文本节点,不处理
parser.nextText()可获得下一个文本节点的文本值
public static List<Person> getPersons(InputStream xml)throws Exception{
XmlPullParser parser=Xml.newPullParser();
List<Person> persons=null;
Person person=null;
parser.setInput(xml, "UTF-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
switch(event){
case XmlPullParser.START_DOCUMENT:
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
person=new Person();
Integer id=new Integer(parser.getAttributeValue(0));
person.setId(id);
}else if("name".equals(parser.getName())){
person.setName(parser.nextText());
}else if("age".equals(parser.getName())){
person.setAge(new Integer(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){//这一句,试验时忘了加
persons.add(person);
person=null;
}
break;
}
event=parser.next();
}
return persons;
}
}
案例错误:
业务方法中case XmlPullParsr.END_TAG: 忘了判断"person".equals(parser.getName());
测试时没有在清单文件中添加测试环境。