除了可以使用 SAX或DOM解析XML文件之外,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
使用Pull解析器读取itcast.xml的代码在本页下方备注
Pull解析器的源码及文档下载网址:http://xmlpull.org/xmlpull-website/impls.shtml
1、
public class PersonService {
public static List<Person> getPersons(InputStream xml)throws Exception{
List<Person> persons=null;
Person person=null;
XmlPullParser pullParser=Xml.newPullParser();
pullParser.setInput(xml, "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("age".equals(pullParser.getName())){
int age=new Integer(pullParser.nextText());
person.setAge(age);
}
if("name".equals(pullParser.getName())){
String name=pullParser.nextText();
person.setName(name);
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullParser.getName())){
persons.add(person);
person=null;
}
break;
}
event=pullParser.next();
}
return persons;
}
调用上述方法
private static final String TAG = "PersonsServiceTest";
public void testGetPersons()throws Exception{
InputStream xml=this.getClass().getClassLoader().getResourceAsStream("person.xml"); //person.xml在src文件夹里
PersonService personservice=new PersonService();
List<Person> persons=personservice.getPersons(xml);
for(Person person : persons){ Log.i(TAG, person.toString()); } }
2、也可以
public List<Person> getPersonsT(XmlResourceParser xml)throws Exception{
List<Person> persons=null;
Person person=null;
int event=xml.getEventType();
while(event!=XmlResourceParser.END_DOCUMENT){
switch (event) {
case XmlResourceParser.START_DOCUMENT:
persons=new ArrayList<Person>();
break;
case XmlResourceParser.START_TAG:
if("person".equals(xml.getName())){
int id=new Integer(xml.getAttributeValue(0));
person=new Person();
person.setId(id);
}
if("age".equals(xml.getName())){
int age=new Integer(xml.nextText());
person.setAge(age);
}
if("name".equals(xml.getName())){
String name=xml.nextText();
person.setName(name);
}
break;
case XmlResourceParser.END_TAG:
if("person".equals(xml.getName())){
persons.add(person);
person=null;
}
break;
}
event=xml.next();
}
return persons;
}
}
调用上述方法
public void testGetPersonsT()throws Exception{
XmlResourceParser xml=getContext().getResources().getXml(R.xml.person);//person.xml在xml文件夹里
PersonService personservice=new PersonService();
List<Person> persons=personservice.getPersonsT(xml);
for(Person person : persons){
Log.i(TAG, person.toString());
}
}