学了一段时间的Web服务,今天做了一个Web服务,利用YAHOO的公开天气API做自己的Web服务,主要是想练练手。现在把过程和心得分享给大家。

求教:这个Web服务还有个不完善的地方,Web服务的 CityNameToCityNum方法,这个最重要,他是把省会和直辖市的名字转换为编号,因为YAHOO传的参数不是城市名字的区号,全是自己的,而我又想不到更好的获得YAHOO城市对应的编号的方法,所以就创建了HASHTABLE存储了中国的各个省会城市和直辖市,希望有高手提出更好的方法,能不用这样,直接找YAHOO获取编号,提取更多的城市,而不用把所有的中国所有的城市全写在HASHTABLE里。


Web服务地址:http://www.h2bbs.com/Weather/Weather.asmx

 

原理:

 在Yahoo的Developer Network

http://developer.yahoo.com/weather/

详细地介绍了Yahoo天气预报的API调用方法,这里用C#来实现,本文主要是利用它的API做Web服务,其它的应用由网友们自由发挥

首先了解Yahoo Weather Api的RSS Response格式(这是下午我查我家银川天气时返回的RSS):

 

利用YAHOO公开API做天气预报Web服务<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
利用YAHOO公开API做天气预报Web服务
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
利用YAHOO公开API做天气预报Web服务  
<channel>
利用YAHOO公开API做天气预报Web服务    
<title>Yahoo! Weather - Yinchuan, CH</title>
利用YAHOO公开API做天气预报Web服务    
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Yinchuan__CH/*http://kb.cnblogs.com/page/42993/%3C/span%3E%3Cspan%20style=" target=_blank>http://kb.cnblogs.com/page/42993/%3C/span%3E%3Cspan%20style=</link>
利用YAHOO公开API做天气预报Web服务
    <description>Yahoo! Weather for Yinchuan, CH</description>
利用YAHOO公开API做天气预报Web服务    
<language>en-us</language>
利用YAHOO公开API做天气预报Web服务    
<lastBuildDate>Tue, 14 Oct 2008 11:00 am CST</lastBuildDate>
利用YAHOO公开API做天气预报Web服务    
<ttl>60</ttl>
利用YAHOO公开API做天气预报Web服务    
<yweather:location city="Yinchuan" region=""  country="CH"/>
利用YAHOO公开API做天气预报Web服务    
<yweather:units temperature="F" distance="mi" pressure="in" speed="mph"/>
利用YAHOO公开API做天气预报Web服务    
<yweather:wind chill="56"  direction="360"  speed="4" />
利用YAHOO公开API做天气预报Web服务    
<yweather:atmosphere humidity="56"  visibility="999"  pressure=""  rising="0" />
利用YAHOO公开API做天气预报Web服务    
<yweather:astronomy sunrise="7:03 am"  sunset="6:19 pm"/>
利用YAHOO公开API做天气预报Web服务    
<image>
利用YAHOO公开API做天气预报Web服务      
<title>Yahoo! Weather</title>
利用YAHOO公开API做天气预报Web服务      
<width>142</width>
利用YAHOO公开API做天气预报Web服务      
<height>18</height>
利用YAHOO公开API做天气预报Web服务      
<link>http://weather.yahoo.com</link>
利用YAHOO公开API做天气预报Web服务
      <url>http://l.yimg.com/us.yimg.com/i/us/nws/th/main_142b.gif</url>
利用YAHOO公开API做天气预报Web服务
    </image>
利用YAHOO公开API做天气预报Web服务    
<item>
利用YAHOO公开API做天气预报Web服务      
<title>Conditions for Yinchuan, CH at 11:00 am CST</title>
利用YAHOO公开API做天气预报Web服务      
<geo:lat>38.48</geo:lat>
利用YAHOO公开API做天气预报Web服务      
<geo:long>106.22</geo:long>
利用YAHOO公开API做天气预报Web服务      
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Yinchuan__CH/*http://kb.cnblogs.com/page/42993/%3C/span%3E%3Cspan%20style=" target=_blank>http://kb.cnblogs.com/page/42993/%3C/span%3E%3Cspan%20style=</link>
利用YAHOO公开API做天气预报Web服务
      <pubDate>Tue, 14 Oct 2008 11:00 am CST</pubDate>
利用YAHOO公开API做天气预报Web服务      
<yweather:condition  text="Mostly Cloudy"  code="28"  temp="56"  date=
"
Tue, 14 Oct 2008 11:00 am CST" />
利用YAHOO公开API做天气预报Web服务      
<description>
利用YAHOO公开API做天气预报Web服务        
<![CDATA[
利用YAHOO公开API做天气预报Web服务
<img src="
利用YAHOO公开API做天气预报Web服务
//l.yimg.com/us.yimg.com/i/us/we/52/28.gif" target=_blank>利用YAHOO公开API做天气预报Web服务//l.yimg.com/us.yimg.com/i/us/we/52/28.gif" border=0 alt='点击查看大图' onload='javascript:if(this.width>screen.width-450)this.width=screen.width-450'>"/><br />
利用YAHOO公开API做天气预报Web服务
<b>Current Conditions:</b><br />
利用YAHOO公开API做天气预报Web服务Mostly Cloudy, 
56 F<BR />
利用YAHOO公开API做天气预报Web服务
<BR /><b>Forecast:</b><BR />
利用YAHOO公开API做天气预报Web服务Tue 
- Mostly Cloudy. High: 68 Low: 47<br />
利用YAHOO公开API做天气预报Web服务Wed 
- Partly Cloudy. High: 70 Low: 44<br />
利用YAHOO公开API做天气预报Web服务
<br />
利用YAHOO公开API做天气预报Web服务
<a href="Full'>http://us.rd.yahoo.com/dailynews/rss/weather/Yinchuan__CH/*http://weather.yahoo.com/forecast/CHXX0259_f.html">Full Forecast at Yahoo! Weather</a><BR/>
利用YAHOO公开API做天气预报Web服务(provided by The Weather Channel)
<br/>
利用YAHOO公开API做天气预报Web服务]]
>
利用YAHOO公开API做天气预报Web服务      
</description>
利用YAHOO公开API做天气预报Web服务      
<yweather:forecast day="Tue" date="14 Oct 2008" low="47" high="68" text
=
"Mostly Cloudy" code="28" />
利用YAHOO公开API做天气预报Web服务      
<yweather:forecast day="Wed" date="15 Oct 2008" low="44" high="70" text
=
"Partly Cloudy" code="30" />
利用YAHOO公开API做天气预报Web服务      
<guid isPermaLink="false">CHXX0259_2008_10_14_11_00_CST</guid>
利用YAHOO公开API做天气预报Web服务    
</item>
利用YAHOO公开API做天气预报Web服务  
</channel>
利用YAHOO公开API做天气预报Web服务
</rss>
利用YAHOO公开API做天气预报Web服务
<!-- api5.weather.sp1.yahoo.com compressed/chunked Mon Oct 13 22:30:39 PDT
2008
 -->
利用YAHOO公开API做天气预报Web服务

 

其中最重要的是后面的几行,查询当天和第二天的天气情况,我们要获取的天气信息就在里面,代码如下:

 

利用YAHOO公开API做天气预报Web服务     <yweather:forecast day="Tue" date="14 Oct 2008" low="47" high="68" text
=
"Mostly Cloudy" code="28" />
利用YAHOO公开API做天气预报Web服务      
<yweather:forecast day="Wed" date="15 Oct 2008" low="44" high="70" text
=
"Partly Cloudy" code="30" />
利用YAHOO公开API做天气预报Web服务

 

我们所需要用到的Node是/rss/channel/item/yweather: forecast;这个节点里的东西是我们需要的。


知道了这些,我们接下来要做的就是在VS中建立WEB服务,并添加下面的代码:

 

利用YAHOO公开API做天气预报Web服务namespace Weather

XmlNamespaceManager(Weather.NameTable);
利用YAHOO公开API做天气预报Web服务            namespacemanager.AddNamespace(
"yweather",
"http://xml.weather.yahoo.com/ns/rss/1.0");
利用YAHOO公开API做天气预报Web服务            XmlNodeList nodes 
= Weather.SelectNodes("/rss/channel/item/yweather:forecast", namespacemanager);
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务            
//XmlNodeList nodes = Weather.GetElementsByTagName("forecast", "http://xml.weather.yahoo.com/ns/rss/1.0");
利用YAHOO公开API做天气预报Web服务

利用YAHOO公开API做天气预报Web服务            DataSet dstWeather 
= new DataSet();
利用YAHOO公开API做天气预报Web服务            DataTable dtblWeather 
= new DataTable("Weather");
利用YAHOO公开API做天气预报Web服务            dstWeather.Tables.Add(dtblWeather);
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务            dstWeather.Tables[
"Weather"].Columns.Add("Date"typeof(string));
利用YAHOO公开API做天气预报Web服务            dstWeather.Tables[
"Weather"].Columns.Add("Week"typeof(string));
利用YAHOO公开API做天气预报Web服务            dstWeather.Tables[
"Weather"].Columns.Add("Weather"typeof(string));
利用YAHOO公开API做天气预报Web服务            dstWeather.Tables[
"Weather"].Columns.Add("Tlow"typeof(string));
利用YAHOO公开API做天气预报Web服务            dstWeather.Tables[
"Weather"].Columns.Add("Thigh"typeof(string));
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务            
if (nodes.Count > 0)
 EmonthToCmonth(node.SelectSingleNode
(
"@date").Value.ToString());
利用YAHOO公开API做天气预报Web服务                    drowWeather[
"Week"= EweekToCweek(node.SelectSingleNode
(
"@day").Value.ToString()) + "(" + node.SelectSingleNode("@day").Value.ToString()
+ ")";
利用YAHOO公开API做天气预报Web服务                    drowWeather[
"Weather"= node.SelectSingleNode("@text").Value;
利用YAHOO公开API做天气预报Web服务                    drowWeather[
"Tlow"= FToC(int.Parse(node.SelectSingleNode
(
"@low").Value)) + "";
利用YAHOO公开API做天气预报Web服务                    drowWeather[
"Thigh"= FToC(int.Parse(node.SelectSingleNode
(
"@high").Value)) + "";
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务                    dstWeather.Tables[
"Weather"].Rows.Add(drowWeather);
利用YAHOO公开API做天气预报Web服务                }

利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务                
return dstWeather;
利用YAHOO公开API做天气预报Web服务            }

利用YAHOO公开API做天气预报Web服务            
else
}

 

别忘了"using System.Xml;"哦!

 

Web服务的代码中有一个Web公开方法,四个私有方法:

(1)GetWeather方法是公共方法,提供Web调用。

(2)FToC方法,他主要是把RSS返回的华氏温度转换成摄氏温度,其实这一步可以不用的,当初没发现,URL中加点参数就返回的是摄氏温度。

(3)EweekToCweek方法,他主要是把英文的星期缩写变成中文。

(4)EmonthToCmonth方法,它主要是把英文的月份缩写变成中文,并重新排序。

(5)CityNameToCityNum方法,这个最重要,他是把省会和直辖市的名字转换为编号,因为YAHOO传的参数不是城市名字的区号,全是自己的,而我又想不到更好的获得YAHOO城市对应的编号的方法,所以就只能支持这么几个城市了,希望有高手提出更好的方法,能不用这样,直接找YAHOO获取编号。

利用YAHOO公开API做天气预报Web服务

 

 

查询个中国随便的省会,效果如下

 

利用YAHOO公开API做天气预报Web服务 <?xml version="1.0" encoding="utf-8" ?> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <DataSet xmlns="http://www.h2bbs.com/WebService/Weather.asmx">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:
UseCurrentLocale
="true">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:complexType>
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:choice minOccurs="0" maxOccurs="unbounded">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:element name="Weather">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:complexType>
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <xs:sequence>
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<xs:element name="Date" type="xs:string" minOccurs="0" /> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<xs:element name="Week" type="xs:string" minOccurs="0" /> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<xs:element name="Weather" type="xs:string" minOccurs="0" /> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<xs:element name="Tlow" type="xs:string" minOccurs="0" /> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<xs:element name="Thigh" type="xs:string" minOccurs="0" /> 
利用YAHOO公开API做天气预报Web服务  
</xs:sequence>
利用YAHOO公开API做天气预报Web服务  
</xs:complexType>
利用YAHOO公开API做天气预报Web服务  
</xs:element>
利用YAHOO公开API做天气预报Web服务  
</xs:choice>
利用YAHOO公开API做天气预报Web服务  
</xs:complexType>
利用YAHOO公开API做天气预报Web服务  
</xs:element>
利用YAHOO公开API做天气预报Web服务  
</xs:schema>
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <NewDataSet xmlns="">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <Weather diffgr:id="Weather1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Date>2008年10月14日</Date> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Week>星期二(Tue)</Week> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Weather>Clear</Weather> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Tlow>16.1</Tlow> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Thigh>26.7</Thigh> 
利用YAHOO公开API做天气预报Web服务  
</Weather>
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
- <Weather diffgr:id="Weather2" msdata:rowOrder="1" diffgr:hasChanges=
"inserted">
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Date>2008年10月15日</Date> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Week>星期三(Wed)</Week> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Weather>Sunny</Weather> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Tlow>16.7</Tlow> 
利用YAHOO公开API做天气预报Web服务
利用YAHOO公开API做天气预报Web服务  
<Thigh>28.3</Thigh> 
利用YAHOO公开API做天气预报Web服务  
</Weather>
利用YAHOO公开API做天气预报Web服务  
</NewDataSet>
利用YAHOO公开API做天气预报Web服务  
</diffgr:diffgram>
利用YAHOO公开API做天气预报Web服务  
</DataSet>
利用YAHOO公开API做天气预报Web服务

 

 

写完了!最后希望能给大家带来收获!

相关文章:

  • 2022-12-23
  • 2021-11-18
  • 2021-12-21
  • 2022-03-04
  • 2021-05-02
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-18
  • 2021-05-28
  • 2021-06-10
  • 2021-09-10
相关资源
相似解决方案