1、Pull解析简介
Pull解析是Android系统内置的一种对XML的解析方式,它与SAX解析方式基本一致,都包括开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。但是它们不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为它触发的事件并不是一个方法,而是一个数字,至于触发的时间要不要处理,这个可以由程序员自己来决定。2、五个常量事件
Pull解析器返回的是一个数字,类似于一个信号。我们在Android的网络处理中,也常常使用数字作为处理的标识,比如我们常用的Handler机制。Pull解析器为我们定义了五个常量,如下:XmlPullParser.START_DOCUMENT;(开始对文档的解析)
XmlPullParser.START_TAG;(开始对元素的解析)
XmlPullParser.TEXT;(解析文本)
XmlPullParser.END_TAG;(开始对元素的解析)
XmlPullParser.END_DOCUMENT;(结束对文档的解析)
最常用的方法是:
parser.getEventType(); // 触发事件,开始解析
parser.next(); // 解析下一个事件
parser.getAttributeValue(); //获得相应属性的值
3、解析XML文档
步骤不多说,序列化,得到方法,设置参数,开始解析。示例代码如下:
public static List<Person> getPersons(InputStream inStream) throws Exception{
Person person = null;
List<Person> persons = null;
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(inStream, "UTF-8");
int event = pullParser.getEventType();//触发第一个事件
while(event!=XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(pullParser.getName())){
int id = new Integer(pullParser.getAttributeValue(0));
person = new Person();
person.setId(id);
}
if(person!=null){
if("name".equals(pullParser.getName())){
person.setName(pullParser.nextText());
}
if("age".equals(pullParser.getName())){
person.setAge(new Short(pullParser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullParser.getName())){
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();
}
return persons;
}
4、生成XML文件
在SAX对XML文档的解析中,我们提到过,SAX解析不支持文件的修改、生成,那么Pull解析呢?Pull解析是支持对文件的修改的。
实现XML的序列化:
XmlSerializer serializer = Xml.newSerializer();
指定输出接口信息:
serializer.setOutput(outStream, "UTF-8");
serializer.startDocument("UTF-8", true);
标签的开始和结束:
serializer.startTag(null, "persons");
serializer.endTag(null, "persons");
解析代码如下:
for(Person person : persons){
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
记得关闭流文件:
outStream.flush();
outStream.close();