但是SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。
若internet数据是定时更新的,但是一次更新往往只更新前面几条数据,大部分数据还是相同的,因此我们在解析时可以在上一次解析的结果之上根据<updated>元素标签中的值解析前面几条比之前updated值更新的数据即可。
但是如果使用SAX方式的话,每次还是都会解析整个XML文档,而这却浪费了处理器资源和延长了处理的时间。
不过Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。
Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。
创建XmlPullParser有两种方式,一种是使用我们介绍的org.xmlpull.v1包中的工厂类XmlPullParserFactory。除了这种方式外,还可以使用Android SDK提供的实用工具包android.util中的类Xml的newPullParser()方法直接创建。
- 创建XmlPullParser,有两种方式
- 方式一:使用工厂类XmlPullParserFactory
- XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();
- XmlPullParser xmlPullParser = pullFactory.newPullParser();
- 方式二:使用Android提供的实用工具类android.util.Xml
- XmlPullParser xmlPullParser = Xml.newPullParser();
接着为pull解析器设置要解析的xml文档数据,并使用主动的方式获取解析器中的事件,
- xmlPullParser.setInput(inStream, "UTF-8");
- int eventType = xmlPullParser.getEventType();
当pull解析器开始解析之后,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签)。
当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取该元素的属性的值,也可调用它的nextText()获取本节点的值。
如下xml
<?xml version="1.0" encoding="utf-8"?>
<channel>
<item id="0" url="http://www.baidu.com">百度</item>
<item id="1" url="http://www.qq.com">腾讯</item>
<item id="2" url="http://www.sina.com.cn">新浪</item>
<item id="3" url="http://www.taobao.com">淘宝</item>
</channel>
String id = xrp.getAttributeValue(null, "id"); // 通过属性名来获取属性值
String url = xrp.getAttributeValue(1); // 通过属性索引来获取属性值
http://blog.csdn.net/ichliebephone/article/details/5977959