Java获取yahoo天气预报
学习闲暇之余,写了个获取yahoo天气预报的java小程序,仅供娱乐。
首先我们需要获取您需要查询城市对应的代号,我们可以用HashMap来查询,代码如下:

publicstatic HashMap<String, String> cityCode =new HashMap<String, String>(); /* 初始化城市代号 */
privatevoid initCitys() {
cityCode.put("北京", "0008");
cityCode.put("天津", "0133");
cityCode.put("武汉", "0138");
cityCode.put("杭州", "0044");
cityCode.put("合肥 ", "0448");
cityCode.put("上海 ", "0116");
cityCode.put("福州 ", "0031");
cityCode.put("重庆 ", "0017");
cityCode.put("南昌 ", "0097");
cityCode.put("香港 ", "0049");
cityCode.put("济南 ", "0064");
cityCode.put("澳门 ", "0512");
cityCode.put("郑州 ", "0165");
cityCode.put("呼和浩特 ", "0249");
cityCode.put("乌鲁木齐 ", "0135");
cityCode.put("长沙 ", "0013");
cityCode.put("银川 ", "0259");
cityCode.put("广州 ", "0037");
cityCode.put("拉萨 ", "0080");
cityCode.put("海口 ", "0502");
cityCode.put("南京 ", "0100");
cityCode.put("成都 ", "0016");
cityCode.put("石家庄 ", "0122");
cityCode.put("贵阳 ", "0039");
cityCode.put("太原 ", "0129");
cityCode.put("昆明 ", "0076");
cityCode.put("沈阳 ", "0119");
cityCode.put("西安 ", "0141");
cityCode.put("长春 ", "0010");
cityCode.put("兰州 ", "0079");
cityCode.put("西宁 ", "0236");
}

接下来我们要创建链接,以获取天气预报的XML文档

private Document getWeatherXML(String cityCode) throws IOException {
URL url =new URL("http://weather.yahooapis.com/forecastrss?p=CHXX"
+ cityCode +"&u=c");
URLConnection connection = url.openConnection();
Document Doc = stringToElement(connection.getInputStream());
return Doc;
}

您也可以选择保存获取的天气XML文档

/* 保存获取的天气信息XML文档 */
privatevoid saveXML(Document Doc, String Path) {
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = transFactory.newTransformer();
DOMSource domSource =new DOMSource(Doc);
File file =new File(Path);
FileOutputStream out =new FileOutputStream(file);
StreamResult xmlResult =new StreamResult(out);
transformer.transform(domSource, xmlResult);
} catch (Exception e) {
System.out.println("保存文件出错!");
}
}

本人获取的一份XML保存如下

