http://flash.weather.com.cn/wmaps/xml/china.xml
能够获取国内各省及省会城市的天气,可以通过pyName载入各省内城市的天气
如:河北省 pyName="hebei"
http://flash.weather.com.cn/wmaps/xml/hebei.xml
就可以载入河北省各城市天气,可以通过pyName="shijiazhuang"
载入石家庄的详细天气
http://flash.weather.com.cn/wmaps/xml/shijiazhuang.xml
"http://flash.weather.com.cn/wmaps/xml/"+place+".xml"
内容说明
state1="0" //天气图标1
state2="0" //天气图标2
stateDetailed="晴" //天气说明
tem1="9" //最高气温
tem2="1" //最低气温
temNow="2" //当前实况气温
windState="南风转北风小于3级" //风向风速预报
windDir="西北风" //当前实况风向
windPower="小于3级" //当前实况风速
humidity="77%" //湿度
time="09:55" //发布时间
url="101090101" //链接地
有木有人能帮忙解析一下他的xml
在用Android获取天气预报数据时,大家一定会首先想到Google的天气预报API,其实除了Google的天气预报API,免费的天气预报接口还有http://www.webservicex.net/globalweather.asmx?op=GetWeather、http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx和中央气象台的天气预报,这三个是我最近试过的都可以访问,网上其实还介绍的有www.ayandy.com,不过我没试过 ^_^
现在就来谈一谈这几个服务,google的就不说了,www.webservicex.net的这个是一个国外的,获取中国国内的有点麻烦,且只有当天的天气,所以果断放弃...呵呵
而webservice.webxml.com.cn的这个确实不错,访问的数据是来自中国气象局http://www.cma.gov.cn/ 数据的准确就不用说了,但他分为付费和免费的,免费的服务有点不稳定,我就曾遇到一回,所以也不是很好,最后就只剩下中央气象台的天气预报的API了,这个我不想说太多,虽然获取时你首先要知道对应的城市码,有点麻烦,其它的如稳定性与广阔性也是很一流的,它可以精确到县和区.下面就直奔主题:
这个服务的天气预报的请求地址是:http://m.weather.com.cn/data/101070201.html,这个文本就是城市天气URL,101070201代表的为对应地区的编码,执行URL,得到一个返回文本,是JSON格式的,如下(经过格式化):
- {
- "weatherinfo":{
- "city":"成都",
- "city_en":"chengdu",
- "date_y":"2011年11月30日",
- "date":"辛卯年",
- "week":"星期三",
- "fchh":"11",//预报发布时间
- "cityid":"101270101",
- "temp1":"13℃~10℃",
- "temp2":"14℃~6℃",
- "temp3":"13℃~5℃",
- "temp4":"14℃~8℃",
- "temp5":"10℃~8℃",
- "temp6":"11℃~6℃",
- "tempF1":"55.4℉~50℉",
- "tempF2":"57.2℉~42.8℉",
- "tempF3":"55.4℉~41℉",
- "tempF4":"57.2℉~46.4℉",
- "tempF5":"50℉~46.4℉",
- "tempF6":"51.8℉~42.8℉",
- "weather1":"阴转多云",
- "weather2":"多云转晴",
- "weather3":"多云转阴",
- "weather4":"阵雨",
- "weather5":"阵雨转小雨",
- "weather6":"小雨转阴",
- "img1":"2",
- "img2":"1",
- "img3":"1",
- "img4":"0",
- "img5":"1",
- "img6":"2",
- "img7":"3",
- "img8":"99",
- "img9":"3",
- "img10":"7",
- "img11":"7",
- "img12":"2",
- "img_single":"2",
- "img_title1":"阴",
- "img_title2":"多云",
- "img_title3":"多云",
- "img_title4":"晴",
- "img_title5":"多云",
- "img_title6":"阴",
- "img_title7":"阵雨",
- "img_title8":"阵雨",
- "img_title9":"阵雨",
- "img_title10":"小雨",
- "img_title11":"小雨",
- "img_title12":"阴",
- "img_title_single":"阴",
- "wind1":"北风小于3级",
- "wind2":"北风小于3级",
- "wind3":"北风小于3级",
- "wind4":"南风转北风小于3级",
- "wind5":"北风小于3级",
- "wind6":"北风小于3级",
- "fx1":"北风",
- "fx2":"北风",
- "fl1":"小于3级",
- "fl2":"小于3级",
- "fl3":"小于3级",
- "fl4":"小于3级",
- "fl5":"小于3级",
- "fl6":"小于3级",
- "index":"舒适",
- "index_d":"建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。",
- "index48":"舒适",
- "index48_d":"建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。",
- "index_uv":"最弱",
- "index48_uv":"弱",
- "index_xc":"适宜",
- "index_tr":"很适宜",
- "index_co":"较舒适",
- "st1":"14",
- "st2":"10",
- "st3":"14",
- "st4":"6",
- "st5":"13",
- "st6":"4",
- "index_cl":"较适宜",
- "index_ls":"不太适宜",
- "index_ag":"较易发"
- }
- }
上面显示的信息一目了然,就不用我多说了(在得到天气数据的解析android2.2可用JSONObject对象参考:
http://henzil.easymorse.com/?p=242),关键是获得对应地区的城市码了。
访问http://m.weather.com.cn/data5/city.xml得到一级列表(省、直辖市、自治区),结果用逗号隔开,id和城市名称使用竖线“|”隔开;结果示例如下:
- 01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,09|河北,10|山西,11|陕西,.....
然后通过这一次访问得到的一级码得到二级码,如查找河北的:http://m.weather.com.cn/data5/city09.xml在city后加上一级码得到:
- 0901|石家庄,0902|保定,0903|张家口,0904|承德,0905|唐山,0906|廊坊,0907|沧州,0908|衡水,0909|邢台,0910|邯郸,0911|秦皇岛
然后再通过得到的二级码得到三级的县或区的编码:如唐山:http://m.weather.com.cn/data5/city0905.xml:
- 090501|唐山,090502|丰南,090503|丰润,090504|滦县,090505|滦南,090506|乐亭,090507|迁西,090508|玉田,090509|唐海,090510|遵化,090511|迁安
最后由得到了三级码就可能得到它对应的城市码了,如访问唐山.迁西:http://m.weather.com.cn/data5/city090507.xml得到:
则可知河北.唐山.迁西的城市编码为:101090507,得到它的天气则通过访问http://m.weather.com.cn/data/101090507.html得到。
好了,相信通过上面的叙述,大家应该知道怎么得到一个城市的天气了;但接下来问题又来了,那我们怎样通过Android访问来得到全国任意一个地区的天气呢?难道每一次访问网络三次得到城市码,再用它访问m.weather.com.cn这个网址得到天气码?天啊?这怎么行!要知道我们手中的移动设备可不像电脑那样"富有",流量是要扣钱的!!
相信计算机算法好的同鞋已经想到了,就是通过程序将有的城市对应的天气码一次访问到本地用android上的数据库保存起来,这样在每一次需要时,只需查询一下数据库就可以了,那关键就是怎样遍历得到所有的城市码,现给出本人的遍历代码(来自于本人天气预报系统):
-
WebAccessToolswebTools=newWebAccessTools(this);
-
-
StringwebContent=webTools.getWebContent("http://m.weather.com.cn/data5/city.xml");
-
-
String[][]provinces=WeaterInfoParser.parseCity(webContent);
-
String[]groups=newString[provinces.length];
-
String[][]childs=newString[provinces.length][];
-
String[][]cityCode=newString[provinces.length][];
-
for(inti=0;i<provinces.length;i++){
-
groups[i]=provinces[i][1];
-
-
StringBufferurlBuilder=newStringBuffer("http://m.weather.com.cn/data5/city");
-
urlBuilder.append(provinces[i][0]);
-
urlBuilder.append(".xml");
- webContent=webTools.getWebContent(urlBuilder.toString());
- String[][]citys=WeaterInfoParser.parseCity(webContent);
-
-
String[][][]towns=newString[citys.length][][];
-
-
intsum=0;
-
for(intj=0;j<citys.length;j++){
-
-
urlBuilder=newStringBuffer("http://m.weather.com.cn/data5/city");
-
urlBuilder.append(citys[j][0]);
-
urlBuilder.append(".xml");
- webContent=webTools.getWebContent(urlBuilder.toString());
- towns[j]=WeaterInfoParser.parseCity(webContent);
- sum=sum+towns[j].length;
- }
-
childs[i]=newString[sum];
-
cityCode[i]=newString[sum];
-
sum=0;
-
for(intj=0;j<citys.length;j++){
-
for(intn=0;n<towns[j].length;n++){
-
if(n==0)
-
childs[i][sum]=towns[j][n][1];
-
else
-
childs[i][sum]=towns[j][0][1]+"."+towns[j][n][1];
-
urlBuilder=newStringBuffer("http://m.weather.com.cn/data5/city");
-
urlBuilder.append(towns[j][n][0]);
-
urlBuilder.append(".xml");
- webContent=webTools.getWebContent(urlBuilder.toString());
- String[][]code=WeaterInfoParser.parseCity(webContent);
-
cityCode[i][sum]=code[0][1];
-
sum=sum+1;
- }
- }
-
urlBuilder=null;
- }
-
-
-
-
-
-
-
Stringpath="/data"+Environment.getDataDirectory().getAbsolutePath()+"/com.weather.app/db_weather.db";
- SQLiteDatabasedatabase=SQLiteDatabase.openOrCreateDatabase
-
(path,null);
-
-
Stringsql="createtableprovinces(_idintegerprimarykeyautoincrement,nametext)";
- database.execSQL(sql);
-
-
sql="createtablecitys(_idintegerprimarykeyautoincrement,province_idinteger,nametext,city_numtext)";
- database.execSQL(sql);
-
-
ContentValuescv=null;
-
for(inti=0;i<provinces.length;i++){
-
cv=newContentValues();
-
cv.put("name",provinces[i][1]);
-
database.insert("provinces",null,cv);
- }
-
-
for(inti=0;i<childs.length;i++){
-
for(intj=0;j<childs[i].length;j++){
-
cv=newContentValues();
-
cv.put("province_id",i);
-
cv.put("name",childs[i][j]);
-
cv.put("city_num",cityCode[i][j]);
-
database.insert("citys",null,cv);
- }
- }
-
cv=null;
- database.close();
下面给出WebAccessTools工具类:
- publicclassWebAccessTools{
-
-
privateContextcontext;
-
-
publicWebAccessTools(Contextcontext){
-
this.context=context;
- }
-
-
publicStringgetWebContent(Stringurl){
-
-
HttpGetrequest=newHttpGet(url);
-
-
HttpParamsparams=newBasicHttpParams();
-
-
HttpConnectionParams.setConnectionTimeout(params,3000);
-
HttpConnectionParams.setSoTimeout(params,5000);
-
-
HttpClienthttpClient=newDefaultHttpClient(params);
-
try{
-
- HttpResponseresponse=httpClient.execute(request);
-
-
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
-
- Stringcontent=EntityUtils.toString(response.getEntity());
-
returncontent;
-
}else{
-
-
Toast.makeText(context,"网络访问失败,请检查您机器的联网设备!",Toast.LENGTH_LONG).show();
- }
-
}catch(Exceptione){
- e.printStackTrace();
-
}finally{
-
- httpClient.getConnectionManager().shutdown();
- }
-
returnnull;
- }
- }
就一个方法.
下面的解析工具类也只一个方法:
- publicclassWeaterInfoParser{
-
-
publicstaticString[][]parseCity(Stringcontent){
-
-
if(content!=null&&content.trim().length()!=0){
-
StringTokenizerst=newStringTokenizer(content,",");
-
intcount=st.countTokens();
-
String[][]citys=newString[count][2];
-
inti=0,index=0;
-
while(st.hasMoreTokens()){
- Stringcity=st.nextToken();
-
index=city.indexOf('|');
-
citys[i][0]=city.substring(0,index);
-
citys[i][1]=city.substring(index+1);
-
i=i+1;
- }
-
returncitys;
- }
-
returnnull;
- }
- }
如上,这样就得到了国内所有地区的城市码数据库文件了,上面的方法在模拟器中运行时很慢,数分钟才能出来结果,要有耐心^_^!!
其通过上面的代码我们得到最重要的是db_weather.db这个文件,在Android中我们只要得到了它就可在程序第一次运行时直接导入到/data/data/包名/databases目录中就行了,已后直接调用,
关于数据库的导入,实质上就是文件的复制,我们只需在将数据库文件放在程序包中的res/raw目录中在运行时复制到databases目录是就行了,下面同样给出导入代码:
-
publicvoidimportInitDatabase(){
-
-
StringdirPath="/data/data/com.weather.app/databases";
-
Filedir=newFile(dirPath);
-
if(!dir.exists()){
- dir.mkdir();
- }
-
-
Filedbfile=newFile(dir,"db_weather.db");
-
try{
-
if(!dbfile.exists()){
- dbfile.createNewFile();
- }
-
-
InputStreamis=this.getApplicationContext().getResources().openRawResource(R.raw.db_weather);
-
FileOutputStreamfos=newFileOutputStream(dbfile);
-
byte[]buffere=newbyte[is.available()];
- is.read(buffere);
- fos.write(buffere);
- is.close();
- fos.close();
-
}catch(FileNotFoundExceptione){
- e.printStackTrace();
-
}catch(IOExceptione){
- e.printStackTrace();
- }
- }
我得到的城市码数据库文件可到http://download.csdn.net/detail/xianqiang1/3896880下载
上面的是我从天气预报系统中截取的部分代码,如有错误,欢迎留言指出!!
参照文章:使用JACKSON解析JSON(HttpClient 3处理请求)http://sarin.iteye.com/blog/821534
声明:感谢summerxzg和kpiao,指出了数据库文件的错误:我使用sqlitebrowser工具查看了一下我生成的db文件,显示出的的城市码数为2566个而summerxzg指出的为2583条,我的为不全。kpiao指出的citys表中的province_id与provinces表中的id不对应是由于代码中的是citys表创建时province_id是由0开始,而provinces表中的自动增长是从1开始故存在不匹配问题。为了准确起见,大家还是自己遍历一个数据库,小子我由于近期较忙暂时不会对上面内容作更改{^_^},再次感谢你们!
分享到:
相关推荐
使用C语言获取中央气象台天气预报,本程序提供接口可查询国内任意城市的天气预报,返回结果为字符串。
中央气象台的天气预报API城市码 Android数库文件
中央气象台天气预报网页,西安天气,纯静态网页
中央气象API开发的天气预报程序,能根据城市来预报天气.
可以实时获取中央气象台网站的城市气象信息,包括天气、温度、风力、天气图标,完全源码,可根据自己需要修改。 如果中央气象台网站改版,只要修改其中的正则匹配即可。 VS2008版。
天气预报采集php,数据为中央气象台数据。
Android2.2天气预报程序源码+开发文档,Java毕业设计+开发文档,写一款Android2.2小程序,读取中央气象台的天气预报API得到天气数据,由此扩展出Android天气预报源码。虽然获取天气时你首先要知道对应的城市码,有点...
网络爬虫,抓取网页数据...................................................
中央气象台API和城市代码,城市代码的全的。
1、封装WeatherInfo实体类,对接口返回的结果进行映射的实体类 2、WeatherUtils类,负责调用第三方天气预报api接口处理的工具类,包括根据城市查询等,返回的格式是json 3、test类,对接口进行功能性测试
说到开发天气预报,就需要找一个开放接口了,接口有很多,不过个人觉得,中国天气网的数据比较准确,而且也有权威性。...有大神解析了中央气象台返回来的数据,并保存为XML格式,数据具体到县、区级别,供大家参考,
数值天气预报以计算机为工具,通过求解由流体力学、热力学、动力气象学组成的预报方程,来制作天气预报;统计预报以概率论数理统计为手段来制作天气预报。 该项目是如何在android上完成一个天气预报项目的应用,以便...
中央气象台提供的准确天气预报,中国天气网.tpl
包含中央气象台的地区编码 中央气象台 地区编码 数据库 android sqlite
(站点改版了,这个版本不能用了) 新版见:http://download.csdn.net/source/2037134 可以实时获取中央气象台网站的气象信息,完全源码,可根据自己需要修改。
java获取中国气象台数据,内有中国气象台api用户id和key
项目使用webservice的方式调用了中央气象局的气象接口,该demo可以满足工作或学习中的大部分需求。
Java毕业设计+开发文档,写一款Android2.2小程序,读取中央气象台的天气预报API得到天气数据,由此扩展出Android天气预报源码。虽然获取天气时你首先要知道对应的城市码,有点麻烦,其它的如稳定性与广阔性也是很...
能够获取国内各省及省会城市的天气,可以通过pyName载入各省内城市的天气 ...1800以秒计算,如果总是实时流量太大的话会刷新影响中央气象台的服务器哦! 以上提到的XML都在同级目录下有,可以打开参看。
Android 城市天气预报源码.rar