Chinaunix首页 | 论坛 | 博客
  • 博客访问: 807884
  • 博文数量: 780
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-12 09:11
文章分类

全部博文(780)

文章存档

2011年(1)

2008年(779)

我的朋友
最近访客

分类:

2008-09-12 09:12:52

    天气预报是非常有用的服务,如果能在网站上集成天气预报,能极大地方便用户查询.
    寻遍了国内所有的气象站点,没找见提供Web服务的,太小气了,只能去国外找。NOAA()提供一个Web服务,但是死活连不上,估计被屏蔽了,其他提供全球天气预报的有和yahoo, 不过weather.com的服务太麻烦,还需要注册,相比之下,yahoo的天气服务既简单又快速,只需一个http请求,然后解析返回的XML即可获得天气预报。

以北京为例,在weather.yahoo.com查找北京的城市代码为CHXX0008,对应的URL为:



然后,通过SAX解析返回的XML:

URL url = new URL(" ");
InputStream input = url.openStream();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
SAXParser parser = factory.newSAXParser();
parser.parse(input, new YahooHandler());

自己定义一个YahooHandler来响应SAX事件:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import org.xml.sax.helpers.DefaultHandler;
import java.net.URL;
import java.io.InputStream;
import java.util.Date;
import java.util.Locale;

import java.text.SimpleDateFormat;


/**
* For more information, please visit: 
* Author: Liao Xuefeng
*/
public class YahooHandler extends DefaultHandler {

public void startElement(String uri, String localName, 
String qName, Attributes attributes) throws SAXException { if("yweather:condition".equals(qName)) { String s_date = attributes.getValue(3); try { Date publish =
new SimpleDateFormat("EEE, dd MMM yyyy hh:mm a z", Locale.US).parse(s_date); //System.out.println("Publish: " + publish.toString()); } catch (Exception e) { e.printStackTrace(); throw new SAXException("Cannot parse date: " + s_date); } } else if("yweather:forecast".equals(qName)) { String s_date = attributes.getValue(1); Date date = null; try { date = new SimpleDateFormat("dd MMM yyyy", Locale.US).parse(s_date); } catch (Exception e) { e.printStackTrace(); throw new SAXException("Cannot parse date: " + s_date); } int low = Integer.parseInt(attributes.getValue(2)); int high = Integer.parseInt(attributes.getValue(3)); String text = attributes.getValue(4); int code = Integer.parseInt(attributes.getValue(5)); System.out.println("Weather: "+ text + ", low=" + low + ", high=" + high); } super.startElement(uri, localName, qName, attributes); } public static void main(String args[]){ try{ URL url = new URL(""); InputStream input = url.openStream(); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(false); SAXParser parser = factory.newSAXParser(); parser.parse(input, new YahooHandler()); }catch(Exception e){ System.out.println(e.toString()); } } }

运行结果: C:\java>java YahooHandler
Weather: Mostly Cloudy, low=17, high=28
Weather: AM Clouds/PM Sun, low=16, high=26

Yahoo会返回当天和第二天的Weather预报。
【责编:Peng】

--------------------next---------------------

阅读(362) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~