<?xml version="1.0" encoding="UTF-8" ?>
- <rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" version="2.0">
- <channel>
<title>Yahoo! Weather - Wuhan, CH</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Wuhan__CH/*http://weather.yahoo.com/forecast/CHXX0138_c.html</link>
<description>Yahoo! Weather for Wuhan, CH</description>
<language>en-us</language>
<lastBuildDate>Sat, 27 Mar 2010 11:00 pm CST</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Wuhan" country="CH" region=""/>
<yweather:units distance="km" pressure="mb" speed="km/h" temperature="C"/>
<yweather:wind chill="15" direction="110" speed="6.44"/>
<yweather:atmosphere humidity="67" pressure="1015.92" rising="0" visibility="9.99"/>
<yweather:astronomy sunrise="6:19 am" sunset="6:38 pm"/>
- <image>
<title>Yahoo! Weather</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com</link>
<url>http://l.yimg.com/a/i/us/nws/th/main_142b.gif</url>
</image>
- <item>
<title>Conditions for Wuhan, CH at 11:00 pm CST</title>
<geo:lat>30.58</geo:lat>
<geo:long>114.27</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Wuhan__CH/*http://weather.yahoo.com/forecast/CHXX0138_c.html</link>
<pubDate>Sat, 27 Mar 2010 11:00 pm CST</pubDate>
<yweather:condition code="33" date="Sat, 27 Mar 2010 11:00 pm CST" temp="15" text="Fair"/>
- <description>
- <!--[CDATA[
<img src="http://l.yimg.com/a/i/us/we/52/33.gif" mce_src="http://l.yimg.com/a/i/us/we/52/33.gif"/><br />
<b>Current Conditions:</b><br />
Fair, 15 C<BR />
<BR /><b>Forecast:</b><BR />
Sat - Partly Cloudy. High: 18 Low: 9<br />
Sun - Partly Cloudy. High: 20 Low: 12<br />
<br />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Wuhan__CH/*http://weather.yahoo.com/forecast/CHXX0138_c.html" mce_href="http://us.rd.yahoo.com/dailynews/rss/weather/Wuhan__CH/*http://weather.yahoo.com/forecast/CHXX0138_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
(provided by <a href="http://www.weather.com" mce_href="http://www.weather.com" >The Weather Channel</a>)<br/> ]]-->
</description>
<yweather:forecast code="29" date="27 Mar 2010" day="Sat" high="18" low="9" text="Partly Cloudy"/>
<yweather:forecast code="30" date="28 Mar 2010" day="Sun" high="20" low="12" text="Partly Cloudy"/>
<guid isPermaLink="false">CHXX0138_2010_03_27_23_00_CST</guid>
</item>
</channel>
</rss>
- <!-- api7.weather.sp1.yahoo.com uncompressed/chunked Sat Mar 27 08:43:16 PDT 2010
-->

好啦,下面就是解析XML了,您看一下XML文档,如果您了解的话很容易获取其中的信息

/* 获取天气信息 */
public String getWeather(String city) {
String result =null;
try {
Document doc = getWeatherXML(GetWeatherInfo.cityCode.get(city));
NodeList nodeList = doc.getElementsByTagName("channel");
for (int i =0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
NodeList nodeList1 = node.getChildNodes();
for (int j =0; j < nodeList1.getLength(); j++) {
Node node1 = nodeList1.item(j);
if (node1.getNodeName().equalsIgnoreCase("item")) {
NodeList nodeList2 = node1.getChildNodes();
for (int k =0; k < nodeList2.getLength(); k++) {
Node node2 = nodeList2.item(k);
if (node2.getNodeName().equalsIgnoreCase(
"yweather:forecast")) {
NamedNodeMap nodeMap = node2.getAttributes();
Node lowNode = nodeMap.getNamedItem("low");
Node highNode = nodeMap.getNamedItem("high");
Node codeNode = nodeMap.getNamedItem("code");
String day ="今天";
if (result ==null) {
result ="";
} else {
day ="\n明天";
}
result = result
+ day
+""
+ dictionaryStrings[Integer
.parseInt(codeNode
.getNodeValue())]
+"\t最低温度:"+ lowNode.getNodeValue()
+"℃ \t最高温度:"+ highNode.getNodeValue()
+"℃ ";
}
}
}
}
}
saveXML(doc, "C:\\Users\\ygui\\Desktop\\Weather.xml");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

整个程序的代码如下:

package stwolf.hustbaidu.java.learn.filelist;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
class GetWeatherInfo {
publicstatic HashMap<String, String> cityCode =new HashMap<String, String>();
privatefinal String[] dictionaryStrings = { "龙卷风", "热带风暴", "飓风", "强雷阵雨",
"雷阵雨", "小雨加雪", "雨加冰雹", "雪加冰雹", "冰雨", "毛毛雨", "冻雨", "阵雨", "阵雨", "小雪",
"零星小雪", "高吹雪", "雪", "冰雹", "雨夹雪", "尘", "雾", "薄雾", "多烟的", "大风", "有风",
"寒冷", "阴天", "夜间阴天", "白天阴天", "夜间多云", "白天多云", "夜间清亮", "晴朗", "转晴",
"转晴", "雨夹冰雹", "热", "雷阵雨", "雷阵雨", "雷阵雨", "雷阵雨", "大雪", "阵雪", "大雪",
"多云", "雷", "阵雪", "雷雨" };
public GetWeatherInfo() {
initCitys();
}
/* 初始化城市代号 */
privatevoid initCitys() {
cityCode.put("北京", "0008");
cityCode.put("天津", "0133");
cityCode.put("武汉", "0138");
cityCode.put("杭州", "0044");
cityCode.put("合肥 ", "0448");
cityCode.put("上海 ", "0116");
cityCode.put("福州 ", "0031");
cityCode.put("重庆 ", "0017");
cityCode.put("南昌 ", "0097");
cityCode.put("香港 ", "0049");
cityCode.put("济南 ", "0064");
cityCode.put("澳门 ", "0512");
cityCode.put("郑州 ", "0165");
cityCode.put("呼和浩特 ", "0249");
cityCode.put("乌鲁木齐 ", "0135");
cityCode.put("长沙 ", "0013");
cityCode.put("银川 ", "0259");
cityCode.put("广州 ", "0037");
cityCode.put("拉萨 ", "0080");
cityCode.put("海口 ", "0502");
cityCode.put("南京 ", "0100");
cityCode.put("成都 ", "0016");
cityCode.put("石家庄 ", "0122");
cityCode.put("贵阳 ", "0039");
cityCode.put("太原 ", "0129");
cityCode.put("昆明 ", "0076");
cityCode.put("沈阳 ", "0119");
cityCode.put("西安 ", "0141");
cityCode.put("长春 ", "0010");
cityCode.put("兰州 ", "0079");
cityCode.put("西宁 ", "0236");
}
private Document getWeatherXML(String cityCode) throws IOException {
URL url =new URL("http://weather.yahooapis.com/forecastrss?p=CHXX"
+ cityCode +"&u=c");
URLConnection connection = url.openConnection();
Document Doc = stringToElement(connection.getInputStream());
return Doc;
}
/* 保存获取的天气信息XML文档 */
privatevoid saveXML(Document Doc, String Path) {
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = transFactory.newTransformer();
DOMSource domSource =new DOMSource(Doc);
File file =new File(Path);
FileOutputStream out =new FileOutputStream(file);
StreamResult xmlResult =new StreamResult(out);
transformer.transform(domSource, xmlResult);
} catch (Exception e) {
System.out.println("保存文件出错!");
}
}
/* 获取天气信息 */
public String getWeather(String city) {
String result =null;
try {
Document doc = getWeatherXML(GetWeatherInfo.cityCode.get(city));
NodeList nodeList = doc.getElementsByTagName("channel");
for (int i =0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
NodeList nodeList1 = node.getChildNodes();
for (int j =0; j < nodeList1.getLength(); j++) {
Node node1 = nodeList1.item(j);
if (node1.getNodeName().equalsIgnoreCase("item")) {
NodeList nodeList2 = node1.getChildNodes();
for (int k =0; k < nodeList2.getLength(); k++) {
Node node2 = nodeList2.item(k);
if (node2.getNodeName().equalsIgnoreCase(
"yweather:forecast")) {
NamedNodeMap nodeMap = node2.getAttributes();
Node lowNode = nodeMap.getNamedItem("low");
Node highNode = nodeMap.getNamedItem("high");
Node codeNode = nodeMap.getNamedItem("code");
String day ="今天";
if (result ==null) {
result ="";
} else {
day ="\n明天";
}
result = result
+ day
+""
+ dictionaryStrings[Integer
.parseInt(codeNode
.getNodeValue())]
+"\t最低温度:"+ lowNode.getNodeValue()
+"℃ \t最高温度:"+ highNode.getNodeValue()
+"℃ ";
}
}
}
}
}
saveXML(doc, "C:\\Users\\ygui\\Desktop\\Weather.xml");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public Document stringToElement(InputStream input) {
try {
DocumentBuilder db = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = db.parse(input);
return doc;
} catch (Exception e) {
returnnull;
}
}
}
publicclass Test {
publicstaticvoid main(String arg[]) {
GetWeatherInfo info =new GetWeatherInfo();
String weather = info.getWeather("武汉");
System.out.println(weather);
}
}

Java获取yahoo天气预报的更多相关文章
- java获取天气预报的信息
运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...
- java获取https网站证书,附带调用https:webservice接口
一.java 获取https网站证书: 1.创建一个java工程,新建InstallCert类,将以下代码复制进去 package com; import java.io.BufferedReader ...
- java获取图片原始尺寸
java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...
- java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)
一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start= ...
- Java获取Web服务器文件
Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...
- 【java 获取数据库信息】获取MySQL或其他数据库的详细信息
1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...
- java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换
java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...
- spring java 获取webapp下文件路径
spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
随机推荐
- Unix环境高级编程(十三)守护进程
守护进程也称为精灵进程是一种生存期较长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.unix系统有很多守护进程,大多数 ...
- spineRunTime for cocos2dx v3 中动画播完删除animation
spineRunTime for cocos2dx v3 中删除animation,发现下面写法会崩溃: spine::SkeletonAnimation* animationNode = spi ...
- Java总结篇系列:Java多线程(四)
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- 《Effective Java》读书笔记四(泛型)
Java1.5发行版本中增加了泛型(Generic).在没有泛型之前,从集合中读取到的每一个对象都必须进行转换.如果有人不小心插入了错误的类型对象,在运行时的转换处理就会出错.有了泛型之后,可以告诉编 ...
- 【JavaWeb】(10)微信公众号开发进阶
因为普通开发会有很多的权限限制,所以我们能够申请一个測试账号来开发体验一下微信公众号的其它接口功能. 申请測试号我就不介绍了.非常easy.申请成功后,还须要配置Url地址和token,和我们普通公众 ...
- tcp connection
三次握手与四次挥手的原因 https://yq.aliyun.com/articles/7435?spm=5176.8091938.0.0.N4v33a linux里的backlog详解 tcp co ...
- angular学习笔记(十一)-表达式
本篇只要介绍angular表达式: 在之前的例子中,我们多半是直接把数据作为angular标识符的值,但其实可以使用表达式来做更多的事情: 比如: {{number}} 也可以是: {{number+ ...
- 微信支付V3版本的那些事
最近在接入微信支付这块功能,博客园也有很多博友发表了支付的各种吐槽和解决之道,基于那些经验分享之上,我也来说说我的填坑之路. 1:准备工作,首先去申请注册一个公众号——服务号,然后将微信支付功能开通, ...
- MySQL修改root密码的多种方法(转)
http://jingyan.baidu.com/article/0320e2c198ad5f1b87507bc8.html ********************************* 方法1 ...
- echarts报错Cannot read property 'features' of undefined
引入地图的时候 echarts2报错: Uncaught Error: [MODULE_MISS]"echarts/src/util/mapData/params" is not ...