首页 > 代码库 > 分享一个从网上获取天气的代码
分享一个从网上获取天气的代码
项目中需要查询天气,自己写了一段代码从中国天气网和MSN上查天气,中国天气网查中国天气,MSN查世界天气。
MSN用到的数据结构
1 /// <summary> 2 /// 根据城市名查询MSN天返回的城市编码信息类 3 /// </summary> 4 public class Location 5 { 6 //全名 例如 杭州,浙江,中国 7 public string FullName { get; set; } 8 9 //国家10 public string Country { get; set; }11 12 //州13 public string State { get; set; }14 15 //市16 public string City { get; set; }17 18 public int? ZipCode { get; set; }19 20 //经度21 public double? Longitude { get; set; }22 23 //纬度24 public double? Latitude { get; set; }25 26 //地址在MSN天气中对应的编码27 public string LocationCode { get; set; }28 }
中国天气网用到的数据结构
1 /// <summary> 2 /// 天气信息,包含省市县区,温度,天气状况,以及天气图标Uri 3 /// </summary> 4 public class WeatherInfo 5 { 6 public WeatherInfo(string province,string city,string county) 7 { 8 this.Province = province; 9 this.City = city;10 this.County = county;11 }12 13 //省份14 public string Province { get; set; }15 16 //市17 public string City { get; set; }18 19 //县区20 public string County { get; set; }21 22 //街道23 public string District { get; set; }24 25 //温度26 private string temp;27 public string Temp 28 {29 get { return temp+"°C"; }30 set { temp = value; }31 }32 33 //天气状况34 public string Condition { get; set; }35 36 //图标Uri37 public string IconUri { get; set; }38 }
查询中国天气的代码
1 /// <summary> 2 /// 私有类,通过中国天气网查询天气 3 /// </summary> 4 private class ChinaWeather 5 { 6 private string pyProvince, pyCity; 7 private string weatherQueryUrl, weatherIcon; 8 public DataBean.WeatherInfo myWeatherInfo; 9 10 11 /// <summary> 12 /// 构造函数,需要传入WeatherInfo参数,然后根据WeatherInfo里面的Province,City和County进行天气查询,然后修改里面的Temp,Condition和IconUrl 13 /// </summary> 14 /// <param name="WeatherInfo"></param> 15 public ChinaWeather(DataBean.WeatherInfo WeatherInfo) 16 { 17 //获取中国天气网查询接口 18 weatherQueryUrl = GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_CHINA_URL); 19 //获取中国天气网图标Url 20 weatherIcon = GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_CHINA_ICON); 21 22 myWeatherInfo = WeatherInfo; 23 } 24 25 26 /// <summary> 27 /// 查询天气。调用该方法后,会自动查询中国天气网,并更新WeatherInfo参数里面的属性和字段。 28 /// </summary> 29 /// <returns></returns> 30 public bool Query() 31 { 32 if(QueryProvinceInChina(myWeatherInfo.Province)==false) 33 { 34 //如果连省份的天气都没有查到,则查询失败 35 return false; 36 } 37 else 38 { 39 //省份天气查询成功后,再查具体的城市的天气 40 if (QueryCityInProvince(myWeatherInfo.City) == true) 41 { 42 //城市天气查询成功后,再查具体的县区的天气 43 QueryCountyInCity(myWeatherInfo.County); 44 } 45 } 46 //只要查到省份的天气,则认为查询是成功的。 47 return true; 48 } 49 50 51 /// <summary> 52 /// 下载全国天气信息,在里面查具体的省份的天气信息 53 /// </summary> 54 /// <param name="province">省的名字,例如“浙江”,“浙江省”都行</param> 55 /// <returns></returns> 56 private bool QueryProvinceInChina(string province) 57 { 58 string Url = string.Format(weatherQueryUrl, "china"); 59 string GetStr; 60 61 using (WebClient MyWeb = new WebClient()) 62 { 63 MyWeb.Credentials = CredentialCache.DefaultCredentials; 64 65 try 66 { 67 //下载全国各省的天气 68 GetStr = Encoding.UTF8.GetString(MyWeb.DownloadData(Url)); 69 } 70 catch (Exception err) 71 { 72 log.Error("下载全国XML天气失败", err); 73 return false; 74 } 75 } 76 77 try 78 { 79 XmlDocument dom = new XmlDocument(); 80 dom.LoadXml(GetStr); 81 //选择china主节点 82 XmlNode node = dom.SelectSingleNode("china"); 83 //要匹配的字符串模式 84 string patten; 85 Match m; 86 87 foreach (XmlNode n in node.ChildNodes) 88 { 89 //用全国每一个省的中文名去匹配想要查询的省。这样的话,如果想要查询杭州的天气,输入杭州、杭州市、浙江省杭州市等等,只要包含杭州,就可以查到 90 patten = n.Attributes["quName"].Value; 91 m = Regex.Match(province, patten); 92 93 if (m.Success) 94 { 95 //如果匹配上了,也就是查询到该省的天气了,记录该省的天气,返回TRUE 96 pyProvince = n.Attributes["pyName"].Value; 97 //myWeatherInfo.Province = n.Attributes["cityname"].Value; 98 myWeatherInfo.Temp = n.Attributes["tem1"].Value; 99 myWeatherInfo.Condition = n.Attributes["stateDetailed"].Value;100 myWeatherInfo.IconUri = string.Format(weatherIcon, n.Attributes["state1"].Value);101 return true;102 }103 }104 }105 catch (Exception err)106 {107 log.Error("解析全国XML天气失败", err);108 }109 110 return false;111 }112 113 114 /// <summary>115 /// 下载具体的省份的信息,在里面查具体的城市的天气信息116 /// </summary>117 /// <param name="city">要查的城市的名字,例如“杭州”,“杭州市”都行</param>118 /// <returns></returns>119 private bool QueryCityInProvince(string city)120 {121 string Url = string.Format(GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_CHINA_URL), pyProvince);122 string GetStr;123 124 using (WebClient MyWeb = new WebClient())125 {126 MyWeb.Credentials = CredentialCache.DefaultCredentials;127 128 try129 {130 //下载具体的省份的天气信息。xml格式131 GetStr = Encoding.UTF8.GetString(MyWeb.DownloadData(Url)); 132 }133 catch (Exception err)134 {135 log.Error("下载省XML天气失败", err);136 return false;137 }138 }139 140 //解析下载的xml信息141 try142 {143 XmlDocument dom = new XmlDocument();144 dom.LoadXml(GetStr);145 //选择XML中的主节点146 XmlNode node = dom.SelectSingleNode(pyProvince);147 string patten;148 Match m;149 150 foreach (XmlNode n in node.ChildNodes)151 {152 //利用xml中包含的城市名去匹配想要查询的城市名153 patten = n.Attributes["cityname"].Value; 154 m = Regex.Match(city, patten);155 156 if (m.Success) 157 {158 //查询到了,利用城市名中的属性去查县区天气159 pyCity = n.Attributes["pyName"].Value;160 //myWeatherInfo.City = n.Attributes["cityname"].Value;161 myWeatherInfo.Temp = n.Attributes["temNow"].Value;162 myWeatherInfo.Condition = n.Attributes["stateDetailed"].Value;163 myWeatherInfo.IconUri = string.Format(weatherIcon, n.Attributes["state1"].Value);164 return true;165 }166 }167 }168 catch (Exception err)169 {170 log.Error("解析省XML天气失败", err);171 }172 return false;173 }174 175 176 /// <summary>177 /// 下载具体的城市的天气信息,在里面查具体的县区的天气信息178 /// </summary>179 /// <param name="county">要查的县区的名字</param>180 /// <returns></returns>181 private bool QueryCountyInCity(string county)182 {183 string Url = string.Format(GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_CHINA_URL), pyCity);184 string GetStr;185 186 using (WebClient MyWeb = new WebClient())187 {188 MyWeb.Credentials = CredentialCache.DefaultCredentials;189 190 try191 {192 //下载具体的城市的详细天气信息,xml格式193 GetStr = Encoding.UTF8.GetString(MyWeb.DownloadData(Url)); 194 }195 catch (Exception err)196 {197 log.Error("下载市XML天气失败", err);198 return false;199 }200 }201 202 //解析xml格式的城市天气203 try204 {205 XmlDocument dom = new XmlDocument();206 dom.LoadXml(GetStr);207 //选择主节点208 XmlNode node = dom.SelectSingleNode(pyCity);209 string patten;210 Match m;211 212 foreach (XmlNode n in node.ChildNodes)213 {214 //利用xml中包含的各县区的名称去匹配想要查询天气的县区215 patten = n.Attributes["cityname"].Value; 216 m = Regex.Match(county, patten);217 218 if (m.Success) 219 {220 //查询到了,更新WeatherInfo221 //myWeatherInfo.County = n.Attributes["cityname"].Value;222 myWeatherInfo.Temp = n.Attributes["temNow"].Value;223 myWeatherInfo.Condition = n.Attributes["stateDetailed"].Value;224 myWeatherInfo.IconUri = string.Format(weatherIcon, n.Attributes["state1"].Value);225 return true;226 }227 }228 }229 catch (Exception err)230 {231 log.Error("解析市XML天气失败", err);232 }233 return false;234 }235 }
查世界天气的代码
1 /// <summary> 2 /// 私有类,通过MSN查询天气 3 /// </summary> 4 private class MsnWeather 5 { 6 public DataBean.WeatherInfo myWeatherInfo; 7 private string weatherQueryLocation, weatherQueryUrl, weatherQueryIcon; 8 9 10 /// <summary> 11 /// 构造函数,需要传入DataBean.WeatherInfo参数。然后根据该参数中的City字段查询天气。然后会更新该参数中的Temp,Condition和IconUrl 12 /// </summary> 13 /// <param name="WeatherInfo"></param> 14 public MsnWeather(DataBean.WeatherInfo WeatherInfo) 15 { 16 myWeatherInfo = WeatherInfo; 17 18 //获取MSN城市编码接口 19 weatherQueryLocation=GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_FOREIGN_LOCATION); 20 //获取MSN天气查询接口 21 weatherQueryUrl = GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_FOREIGN_URL); 22 //获取本地天气图标路径 23 weatherQueryIcon = GlobalsVars.getSysParameter(Enums.SysParametersType.WEATHER_QUERY_FOREIGN_ICON); 24 } 25 26 27 /// <summary> 28 /// 调用该方法会根据WeatherInfo中的City进行查询 29 /// </summary> 30 /// <returns></returns> 31 public bool Query() 32 { 33 //定义Location列表,因为城市编码查询是模糊查询,会返回匹配的所有编码 34 List<DataBean.Location> mylist = new List<DataBean.Location>(); 35 //查找该城市在MSN上的编码 36 mylist = QueryLocations(myWeatherInfo.City); 37 if (mylist.Count > 0) 38 { 39 //查到有编码,利用匹配到的第一个编码来查询天气 40 if (GetLatestWeatherReport(mylist[0]) == true) 41 return true; 42 } 43 44 return false; 45 } 46 47 48 /// <summary> 49 /// 根据提供的城市名称查询该城市的编码,利用该编码才能在MSN上查询天气 50 /// </summary> 51 /// <param name="query"></param> 52 /// <returns></returns> 53 private List<DataBean.Location> QueryLocations(string query) 54 { 55 if (query == "" || query.Length < 2) 56 return null; 57 List<DataBean.Location> results = new List<DataBean.Location>(); 58 string searchUrl = weatherQueryLocation + query; 59 60 using (XmlTextReader reader = new XmlTextReader(searchUrl)) 61 { 62 try 63 { 64 //读到XML结尾才结束 65 while (reader.Read()) 66 { 67 //读到的是节点,而且节点的名字是weather,那么就是我们需要的天气节点 68 if (reader.NodeType == XmlNodeType.Element && reader.Name.Equals("weather")) 69 { 70 string weatherLocationName, city, state = "", country = "", locationCode; 71 int zipcode; 72 double longitude, latitude; 73 74 //城市名称 格式:城市,国家 75 reader.MoveToAttribute("weatherfullname"); 76 weatherLocationName = reader.Value; 77 78 reader.MoveToAttribute("zipcode"); 79 bool isZipCodeValid = int.TryParse(reader.Value, out zipcode); 80 81 //经度 82 reader.MoveToAttribute("lon"); 83 bool isLongitudeValid = double.TryParse(reader.Value, out longitude); 84 85 //纬度 86 reader.MoveToAttribute("lat"); 87 bool isLatitudeValid = double.TryParse(reader.Value, out latitude); 88 89 //将fullname分解成城市和国家 90 char[] splitter = { ‘,‘ }; 91 string[] cityAndCountry = weatherLocationName.Split(splitter); 92 for (int i = 0; i < cityAndCountry.Length; i++) 93 if (cityAndCountry[i][0] == ‘ ‘) 94 cityAndCountry[i] = cityAndCountry[i].Substring(1); 95 city = cityAndCountry[0]; 96 if (cityAndCountry.Length == 2) 97 { 98 country = cityAndCountry[1]; 99 }100 else if (cityAndCountry.Length == 3)101 {102 state = cityAndCountry[1];103 country = cityAndCountry[2];104 }105 106 //需要查询城市的城市编码,利用这个去MSN上查天气107 reader.MoveToAttribute("weatherlocationcode");108 locationCode = reader.Value; 109 110 DataBean.Location location = new DataBean.Location();111 location.City = city;112 location.Country = country;113 location.FullName = weatherLocationName;114 location.Latitude = (isLatitudeValid) ? latitude : (double?)null;115 location.Longitude = (isLongitudeValid) ? longitude : (double?)null;116 location.State = state;117 location.ZipCode = (isZipCodeValid) ? zipcode : (int?)null;118 location.LocationCode = locationCode;119 120 results.Add(location);121 }122 }123 }124 catch (Exception err)125 {126 log.Error("查询MSN地址信息失败", err);127 }128 129 }130 131 return results;132 }133 134 135 /// <summary>136 /// 根据查询到的城市编码查询天气137 /// </summary>138 /// <param name="location"></param>139 /// <returns></returns>140 private bool GetLatestWeatherReport(DataBean.Location location)141 {142 string feedUrl = weatherQueryUrl + location.LocationCode;143 144 using (XmlTextReader reader = new XmlTextReader(feedUrl))145 {146 try147 {148 //读到xml字符串流的结尾149 while (reader.Read()) 150 {151 if (reader.NodeType == XmlNodeType.Element)152 {153 //只解析当前天气信息,forcast预报信息不解析,直接放弃154 if (reader.Name.Equals("current")) 155 {156 double ImperialTemp;157 //读取温度,华氏温度158 reader.MoveToAttribute("temperature"); 159 double.TryParse(reader.Value, out ImperialTemp);160 //转化为摄氏温度161 int MetricTemp = (int)(5.0 / 9.0 * (ImperialTemp - 32.0));162 163 //天气信息164 reader.MoveToAttribute("skytext");165 string weathercondition = reader.Value;166 167 //天气图片编号168 reader.MoveToAttribute("skycode"); 169 string IconUrl = weatherQueryIcon + reader.Value + ".png";170 171 myWeatherInfo.Temp = MetricTemp.ToString();172 myWeatherInfo.Condition = weathercondition;173 myWeatherInfo.IconUri = IconUrl;174 175 return true;176 }177 }178 }179 }180 catch (Exception err)181 {182 log.Error("获取MSN天气失败", err);183 }184 }185 return false;186 }187 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。