<?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文件需要理解XML的结构,熟悉SAX解析机制,以及掌握Android的多线程和UI更新技巧。这是一个典型的Android应用开发中的数据获取与处理任务,对提升开发者的数据处理能力和网络编程...
XML-Pull解析器在读取XML文档时,只处理当前的事件,这样可以节省内存,尤其适合处理大型XML文件。在Android开发中,XML-Pull解析常用于网络数据的解析,因为它高效且内存友好。 首先,我们需要了解如何使用XML-...
谷歌天气接口提供的天气信息就是以XML的形式返回,包含诸如温度、湿度、风速等各项气象参数。 在Android中,解析XML有多种方式,如DOM(Document Object Model)、SAX(Simple API for XML)和Pull Parser。其中,...
本篇主要介绍如何使用SAX(Simple API for XML)解析器来处理从Google天气预报API获取的XML数据,特别关注对当天天气信息的解析。 首先,我们需要理解Google天气预报API的工作原理。通常,API会返回一个XML文档,...
在获取天气预报的API数据时,返回的XML文件会包含城市名、温度、湿度等各种气象信息,每个元素都对应着特定的含义。解析XML文档是关键步骤,我们需要使用Java的DOM(Document Object Model)或SAX(Simple API for ...
这个代码库可能包含了一个或多个类,用于处理从中国天气网获取数据、解析XML和JSON、网络连接以及图片下载等功能。"输入中英文来查询天气"意味着它具备多语言支持,可以为用户提供更加便捷的服务。"语音播报功能...
以解析Google天气预报为例,XML数据包含城市信息、当前条件、未来几天的天气预报等。在`WeatherHandler`中,我们可以根据XML标签来解析并存储这些信息。例如,在`startElement`方法中,根据元素名称创建对应的对象或...
2. SAX解析器:SAX(Simple API for XML)是事件驱动的解析方式,它逐行读取XML文件,遇到元素、属性等事件时触发回调函数。相比于DOM,SAX解析器内存占用少,适合处理大文件。 3. Pull解析器:Android提供了一个...
根据提供的文件信息,本文将详细解释如何通过Java编程语言来获取Google提供的天气预报...综上所述,通过Java程序可以很方便地获取并解析Google提供的天气预报服务中的数据,这对于开发天气应用或进行数据分析非常有用。
在使用Google天气API时,开发者需要了解如何通过API请求获取天气信息,包括如何构造请求URL、设置参数(如地点、单位系统等)以及如何解析返回的JSON或XML数据。获取到天气信息后,就可以将对应的图标加载到应用界面...
本文主要讲解Android开发中如何对XML文件的解析,由于XML文件具有与平台无关,广泛应用于数据通信中,因此解析XML文件就显得很有意义。Android对XML文件解析的方法主要有3种。 通常有三种方式:DOM、SAX和PULL,下面...
2. **XML处理**:Google天气API返回的数据格式可能是XML,Java中处理XML数据可以使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`等类来解析。首先,创建一个解析器,然后解析XML字符串,...
【Google天气实例】是一个关于如何在...总的来说,"Google天气实例"是一个综合性的Android编程实践,涵盖了网络通信、XML处理、UI设计等多个关键知识点,对于学习Android开发的初学者来说,是一个很好的学习项目。
总的来说,实现"Java获取Google天气信息,且能根据IP地址获取所属地天气"这一功能,涉及到的知识点包括:网络请求、数据解析(XML和JSON)、IP地址与地理位置转换、异常处理以及服务的封装和部署。理解并掌握这些...
这里的"Google天气预报图片"是指通过Google提供的一个API(Application Programming Interface)获取到的关于特定地区的天气预报图形化展示。在这个例子中,我们使用的API地址是`...
DOM将整个XML文件加载到内存中,适合小型XML文档;SAX是事件驱动的,逐行读取,适合处理大型XML文件;而StAX则提供一个迭代器模式,可以在解析过程中控制数据读取。根据项目的具体需求,开发者可以选择合适的解析...
在Android平台上,开发一款天气小部件涉及到多个技术层面,其中包括Android插件的使用、小部件的刷新机制、小部件点击事件处理以及与Google API的交互,还有XML文件的解析。以下将详细介绍这些知识点: 1. **...