`
zhiweiofli
  • 浏览: 515036 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java与XML原来可以这么简单--基于XMLPull的解析器

阅读更多

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

 

     

分享到:
评论
2 楼 a86261566 2015-08-21  
多谢   简单易懂
1 楼 wangshiming 2011-09-16  
兄台,你的getRemoteFile(url,filename)方法是执行什么功能啊,是不是忘记贴出来了

相关推荐

    xmlpull(java新型xml解析技术)

    在描述中提到的jar包,很可能是XMLPull解析库的实现,例如XMLPull_1_1_3_4c.jar,这个版本的XMLPull库提供了Java API,使得开发者可以直接在Java项目中集成并使用XMLPull解析XML。 标签“xmlpull”、“xml解析”和...

    对xml文件进行xmlpull解析jar包

    XMLPull解析器允许应用程序以拉取(pull)的方式逐个读取XML元素,而不是等待整个文档加载完毕。 "对xml文件进行xmlpull解析jar包"这个标题表明我们将讨论如何使用XMLPull解析技术,并且需要特定的jar包来实现这一...

    kxml2-2.3.0.jar+xmlpull_1_1_3_4c.jar

    以下是一个简单的示例代码,展示了如何使用XMLPull解析XML: ```java XMLPullParserFactory factory = XMLPullParserFactory.newInstance(); XMLPullParser parser = factory.newPullParser(); // 设置输入源,如...

    将对象生成xml的jar包,xstream-1.4.2,xmlpull-1.1.3.1,xpp3_min-1.1.4c

    XPP3提供了一个轻量级、高性能的XML解析器,可以与XMLPull API一起使用。XPP3_min是XPP3的一个精简版本,旨在减少库的大小,使其更适合嵌入式设备或资源有限的环境。 集成这三个库,可以在Java应用中实现高效、灵活...

    xml解析+kxml2+xmlpull

    在Android开发中,KXML2库实现了XMLPULL解析接口,使得开发者可以用KXML2的API进行Pull解析。这种结合使用的方式既保留了KXML2的易用性,又具备了Pull解析的高效性。 5. **使用步骤**: - 引入KXML2库:在Android...

    XmlPull解析

    XML Pull解析基于“Pull解析器”的概念,它不像SAX(Simple API for XML)那样需要外部事件处理程序,而是由解析器自身推动XML事件,如开始元素、结束元素、文本节点等。开发者可以通过调用`next()`方法来获取下一个...

    xmlpull-1.1.3.1.jar和kxml2-2.3.0.jar

    它提供了一种编程接口,允许开发者在Java环境中读取和解析XML文档,而无需依赖完整的DOM(Document Object Model)或SAX(Simple API for XML)解析器。这种解析方式被称为“拉”模型,因为控制解析流程的是应用程序...

    xmlpull-1.1.3.1.jar

    在Android开发中,XMLPull解析器被广泛使用,因为它不需要完整的DOM树(Document Object Model)来存储XML文档,而是通过事件驱动的方式解析XML内容。这种方式既节省内存,又提高了性能。 XMLPull的基本原理是,它...

    XmlPull解析XML

    首先,XMLPull解析器不构建DOM(Document Object Model)树,而是逐个处理XML事件,如开始元素、结束元素、文本等。当遇到这些事件时,它会触发相应的回调方法,这样开发者就可以根据需要处理数据,而不需要一次性...

    复杂XmlPull解析Demo

    XmlPull解析是Android和Java平台中处理XML文档的一种高效、轻量级的解析方式。它不依赖DOM(Document Object Model)或SAX(Simple API for XML),而是提供了一个基于事件的解析模型,允许开发者逐个读取XML文档的...

    xstream+xmlpull xml to bean &&bean to xml

    2. kxml2-2.3.0.jar:这是一个轻量级的XML解析器,常被XStream用来作为XML读写的底层实现。KXML2提供了XML解析和生成的功能,对于那些不需要DOM或SAX完整功能的简单应用来说,它是一个很好的选择。 3. xmlpull_1_1_...

    使用Pull解析器读取XML文件和生成XML文件

    在Java中,我们可以使用`javax.xml.parsers.SAXParserFactory`和`org.xmlpull.v1.XmlPullParser`来实现Pull解析。以下是一个简单的示例: ```java SAXParserFactory factory = SAXParserFactory.newInstance(); ...

    kxml2-2.2.2.jar+xmlpull_1_0_5_all

    KXML2是一个轻量级的XML解析器,适用于Java和Android平台。它不依赖于DOM(文档对象模型)或SAX(简单API for XML),而是提供了一个基于事件的解析模型,使得在内存有限的设备上解析XML文件成为可能。KXML2的主要...

    xmlPull的jar包.zip

    本资源包含两个jar包:kxml2-2.3.0.jar和xmlpull-1.1.3.1.jar,它们是XMLPull解析器的重要组成部分。 1. **XMLPull简介** XMLPull是一种基于事件驱动的XML解析模型,全称为XML Pull Processing。与DOM(Document ...

    xmlpull-1.1.3.1.jar和xmlpull-1.1.3.1.jar

    XMLPull库的核心功能包括创建解析器对象,通过事件驱动的方式逐个处理XML元素。 描述中的“pull方式xml解析”指的是XMLPullParser,它是XMLPull API的核心类。它在解析XML时,不会一次性加载整个文档到内存,而是按...

    XMLPullProject(XMLPull读取)

    XMLPull解析器的工作原理是基于事件驱动的,它会逐个读取XML文档中的元素,并触发相应的事件,如开始元素、结束元素、文本节点等。这种方式比DOM解析更为节省内存,因为不需要一次性加载整个XML文档到内存中,而是按...

    java XStream xml解析 jar包.zip

    - XML Pull Parsing是一种事件驱动的解析模型,与SAX类似,但更简单,不需要解析器的回调函数。XPP3库实现了这种解析方式,XStream使用它来高效地读取和写入XML。 6. **使用示例**: ```java import ...

    android xmlpull详细源代码

    XMLPull解析器是基于拉取(Pull)模式的,意味着开发者可以主动控制解析过程,按需读取XML文档中的元素和属性。这与SAX解析器的事件驱动方式不同,SAX会在遇到特定事件时调用预先注册的回调函数。XMLPull允许更灵活...

    xmlpull_1_0_5解决 org/xmlpull/v1/XmlPullParserException

    XStream是一个用于XML和Java对象之间进行序列化和反序列化的库,它依赖于XMLPull解析器来处理XML数据。 在“xmlpull_1_0_5”这个压缩包中,很可能包含了XMLPull解析库的1.0.5版本。这个版本可能修复了一些已知的...

    xmlpull.zip

    1. **kxml2-2.3.0.jar**: 这是Kent Beck开发的KXML2库的一个版本,它是一个小型、快速的XML解析器,适用于Java ME(Micro Edition)和Android等资源有限的环境。KXML2基于SAX(Simple API for XML)事件驱动模型,但...

Global site tag (gtag.js) - Google Analytics