`

解析Google天气的xml文件

 
阅读更多

<?xml version="1.0" encoding="UTF-8"?>
<xml_api_reply version="1">
	<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
		<forecast_information>
			<city data="Qingdao, Shandong" />
			<postal_code data="Qingdao" />
			<latitude_e6 data="" />
			<longitude_e6 data="" />
			<forecast_date data="2012-04-17" />
			<current_date_time data="2012-04-18 02:00:00 +0000" />
			<unit_system data="SI" />
		</forecast_information>
		<current_conditions>
			<condition data="晴" />
			<temp_f data="52" />
			<temp_c data="11" />
			<humidity data="湿度: 33%" />
			<icon data="/ig/images/weather/sunny.gif" />
			<wind_condition data="风向: 南、风速:7 米/秒" />
		</current_conditions>
		<forecast_conditions>
			<day_of_week data="周二" />
			<low data="7" />
			<high data="19" />
			<icon data="/ig/images/weather/mostly_sunny.gif" />
			<condition data="以晴为主" />
		</forecast_conditions>
		<forecast_conditions>
			<day_of_week data="周三" />
			<low data="7" />
			<high data="16" />
			<icon data="/ig/images/weather/mostly_sunny.gif" />
			<condition data="晴间多云" />
		</forecast_conditions>
		<forecast_conditions>
			<day_of_week data="周四" />
			<low data="7" />
			<high data="17" />
			<icon data="/ig/images/weather/cn_fog.gif" />
			<condition data="雾" />
		</forecast_conditions>
		<forecast_conditions>
			<day_of_week data="周五" />
			<low data="8" />
			<high data="17" />
			<icon data="/ig/images/weather/cn_fog.gif" />
			<condition data="雾" />
		</forecast_conditions>
	</weather>
</xml_api_reply>

首先是Google天气的api.xml

// 2012-4-17下午07:09:03

package com.su.weatherxml;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;

import android.util.Log;
import android.util.Xml;
import android.widget.Toast;

public class PULLMode {
	private static final String TAG = "PULLMODE";

	public HashMap<String, String> getCurrentInfo(InputStream inStream)
			throws Throwable {
		Log.i(TAG, "1");
		HashMap<String, String> infoMap = new HashMap<String, String>();
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inStream, "UTF-8");
		int eventType = parser.getEventType();// 产生第一个事件

		Log.i(TAG, eventType + "");
		while (eventType != XmlPullParser.END_DOCUMENT) {// 只要不是文档结束事件

			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:

				break;

			case XmlPullParser.START_TAG:
				String name = parser.getName();// 获取解析器当前指向的元素的名称

				if ("city".equals(name)) {
					infoMap.put("city", parser.getAttributeValue(0));// 获取解析器当前指向元素的下一个文本节点的值
				}
				if ("wind_condition".equals(name)) {
					infoMap.put("wind_condition", parser.getAttributeValue(0));
				}
				break;
			case XmlPullParser.END_TAG:
				if ("xml_api_reply".equals(parser.getName())) {

					Iterator iter = infoMap.entrySet().iterator();
					while (iter.hasNext()) {
						Map.Entry entry = (Map.Entry) iter.next();
						String key = entry.getKey().toString();
						String val = entry.getValue().toString();
						Log.i(TAG, key + "    " + val);// 遍历hashmap方法输出信息
					}

					break;
				}
			}
			eventType = parser.next();// 每个节点都要进行判断
		}
		return infoMap;
	}

	public List<WeatherBean> getWeatherBeans(InputStream inStream)
			throws Throwable {
		List<WeatherBean> wheatherBeans = null;
		WeatherBean wheatherBean = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inStream, "UTF-8");

		int eventType = parser.getEventType();// 产生第一个事件
		while (eventType != XmlPullParser.END_DOCUMENT) {// 只要不是文档结束事件就进行循环
			switch (eventType) {
			case XmlPullParser.START_DOCUMENT:
				wheatherBeans = new ArrayList<WeatherBean>();
				break;

			case XmlPullParser.START_TAG:
				String name = parser.getName();// 获取解析器当前指向的元素的名称
				if ("forecast_conditions".equals(name))
					wheatherBean = new WeatherBean();

				if (wheatherBean != null) {// 只有当whetherBean被new后才执行这里 向里面添加数据
					if ("day_of_week".equals(name)) {
						wheatherBean.setDayofweek(parser.getAttributeValue(0));
						Log.i(TAG, parser.getAttributeValue(0));
						// parser还有很多其他的方法 比如nextText();
					}
					if ("low".equals(name)) {
						wheatherBean.setLow(new Integer(parser
								.getAttributeValue(0)));
						Log.i(TAG, parser.getAttributeValue(0));
					}
					if ("high".equals(name)) {
						wheatherBean.setHigh(new Integer(parser
								.getAttributeValue(0)));
						Log.i(TAG, parser.getAttributeValue(0));
					}
					if ("condition".equals(name)) {
						wheatherBean.setCondition(parser.getAttributeValue(0));
						Log.i(TAG, parser.getAttributeValue(0));
					}
				}
				break;

			case XmlPullParser.END_TAG:
				if ("forecast_conditions".equals(parser.getName())) {
					wheatherBeans.add(wheatherBean);
					wheatherBean = null;

				}
				break;
			}
			eventType = parser.next();
		}
		return wheatherBeans;
	}

}

PULL解析的方法;由于api.xml的前面几行不是很对称,所以把前面的信息存贮在了map中,后面的存储在list<WeatherBean>


// 2012-4-17下午08:41:38

package com.su.weatherxml;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class SAXMode {
	public static final String TAG = "SAXmode";

	public HashMap<String, String> getCurrentInfo(InputStream inStream)
			throws Throwable {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		mWeatherParser mweatherParser = new mWeatherParser();
		parser.parse(inStream, mweatherParser);
		inStream.close();
		return mweatherParser.getWeatherBeans();
	}

	private final class mWeatherParser extends DefaultHandler {
		
		private HashMap<String, String> infoMap = new HashMap<String, String>();;
		private String tag = null;
		public HashMap<String, String> getWeatherBeans() {
			return infoMap;
		}

		@Override
		public void startDocument() throws SAXException {// 开始文件

		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			
			if (infoMap != null) {
				if ("city".equals(localName)) {
					infoMap.put("city", attributes.getValue(0));
					Log.i(TAG, attributes.getValue(0));
				}
				if ("wind_condition".equals(localName)) {
					infoMap.put("wind_condition",
							attributes.getValue(0));
					Log.i(TAG, attributes.getValue(0));
				}
			}
			tag = localName;
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {// 遇到文字(标签之间)

		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {// 结束节点
			tag = null;
		}
	}

	public List<WeatherBean> getWeatherBeans(InputStream inStream)
			throws Throwable {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		WeatherParser weatherParser = new WeatherParser();
		parser.parse(inStream, weatherParser);
		inStream.close();
		return weatherParser.getWeatherBeans();
	}

	private final class WeatherParser extends DefaultHandler {
		private List<WeatherBean> weatherBeans = null;
		private String tag = null;
		private WeatherBean weatherBean = null;

		public List<WeatherBean> getWeatherBeans() {
			return weatherBeans;
		}

		@Override
		public void startDocument() throws SAXException {// 开始文件
			weatherBeans = new ArrayList<WeatherBean>();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if ("forecast_conditions".equals(localName)) {// 开始解析节点(标签)
				weatherBean = new WeatherBean();
			}
			if (weatherBean != null) {
				if ("day_of_week".equals(localName)) {
					weatherBean.setDayofweek(attributes.getValue(0));
					Log.i(TAG, attributes.getValue(0));
				}
				if ("low".equals(localName)) {
					weatherBean.setLow(new Integer(attributes.getValue(0)));
				}
				if ("high".equals(localName)) {
					weatherBean.setHigh(new Integer(attributes.getValue(0)));
				}
				if ("condition".equals(localName)) {
					weatherBean.setCondition(attributes.getValue(0));
				}
			}

			tag = localName;
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {// 遇到文字(标签之间)

		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {// 结束节点
			if ("forecast_conditions".equals(localName)) {
				weatherBeans.add(weatherBean);
				weatherBean = null;
			}
			tag = null;
		}
	}
}

SAX解析







分享到:
评论

相关推荐

    xml解析google天气预报

    总的来说,解析谷歌天气预报的XML文件需要理解XML的结构,熟悉SAX解析机制,以及掌握Android的多线程和UI更新技巧。这是一个典型的Android应用开发中的数据获取与处理任务,对提升开发者的数据处理能力和网络编程...

    google天气预报XML-Pull解析版(完全解析)

    XML-Pull解析器在读取XML文档时,只处理当前的事件,这样可以节省内存,尤其适合处理大型XML文件。在Android开发中,XML-Pull解析常用于网络数据的解析,因为它高效且内存友好。 首先,我们需要了解如何使用XML-...

    android基于xml的天气解析

    谷歌天气接口提供的天气信息就是以XML的形式返回,包含诸如温度、湿度、风速等各项气象参数。 在Android中,解析XML有多种方式,如DOM(Document Object Model)、SAX(Simple API for XML)和Pull Parser。其中,...

    android的对google天气预报的Sax解析

    本篇主要介绍如何使用SAX(Simple API for XML)解析器来处理从Google天气预报API获取的XML数据,特别关注对当天天气信息的解析。 首先,我们需要理解Google天气预报API的工作原理。通常,API会返回一个XML文档,...

    JSP XML实现谷歌天气预报

    在获取天气预报的API数据时,返回的XML文件会包含城市名、温度、湿度等各种气象信息,每个元素都对应着特定的含义。解析XML文档是关键步骤,我们需要使用Java的DOM(Document Object Model)或SAX(Simple API for ...

    天气预报 xml json

    这个代码库可能包含了一个或多个类,用于处理从中国天气网获取数据、解析XML和JSON、网络连接以及图片下载等功能。"输入中英文来查询天气"意味着它具备多语言支持,可以为用户提供更加便捷的服务。"语音播报功能...

    android开发之解析XML文件.pdf

    以解析Google天气预报为例,XML数据包含城市信息、当前条件、未来几天的天气预报等。在`WeatherHandler`中,我们可以根据XML标签来解析并存储这些信息。例如,在`startElement`方法中,根据元素名称创建对应的对象或...

    Android网络下的XML解析和生成.

    2. SAX解析器:SAX(Simple API for XML)是事件驱动的解析方式,它逐行读取XML文件,遇到元素、属性等事件时触发回调函数。相比于DOM,SAX解析器内存占用少,适合处理大文件。 3. Pull解析器:Android提供了一个...

    获取Google的简单天气预报

    根据提供的文件信息,本文将详细解释如何通过Java编程语言来获取Google提供的天气预报...综上所述,通过Java程序可以很方便地获取并解析Google提供的天气预报服务中的数据,这对于开发天气应用或进行数据分析非常有用。

    google天气图标大全

    在使用Google天气API时,开发者需要了解如何通过API请求获取天气信息,包括如何构造请求URL、设置参数(如地点、单位系统等)以及如何解析返回的JSON或XML数据。获取到天气信息后,就可以将对应的图标加载到应用界面...

    Android开发之XML文件的解析的三种方法

    本文主要讲解Android开发中如何对XML文件的解析,由于XML文件具有与平台无关,广泛应用于数据通信中,因此解析XML文件就显得很有意义。Android对XML文件解析的方法主要有3种。 通常有三种方式:DOM、SAX和PULL,下面...

    Java获取Google的简单天气预报

    2. **XML处理**:Google天气API返回的数据格式可能是XML,Java中处理XML数据可以使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`等类来解析。首先,创建一个解析器,然后解析XML字符串,...

    Google天气实例

    【Google天气实例】是一个关于如何在...总的来说,"Google天气实例"是一个综合性的Android编程实践,涵盖了网络通信、XML处理、UI设计等多个关键知识点,对于学习Android开发的初学者来说,是一个很好的学习项目。

    Java获取google天气信息,且能根据ip地址获取所属地天气

    总的来说,实现"Java获取Google天气信息,且能根据IP地址获取所属地天气"这一功能,涉及到的知识点包括:网络请求、数据解析(XML和JSON)、IP地址与地理位置转换、异常处理以及服务的封装和部署。理解并掌握这些...

    Google天气预报图片

    这里的"Google天气预报图片"是指通过Google提供的一个API(Application Programming Interface)获取到的关于特定地区的天气预报图形化展示。在这个例子中,我们使用的API地址是`...

    java webservice 天气预报系统

    DOM将整个XML文件加载到内存中,适合小型XML文档;SAX是事件驱动的,逐行读取,适合处理大型XML文件;而StAX则提供一个迭代器模式,可以在解析过程中控制数据读取。根据项目的具体需求,开发者可以选择合适的解析...

    Android天气小部件源码

    在Android平台上,开发一款天气小部件涉及到多个技术层面,其中包括Android插件的使用、小部件的刷新机制、小部件点击事件处理以及与Google API的交互,还有XML文件的解析。以下将详细介绍这些知识点: 1. **...

Global site tag (gtag.js) - Google Analytics