中国天气网 JSON接口的城市编码解析及结果

最近在弄一个Android应用,其中一个功能是天气情况展示,准备使用google的天气API服务(http://www.google.com/ig/api?hl=zh-cn&weather=,,,, ),不想这个接口已经在几个月前关闭服务了。于是各种资料,最终决定使用 中国天气网 的服务。

中国天气网提供有两种数据格式的接口:

一、 XML接口

http://flash.weather.com.cn/wmaps/xml/china.xml

http://flash.weather.com.cn/wmaps/xml/changsha.xml

查了好久,发现这个xml接口返回的数据有点乱,果断弃之。

二、JSON接口

http://m.weather.com.cn/data/101250101.html

这个接口返回的是JSON数据,数据格式很好,缺点就是城市编码的问题了。

下面通过XML接口返回的数据来解析全国各地城市所对应的编码,以便使用。

代码:

Java代码  

  1. package com.tangqiang.tools;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.net.URL;
  5. import java.net.URLConnection;
  6. import java.util.List;
  7. import java.util.logging.Logger;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentHelper;
  10. import org.dom4j.Element;
  11. public class CityCode
  12. {
  13. private Logger log = Logger.getLogger(CityCode.class.getName());
  14. public static void main(String[] args) {
  15. try {
  16. CityCode cc = new CityCode();
  17. Document doc = cc.getCityXml();
  18. System.out.println(doc.asXML());
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. /**
  24. * 解析
  25. *
  26. * @return
  27. * @throws Exception
  28. */
  29. @SuppressWarnings("unchecked")
  30. private Document getCityXml() throws Exception {
  31. /** 新建一个doc 保存结果 */
  32. Document docResult = DocumentHelper.createDocument();
  33. Element addElementRoot = DocumentHelper.createElement("china");
  34. String sUrlChina = "http://flash.weather.com.cn/wmaps/xml/china.xml";
  35. String sChinaProvXml = getUrlString(sUrlChina);
  36. Document doc = DocumentHelper.parseText(sChinaProvXml);
  37. Element rootElt = doc.getRootElement(); // 获取根节点
  38. log.info("根节点:" + rootElt.getName()); // 拿到根节点的名称
  39. /** 取得所有省份 */
  40. List<Element> listProv = rootElt.elements("city"); // 获取根节点下的子节点
  41. for (int i = 0; i < listProv.size(); i++) {
  42. Element elementProv = listProv.get(i);
  43. /** 省份名字 */
  44. String sProvName = elementProv.attributeValue("pyName");
  45. String sProvNameCN = elementProv.attributeValue("quName");
  46. /** 添加节点 */
  47. Element addElementProv = DocumentHelper.createElement("prov");
  48. addElementProv.addAttribute("pyName", sProvName);
  49. addElementProv.addAttribute("quName", sProvNameCN);
  50. try {
  51. log.info("查询省份:" + sProvNameCN + " 下的城市!");
  52. String sUrlProv = "http://flash.weather.com.cn/wmaps/xml/" + sProvName + ".xml";
  53. String sProvXml = getUrlString(sUrlProv);
  54. Document docProv = DocumentHelper.parseText(sProvXml);
  55. Element rootEltProv = docProv.getRootElement(); // 获取省份下的跟节点
  56. List<Element> listCity1 = rootEltProv.elements("city");
  57. for (int j = 0; j < listCity1.size(); j++) {
  58. Element elementCity1 = listCity1.get(j);
  59. String sCityName1 = elementCity1.attributeValue("pyName");
  60. String sCityUrl1 = elementCity1.attributeValue("url");
  61. String sCityNameCN1 = elementCity1.attributeValue("cityname");
  62. System.out.println(sCityNameCN1 + ":" + sCityUrl1);
  63. Element addElementMainCity = DocumentHelper.createElement("city");
  64. addElementMainCity.addAttribute("pyName", sCityName1);
  65. addElementMainCity.addAttribute("quName", sCityNameCN1);
  66. addElementMainCity.addAttribute("url", sCityUrl1);
  67. try {
  68. String sUrlCity1 = "http://flash.weather.com.cn/wmaps/xml/" + sCityName1 + ".xml";
  69. log.info("查询主要城市:" + sCityNameCN1 + " 下的城市!");
  70. String sCityXml = getUrlString(sUrlCity1);
  71. Document docCity1 = DocumentHelper.parseText(sCityXml);
  72. Element rootCity1 = docCity1.getRootElement();
  73. List<Element> listCity2 = rootCity1.elements("city");
  74. for (int k = 0; k < listCity2.size(); k++) {
  75. Element elementCity2 = listCity2.get(k);
  76. String sCityName2 = elementCity2.attributeValue("pyName");
  77. String sCityNameCN2 = elementCity2.attributeValue("cityname");
  78. String sCityUrl2 = elementCity2.attributeValue("url");
  79. System.out.println(sCityNameCN2 + ":" + sCityUrl2);
  80. Element addElementCity2 = DocumentHelper.createElement("city2");
  81. addElementCity2.addAttribute("pyName", sCityName2);
  82. addElementCity2.addAttribute("quName", sCityNameCN2);
  83. addElementCity2.addAttribute("url", sCityUrl2);
  84. addElementMainCity.add(addElementCity2);
  85. }
  86. } catch (Exception e) {
  87. log.info("查询主要城市:" + sCityNameCN1 + " 下的城市失败!");
  88. }
  89. addElementProv.add(addElementMainCity);
  90. }
  91. } catch (Exception e) {
  92. log.info("查询省份:" + sProvNameCN + "下的城市失败!");
  93. }
  94. addElementRoot.add(addElementProv);
  95. }
  96. docResult.setRootElement(addElementRoot);
  97. return docResult;
  98. }
  99. /**
  100. * 从url获取xml字符串
  101. *
  102. * @param sUrl
  103. * @return
  104. * @throws Exception
  105. */
  106. private String getUrlString(String sUrl) throws Exception {
  107. String sResult = "";
  108. StringBuffer sbResult = null;
  109. log.info("开始连接Url:" + sUrl);
  110. sbResult = new StringBuffer();
  111. URL url = new URL(sUrl);
  112. URLConnection con = url.openConnection();
  113. BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
  114. String sLine = null;
  115. while ((sLine = br.readLine()) != null) {
  116. sbResult.append(sLine);
  117. }
  118. sResult = sbResult.toString();
  119. log.info("获取到信息:" + sbResult.toString().substring(0, 500));
  120. if (sResult.contains("html")) {
  121. String sInt = "null";
  122. Integer.parseInt(sInt);
  123. }
  124. return sResult;
  125. }
  126. }

中国天气网 JSON接口的城市编码解析及结果

时间: 2024-10-26 15:47:40

中国天气网 JSON接口的城市编码解析及结果的相关文章

中国天气网-天气预报接口api

中国天气网地址:http://www.weather.com.cn 请求服务 : 查询实时天气信息 http://www.weather.com.cn/data/sk/101110101.html 在浏览器中输入请求地址,获得西安的天气. 其中101110101是城市的代码,如果要查询其他城市的天气,只需要修改城市的代码即可,在中国天气网中城市代码如下: 101010100=北京101010200=海淀101010300=朝阳101010400=顺义101010500=怀柔101010600=通

C#实现中国天气网JSON接口测试

接上一篇,经过反复的查看,最终从这篇文章中找到了一个可用的JSON接口,于是研究了一下JSON接口的测试,和上一篇XML接口测试的原理是一样的,只是需要安装一下Newtonsoft.Json: 这个就是传说中的JSON.Net!在项目右键点击“管理NuGet程序包”中搜索json.net然后安装即可,等到项目的引用中出现这个东西的时候就可以在程序里using Newtonsoft.Json了. 还是老套路,不管有用没用,先把接口返回的JSON内容保存到本地一份.这里为了查看方便我直接在控制台打印

中国天气网接口类(中国天气预报)

新写的中国天气网api接口类,分享给大家(妈妈再也不用担心我出门被天气君欺负了). 只需修改两个参数($private_key.$appid)即可使用,这两个参数从中国天气网获取,地址是; http://openweather.weather.com.cn/ 以下是类及使用示例 <?php /** * 中国天气网天气API接口类 * 获取中国天气网天气数据,接口申请地址:http://openweather.weather.com.cn/ * Copyright (c) 2014-2015 ht

C#实现中国天气网XML接口测试

点击链接查看中国天气网接口说明,最近想研究一下接口测试,源于最近一次和某公司的技术总监(交大校友)谈话,发现接口测试的需求是比较大的,于是想要研究一下. 好不容易在网上找到了一个关于中国天气网的接口说明,就是上面那篇.决定访问下这个接口,对接口返回的内容进行分析,筛选出我想要的信息. 想到当时问及的接口主要是json类型的,但是苦于没有找到json类型的接口(上文中的json接口貌似失效了),就先拿xml类型的接口试验一下,我想原理应该都差不多,只是具体的实现有些不同. 若谁有可用的json接口

模块一、调用中国天气网和qqOnline及TrainTimeWebService接口来突出Json方法

一. 浏览网页的时候,发送的请求.服务器反回来的永远是字符串,由于服务器后台使用的语言不通,所以就需要用工具反解,这里用到了json json方法一 json.loads()将字符串转化为python的基本数据类型(内部必须是双引号) 中国天气网城市代码网络接口来 代码实现: 1 req = urllib.request.Request("http://www.weather.com.cn/adat/sk/101010300.html") 2 r = urllib.request.ur

中国天气网城市代码json格式的生成与应用

一.城市代码Json格式生成 各个天气应用普遍使用中国天气网的城市id,但是最近天气网开始要求注册.认证,估计离收费不远,开放接口也时灵时不灵,为了app的流畅运行,可以将城市代码保存到本地使用.源城市代码网址:http://cj.weather.com.cn/support/Detail.aspx?id=51837fba1b35fe0f8411b6df,源城市代码原文: 1 城市ID列表 2 3 citycode 城市 二级 一级 4 5 101010100,北京,北京,北京 6 7 1010

通过中国天气网的通用接口查询天气

通过中国天气网的通用接口查询天气. #coding:utf-8 import urllib2, json from city import city yourcity = raw_input("你想查那个城市的天气?") #yourcity = '杭州' url = "http://www.weather.com.cn/data/cityinfo/" + city[yourcity] + ".html" response = urllib2.ur

Android解析中国天气网的Json数据

在Android开发中.一般的APP都是通过获取server端的数据来更新UI.从server获取到的数据能够是Json.它的数据量要比XML要小,这里解析中国天气网上获取的数据,尽管已经不再更新了.但用来学习还是能够的.为了方便我直接到数据通过txt保存到本地,它的数据能够通过这个页面获取:http://m.weather.com.cn/data/101280601.html 文件夹结构 事实上解析也非常easy.关键代码 private void json3() { InputStream

天气预报接口api(中国天气网)

中国天气weather.comhttp://m.weather.com.cn/data/101110101.html(六天预报) http://www.weather.com.cn/data/sk/101110101.html(实时天气信息) 其中101110101是城市的代码,获得城市代码进入 http://www.weather.com.cn在搜索框上输入你要需要获得天气的城市,点击查询,即可在地址栏获得相应城市编号,然后替换http://m.weather.com.cn/data/1011