XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。
但Xmlpull比Sax更简明,而且不需要扫描完整个流。现在XmlPull是一开源项目,并成为了Google android类库的一部分,想了解更多请查看http://www.xmlpull.org。XmlPull的jar以及源文件见附件。
XmlPull使用起来很简单,下面献上一自己写的实例,xml数据由google weather api提供:http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/assets/weather.xml
public class xmlPuller {
public static void main(String[] args) {
XmlPullParser xpp = null;
String url = "http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/assets/weather.xml";
String filename = "weather.xml";
FileInputStream fis = null;
InputStream is = null;
try {
if(getRemoteFile(url,filename)){
fis = new FileInputStream(new File("weather.xml"));
is = new BufferedInputStream(fis);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
xpp = factory.newPullParser();
xpp.setInput(is,"utf-8");
int type = xpp.getEventType();
StringBuilder sb = new StringBuilder();
while(type!=XmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_DOCUMENT:
sb.append("Start document");
break;
case XmlPullParser.START_TAG:
sb.append("Start tag:" + xpp.getName() + "\n");
for(int i=0;i<xpp.getAttributeCount();i++){
sb.append("\t Attr:" + xpp.getAttributeName(i) + "--");
sb.append("Value:" + xpp.getAttributeValue(i));
}
break;
case XmlPullParser.END_TAG:
sb.append("End tag:" + xpp.getName());
break;
case XmlPullParser.TEXT:
if(xpp.getText().endsWith("")){
sb.append("\t Start text: null");
} else {
sb.append("\t Start text:" + xpp.getText());
}
break;
default:break;
}
System.out.println(sb.toString());
sb.delete(0, sb.length());
xpp.next();
type = xpp.getEventType();
}
System.out.println("End document");
}
}catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(is!=null){
is.close();
}
if(fis!=null){
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行时经常会遇到以下的异常:
caused by: org.xmlpull.v1.XmlPullParserException: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available; nested exception is:
org.xmlpull.v1.XmlPullParserException: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available
at org.xmlpull.v1.XmlPullParserFactory.newInstance(XmlPullParserFactory.java:278)
at org.xmlpull.v1.XmlPullParserFactory.newInstance(XmlPullParserFactory.java:259)
at xmlPuller.main(xmlPuller.java:28)
XmlPullParserException:resource not found!
没有找到这样的资源:META-INF/services/org.xmlpull.v1.XmlPullParserFactory
so,我们就为它添加这样的资源:
将http://kxml.sourceforge.net/下载的kxml2.jar加到你的项目中即可。
kxml2.jar就包含了META-INF/services/org.xmlpull.v1.XmlPullParserFactory文件,它的内容其实就是一句话:
org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer
分享到:
相关推荐
在描述中提到的jar包,很可能是XMLPull解析库的实现,例如XMLPull_1_1_3_4c.jar,这个版本的XMLPull库提供了Java API,使得开发者可以直接在Java项目中集成并使用XMLPull解析XML。 标签“xmlpull”、“xml解析”和...
XMLPull解析器允许应用程序以拉取(pull)的方式逐个读取XML元素,而不是等待整个文档加载完毕。 "对xml文件进行xmlpull解析jar包"这个标题表明我们将讨论如何使用XMLPull解析技术,并且需要特定的jar包来实现这一...
以下是一个简单的示例代码,展示了如何使用XMLPull解析XML: ```java XMLPullParserFactory factory = XMLPullParserFactory.newInstance(); XMLPullParser parser = factory.newPullParser(); // 设置输入源,如...
XPP3提供了一个轻量级、高性能的XML解析器,可以与XMLPull API一起使用。XPP3_min是XPP3的一个精简版本,旨在减少库的大小,使其更适合嵌入式设备或资源有限的环境。 集成这三个库,可以在Java应用中实现高效、灵活...
在Android开发中,KXML2库实现了XMLPULL解析接口,使得开发者可以用KXML2的API进行Pull解析。这种结合使用的方式既保留了KXML2的易用性,又具备了Pull解析的高效性。 5. **使用步骤**: - 引入KXML2库:在Android...
XML Pull解析基于“Pull解析器”的概念,它不像SAX(Simple API for XML)那样需要外部事件处理程序,而是由解析器自身推动XML事件,如开始元素、结束元素、文本节点等。开发者可以通过调用`next()`方法来获取下一个...
它提供了一种编程接口,允许开发者在Java环境中读取和解析XML文档,而无需依赖完整的DOM(Document Object Model)或SAX(Simple API for XML)解析器。这种解析方式被称为“拉”模型,因为控制解析流程的是应用程序...
在Android开发中,XMLPull解析器被广泛使用,因为它不需要完整的DOM树(Document Object Model)来存储XML文档,而是通过事件驱动的方式解析XML内容。这种方式既节省内存,又提高了性能。 XMLPull的基本原理是,它...
首先,XMLPull解析器不构建DOM(Document Object Model)树,而是逐个处理XML事件,如开始元素、结束元素、文本等。当遇到这些事件时,它会触发相应的回调方法,这样开发者就可以根据需要处理数据,而不需要一次性...
XmlPull解析是Android和Java平台中处理XML文档的一种高效、轻量级的解析方式。它不依赖DOM(Document Object Model)或SAX(Simple API for XML),而是提供了一个基于事件的解析模型,允许开发者逐个读取XML文档的...
2. kxml2-2.3.0.jar:这是一个轻量级的XML解析器,常被XStream用来作为XML读写的底层实现。KXML2提供了XML解析和生成的功能,对于那些不需要DOM或SAX完整功能的简单应用来说,它是一个很好的选择。 3. xmlpull_1_1_...
在Java中,我们可以使用`javax.xml.parsers.SAXParserFactory`和`org.xmlpull.v1.XmlPullParser`来实现Pull解析。以下是一个简单的示例: ```java SAXParserFactory factory = SAXParserFactory.newInstance(); ...
KXML2是一个轻量级的XML解析器,适用于Java和Android平台。它不依赖于DOM(文档对象模型)或SAX(简单API for XML),而是提供了一个基于事件的解析模型,使得在内存有限的设备上解析XML文件成为可能。KXML2的主要...
本资源包含两个jar包:kxml2-2.3.0.jar和xmlpull-1.1.3.1.jar,它们是XMLPull解析器的重要组成部分。 1. **XMLPull简介** XMLPull是一种基于事件驱动的XML解析模型,全称为XML Pull Processing。与DOM(Document ...
XMLPull库的核心功能包括创建解析器对象,通过事件驱动的方式逐个处理XML元素。 描述中的“pull方式xml解析”指的是XMLPullParser,它是XMLPull API的核心类。它在解析XML时,不会一次性加载整个文档到内存,而是按...
XMLPull解析器的工作原理是基于事件驱动的,它会逐个读取XML文档中的元素,并触发相应的事件,如开始元素、结束元素、文本节点等。这种方式比DOM解析更为节省内存,因为不需要一次性加载整个XML文档到内存中,而是按...
- XML Pull Parsing是一种事件驱动的解析模型,与SAX类似,但更简单,不需要解析器的回调函数。XPP3库实现了这种解析方式,XStream使用它来高效地读取和写入XML。 6. **使用示例**: ```java import ...
XMLPull解析器是基于拉取(Pull)模式的,意味着开发者可以主动控制解析过程,按需读取XML文档中的元素和属性。这与SAX解析器的事件驱动方式不同,SAX会在遇到特定事件时调用预先注册的回调函数。XMLPull允许更灵活...
XStream是一个用于XML和Java对象之间进行序列化和反序列化的库,它依赖于XMLPull解析器来处理XML数据。 在“xmlpull_1_0_5”这个压缩包中,很可能包含了XMLPull解析库的1.0.5版本。这个版本可能修复了一些已知的...
1. **kxml2-2.3.0.jar**: 这是Kent Beck开发的KXML2库的一个版本,它是一个小型、快速的XML解析器,适用于Java ME(Micro Edition)和Android等资源有限的环境。KXML2基于SAX(Simple API for XML)事件驱动模型,但...