上一篇文章学习了SAX解析XML文件,接下来学习另一种方法PULL。
如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正合适。
—————————————————————————————————————————————
用法相较于SAX的区别在于对文件的解析方式:(PS:学完SAX,pull还是很好理解的)
SAX需要一个帮助类,其中重写五个方法,重点在于character,endelement和startelement方法,根据XML的结构重写就可以了
接下来说一下PULL解析:
方法形式和SAX差不多,START_DOCUMENT,END_DOCUMENT,START_TAG,END_TAG,.next(获取标签的属性值)
case XmlPullParser.START_DOCUMENT:看出和SAX大致相同,主函数中使用方法如下:
mList = new ArrayList<Person>(); // 初始化person集合
break;
// 判断当前事件是否为标签元素开始事件
case XmlPullParser.START_TAG:
if (xpp.getName().equals("person")) { // 判断开始标签元素是否是person
person = new Person();
} else if (xpp.getName().equals("name")) {
eventType = xpp.next();//让解析器指向name属性的值
// 得到name标签的属性值,并设置person的name
beauty.setName(xpp.getText());
} else if (xpp.getName().equals("age")) { // 判断开始标签元素是否是person
eventType = xpp.next();//让解析器指向age属性的值
// 得到age标签的属性值,并设置person的age
beauty.setAge(xpp.getText());
}
break;
// 判断当前事件是否为标签元素结束事件
case XmlPullParser.END_TAG:
if (xpp.getName().equals("person")) { // 判断结束标签元素是否是person
mList.add(person); // 将person添加到person集合
person = null;
}
break;
}
// 进入下一个元素并触发相应事件
eventType = xpp.next();
需要建一个所需类的链表,然后解析xml文件。
//通过assertmanager的open方法获取到beauties.xml文件的输入流
InputStream is = this.getAssets().open("beauties.xml");
//初始化自定义的实现类BeautyParserImpl
BeautyParserImpl pbp = new BeautyParserImpl();
//调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList
beautyList = pbp.parse(is);
如果要在网络上下载XML文件并解析的话,需要上一篇所写的 HttpDownloader 类来实现。然后主函数里对于网络的操作相同。
Mainifest.xml文件设置中添加访问网络的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>