Pull简介
1.常见的XML解析方式有三种,DOM、SAX、Pull,Android系统中推荐使用Pull
2.Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目
3.Android SDK中已经集成了Pull解析器,无需添加任何jar文件
4.Pull解析器运行方式与SAX类似,提供各种事件的判断
5.官方网站:http://xmlpull.org/
使用Pull解析器解析XML文件
1. Xml.newPullParser() 获得解析器
2 parser.setInput(in, "UTF-8") 设置输入流以及编码
3. parser.next() 获取下一个解析事件,得到一个事件代码
4. XmlPullParser中定义了常量来标识各种解析事件
START_DOCUMENT、END_DOCUMENT 、START_TAG 、END_TAG 、TEXT
1.使用pull解析xml
person.xml文件,需要解析的源文件
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="20">
<name>zizhu</name>
<age>20</age>
</person>
<person id="30">
<name>zizhu5</name>
<age>22</age>
</person>
</persons>
解析代码:
/**
* @param is 输入流
* @return
* @throws Exception
*/
public List<Person> getPersons(InputStream is) throws Exception{
List<Person> persons = null;
Person person = null;
XmlPullParser pullParse = Xml.newPullParser();//google自带的工具栏生成pullParse,由于android本身集成了pull解析器
pullParse.setInput(is, "UTF-8");
int event = pullParse.getEventType();//pull解析器通过事件触发,start document事件需要通过这个方法获得
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_TAG://开始标签
if("persons".equals(pullParse.getName())){//匹配标签
persons = new ArrayList<Person>();//初始化
}
if("person".equals(pullParse.getName())){
person = new Person();
int id = Integer.parseInt(pullParse.getAttributeValue(0));
person.setId(id);
}
if("name".equals(pullParse.getName())){
String name = pullParse.nextText();//得到标签里面的文本值
person.setName(name);
}
if("age".equals(pullParse.getName())){
int age = Integer.parseInt(pullParse.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullParse.getName())){
persons.add(person);
person = null;
}
break;
}
event = pullParse.next();
}
return persons;
}
2.将数据保存到xml格式的数据
/**
* 将数据存成xml格式的数据
* @param persons
* @param os 输出流
* @throws Exception
*/
public void save(List<Person> persons , OutputStream os ) throws Exception{
XmlSerializer serial = Xml.newSerializer();
serial.setOutput(os, "UTF-8");
//xml文档开始
serial.startDocument("UTF-8", true);//第一个参数是编码,第二个参数表示此xml文件是否能单独存在
serial.startTag(null, "persons");//根节点
for(Person person : persons){
serial.startTag(null, "person");
serial.attribute(null, "id", person.getId() + "");
//name标签
serial.startTag(null, "name");
serial.text(person.getName());
serial.endTag(null, "name");
//age标签
serial.startTag(null, "age");
serial.text(person.getAge() + "");
serial.endTag(null, "age");
serial.endTag(null, "person");
}
serial.endTag(null, "persons");
serial.endDocument();
os.flush();
}