《第9章 》总结3 解析XML格式数据

首先要安装一个Apache服务器
安装完之后,在Apache\htdocs目录下,新建一个名为get_data.xml的文件:

<apps>
	<app>
		<id>1</id>
		<name>Google Maps</name>
		<version>1.0</version>
	</app>
	<app>
		<id>2</id>
		<name>Chrome</name>
		<version>2.1</version>
	</app>
	<app>
		<id>3</id>
		<name>Google Play</name>
		<version>2.3</version>
	</app>

</apps>
  1. Pull方式解析XML文件
    1. 获取一个XmlPullParseFactory的实例
    2. 借助XmlPullParseFactory的实例得到XmlPullParse对象
    3. 调用XmlPullParse对象的setInput()方法,将服务器返回的xmlData设置进去,就可以开始解析了
      1. 解析开始:
        1. XmlPullParse对象的getEventType()方法得到当前的解析事件
        2. 在一个while循环里不断的进行解析,如果当前的解析事件不等于xmlPullParse.END_DOCUMENT,说明解析工作没有完成,调用next()方法可以获得后一个解析事件;
        3. 在while循环中,通过getName()方法得到当前节点的名字,如果发现当前节点名字等于id,name或version,就调用nextNext()方法来获取当前节点的内容,每当解析完一个app节点后,将获取到的内容打印出来

重写解析数据的方法parseXMLWithPull(String xmlData):

private void parseXMLWithPull(String xmlData){
	try{
		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser xmlPullParse = factory.newPullParser();
		xmlPullParser.setInput(new StringReader(xmlData));
		int eventType = xmlPullParser.getEventType();
		String id = "";
		String name = "";
		String version = "";
		while(eventType != XmlPullParser.END_DOCUMENT){
			Stirng nodeName = xmlPullParser.getName();
			switch(eventType){
				//开始解析某个节点
				case XmlPullParser.START_TAG:
					{
						if("id".equals(nodeName))
							id=xmlPullParser.nextNext();
						else if("name".equals(nodeName))
							name = xmlPullParser.nextNext();
						else if("version".equals(nodeName))
							version = xmlPullParser.nextNext()
						break;
					}
				//完成解析某个节点
				case XmlPullParser.END_TAG:{
					if("app".equals(nodeName)){
						Logd
						Logd
						Logd
					}
					break;
				}
				eventType = xmlPullParser.next();
		}
		}catch(Exception e){
			e.printStackTrace();
		
		}
}
		

SAX解析方式:
首先新建一个自己的ContentHandler类继承DefaultHandler类,并重写父类的5个方法:

1. public void startDocument()
	初始化每个StringBuilder
2. public void endDocument()
	调用父类的endDocument()方法
3. public void startElement(String uri,String localName,String qNAme,Attributes attributes)
	如果当前节点名
4. public void endElement(String uri,String localName,String qName)
	分析完一个节点后,打印输出节点内容,并且清空每个StringBuilder的内容
5. public void characters(char[] ch,int start,int length)
	根据当前的节点名,获取节点内容,根据节点名判断将内容添加到哪一个StringBuilder中

然后在主活动写一个parseXMLWithSAX方法:

private void parseXMLWithSAX(Stirng xmlData){
	try{
		SAXParserFactory factory = SAXParserFActory.newInstance();
		XMLReader xmlReader = factory.newSAXParser().getXMLReader();
		ContentHandler handler = new ContentHandler();
		//将handler设置到XMLReader中
		xmlReader.setContentHandler(handler);
		//开始执行解析
		xmlReader.parse(new InputSource(new StringReader(xmlData)));
	}catch(Exception e){
		e.printStackTrace()
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值