前言:获取天气接口数据,需要用一些知识点,比如解析xml,Json数据转换成我们需要的对象,由于之前没有在项目用过。有做成一个小Demo分享下,同时也是让自己学习下。相关接口介绍可以参考课后网的谢周兵的文章:中国天气网接口返回json格式分析及接口(XML、图片接口)说明!
     首先,我们要做的是确定要取数据的城市,当然可以从全国开始,本文的示例仅限在福建省内,根据城市的中文拼音获取相关城市的天气数据。可以创建一个天气处理类WeatherHandler.cs。去中国天气网获取福建的市xml文件URL地址:http://flash.weather.com.cn/wmaps/xml/fujian.xml,获取返回城市的URL代码-用于取天气数据。方法如下:

 1  /// <summary>
 2         /// 获取城市Url代码 - 用于构建请求天气信息的Url地址
 3         /// 目前只支持福建省下级城市 
 4         /// </summary>
 5         /// <param name="cityName">城市名称-拼音 如:xiamen</param>
 6         /// <returns></returns>
 7         public static string GetCityCode(string cityName)
 8         {
 9             // 去中国天气网获取福建的市xml文件
10             string provinceUrl = "http://flash.weather.com.cn/wmaps/xml/fujian.xml";
11 
12             // 解析加载回来的xml文件
13             XmlDocument doc = new XmlDocument();
14             doc.Load(new XmlTextReader(provinceUrl));
15 
16             // 返回城市Url代码 - 用于取天气数据
17             string cityCode = null;
18 
19             if (doc.HasChildNodes)
20             {
21                 foreach (XmlNode pNode in doc.ChildNodes)
22                 {
23                     if (pNode.HasChildNodes)
24                     {
25                         foreach (XmlNode cNode in pNode.ChildNodes)
26                         {
27                             if (cNode.Attributes["pyName"].Value == cityName)
28                             {
29                                 cityCode = cNode.Attributes["url"].Value;
30                                 break;  // 跳出循环
31                             }
32                         }
33                     }
34                 }
35             }
36 
37             return cityCode;
38         }

     第二,根据城市名称(如:xiamen)返回天气类信息,用第一步的方法获取对应返回城市Url代码(如:101230201),构建请求访问天气详细信息的Url地址(如:http://m.weather.com.cn/data/101230201.html),可以得到从中国天气网返回的json数据,我们根据需要返回的结果创建对应的对象WeatherJson,再通过反系列化成自定义好的对象WeatherJson,这样就可以通过对象的方式访问对的数据了。为了让代码复用性更高些,请求发送数据也独立成一个方法。参考代码如下:

 1 /// <summary>
 2         /// 发送请求返回响应的数据
 3         /// </summary>
 4         /// <param name="url">请求的Url地址</param>
 5         /// <returns></returns>
 6         public static string GetRequestData(string url)
 7         {
 8             // 构建一个请求
 9             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
10             // 请求的方式
11             request.Method = "GET";
12 
13             // 请求的响应
14             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
15 
16             // 响应的流
17             Stream responseStream = response.GetResponseStream();
18 
19             // 字符编码
20             Encoding enc = Encoding.GetEncoding("utf-8");
21 
22             // 读取流
23             StreamReader readResponseStream = new StreamReader(responseStream, enc);
24 
25             // 请求的结果
26             string result = readResponseStream.ReadToEnd();
27 
28             // 关闭流,响应,释放资源
29             readResponseStream.Close();
30             response.Close();
31 
32             return result;
33 
34         }
35 
36 /// <summary>
37         /// 根据城市名称返回天气类信息
38         /// 目录只支持福建省下级城市
39         /// </summary>
40         /// <param name="cityName">城市名称-拼音 如:xiamen</param>
41         /// <returns></returns>
42         public static WeatherInfo GetWeatherInfo(string cityName)
43         {
44             // 填充相关的WeatherInfo数据
45             WeatherInfo wInfo = null;
46 
47             try
48             {
49                 // 城市Url代码
50                 string cityCode = GetCityCode(cityName);
51 
52                 // 访问天气详细信息的Url地址
53                 string weatherUrl = "http://m.weather.com.cn/data/" + cityCode + ".html";
54 
55                 // 从中国天气网返回的json数据
56                 string jsonData = GetRequestData(weatherUrl);
57 
58                 // 根据返回的Json数据反系列化自定义好的对象
59                 WeatherJson json = JsonSerializerHelper.FromJsonTo<WeatherJson>(jsonData);
60 
61                 // 填充相关的WeatherInfo数据
62                 wInfo = json.WeatherInfo;    
63             }
64             catch (Exception)
65             {
66             }        
67 
68             return wInfo;
69 
70         }

      第三,就可以调用转换好的对象进行使用了,比如我在控制台输出我想要的数据。

 1 // 确定要取的城市名称 - 拼音
 2             string cityName = "xiamen";
 3 
 4 
 5             WeatherInfo weatherInfo = WeatherHandler.GetWeatherInfo(cityName);
 6 
 7             Console.WriteLine("weatherInfo.City:" + weatherInfo.City);
 8             Console.WriteLine("weatherInfo.CityEn:" + weatherInfo.CityEn);
 9             Console.WriteLine("weatherInfo.CityId:" + weatherInfo.CityId);
10             Console.WriteLine("weatherInfo.DateY:" + weatherInfo.DateY);
11             Console.WriteLine("weatherInfo.FutureTemperature:" + weatherInfo.FutureTemperature);
12             Console.WriteLine("weatherInfo.TodayTemperature:" + weatherInfo.TodayTemperature);
13             Console.WriteLine("weatherInfo.TomorrowTemperature:" + weatherInfo.TomorrowTemperature);
14             Console.WriteLine("weatherInfo.Week:" + weatherInfo.Week);
15            
16             Console.ReadLine();

效果图片:

   最后,关于Json数据转换,我参考博客园作者“颓废”的博文Json序列化和反序列化方法实现的,这边代码就不帖出来了。需要了解的同学可以到相关博客去了解!项目Demo

 

posted on 2012-12-18 19:01  冰慧  阅读(3029)  评论(9编辑  收藏  举报