`
zhiweiofli
  • 浏览: 511164 次
  • 性别: 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)方法是执行什么功能啊,是不是忘记贴出来了

相关推荐

    xstream-1.4.9.jar xmlpull-1.1.3.1.jar等

    xstream-1.4.9.jar,xmlpull-1.1.3.1.jar,xstream-benchmark-1.4.9.jar,xstream-jmh-1.4.9.jar,dom4j-1.6.1.jar,slf4j-api-1.6.1.jar等

    xmlpull(java新型xml解析技术)

    xmlpull xml解析技术 含jar包

    对xml文件进行xmlpull解析jar包

    对xml文件进行xmlpull解析 所需要的jar包对xml文件进行xmlpull解析 所需要的jar包对xml文件进行xmlpull解析 所需要的jar包

    kxml2-2.3.0.jar+xmlpull_1_1_3_4c.jar

    java_pull解析 ,包含kxml2-2.3.0.jar 和xmlpull_1_1_3_4c.jar

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

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

    java_pull解析器使用包kxml2_xmlpull

    java_pull解析器使用包kxml2_xmlpull,包括gson-2.8.2.jar;kxml2-2.3.0.jar;xmlpull_1_1_3_4c.jar;xmlpull-1.1.3.1,jar;xstream-1.4.10.jar

    xmlpull-1.1.3.1.jar和xmlpull-1.1.3.1.jar

    pull方式xml解析jar包,xmlpull-1.1.3.1.jar和xmlpull-1.1.3.1.jar

    Java and XML, 3rd Edition

    《Java与XML》(第三版)向您展示如何穿透围绕着XML的宣传迷雾,让XML真正在您的工作中为您所用。它将教您如何使用XML的各种应用程序编程接口(API)、工具和技巧来构建实际的应用程序,为管理从配置文件到网络站点...

    JAVA与XML.rar

    JAVA与XML.rar 《Java与XML》(第三版)向您展示如何穿透围绕着XML的宣传迷雾,让XML真正在您的工作中为您所用。它将教您如何使用XML的各种应用程序编程接口(API)、工具和技巧来构建实际的应用程序,为管理从配置...

    Java与XML第三版本

    《Java与XML》是(美)麦克劳夫林编著的一本图书。书中的主题为XML基础,包括DTD、命名空间(namespace)、XML Schema和数据格式转换(Transformation) SAX应用程序编程接口,包括处理器接口、过滤器接口和写出接口 ...

    xml解析+kxml2+xmlpull

    xml解析+kxml2+xmlpull.......................................................

    JavaXML解析器FastXml.zip

    FastXml是一个简单、高性能、极少内存消耗的基于xml pull机制的java xml解析器。性能最好的xml解析器:性能是VTD-XMl的3倍,是XPP3/MXP1的2倍,详见性能测试数据和测试代码 几乎不消耗额外的内存:内存消耗比XPP3...

    xmlpull-1.1.3.1.jar和kxml2-2.3.0.jar

    xmlpull-1.1.3.1.jar和kxml2-2.3.0.jar。支持XMLPULL解析的两个必备JAR包。作者亲测!ok

    XmlPull解析XML

    Pull解析XML:Android从服务器端获取XMl文件输入流,并用Pull方式解析,附被解析的XMl文档

    复杂XmlPull解析Demo

    复杂XmlPull解析Demo,适合新手学习使用,

    XmlPull解析

    Xml解析中的一种Pull解析,可以学习下。

    xmlpull-1.1.3.1.jar

    XMLpull解析时用到的JAR包,你肯定用得到,对于三种XML解析来说,Pull解析是最适合Android开发的。

    kxml2-2.2.2.jar+xmlpull_1_0_5_all

    Android 解析XML的kxml2-2.2.2.jar包 + API文档xmlpull_1_0_5_all

    xml解析包dom4j.rar

    xml解析包dom4j,java操作解析XML文档的工具包!xstream-1.4.10,dom4j-2.1.0,xmlpull-1.1.3.1,commons-io-2.6,xpp3_min-1.1.4c,xmlpull-1.1.3.1

Global site tag (gtag.js) - Google Analytics