中国天气网 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接口返回的数据来解析全国各地城市所对应的编码,以便使用。
代码:
- package com.tangqiang.tools;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.net.URL;
- import java.net.URLConnection;
- import java.util.List;
- import java.util.logging.Logger;
- import org.dom4j.Document;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- public class CityCode
- {
- private Logger log = Logger.getLogger(CityCode.class.getName());
- public static void main(String[] args) {
- try {
- CityCode cc = new CityCode();
- Document doc = cc.getCityXml();
- System.out.println(doc.asXML());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 解析
- *
- * @return
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- private Document getCityXml() throws Exception {
- /** 新建一个doc 保存结果 */
- Document docResult = DocumentHelper.createDocument();
- Element addElementRoot = DocumentHelper.createElement("china");
- String sUrlChina = "http://flash.weather.com.cn/wmaps/xml/china.xml";
- String sChinaProvXml = getUrlString(sUrlChina);
- Document doc = DocumentHelper.parseText(sChinaProvXml);
- Element rootElt = doc.getRootElement(); // 获取根节点
- log.info("根节点:" + rootElt.getName()); // 拿到根节点的名称
- /** 取得所有省份 */
- List<Element> listProv = rootElt.elements("city"); // 获取根节点下的子节点
- for (int i = 0; i < listProv.size(); i++) {
- Element elementProv = listProv.get(i);
- /** 省份名字 */
- String sProvName = elementProv.attributeValue("pyName");
- String sProvNameCN = elementProv.attributeValue("quName");
- /** 添加节点 */
- Element addElementProv = DocumentHelper.createElement("prov");
- addElementProv.addAttribute("pyName", sProvName);
- addElementProv.addAttribute("quName", sProvNameCN);
- try {
- log.info("查询省份:" + sProvNameCN + " 下的城市!");
- String sUrlProv = "http://flash.weather.com.cn/wmaps/xml/" + sProvName + ".xml";
- String sProvXml = getUrlString(sUrlProv);
- Document docProv = DocumentHelper.parseText(sProvXml);
- Element rootEltProv = docProv.getRootElement(); // 获取省份下的跟节点
- List<Element> listCity1 = rootEltProv.elements("city");
- for (int j = 0; j < listCity1.size(); j++) {
- Element elementCity1 = listCity1.get(j);
- String sCityName1 = elementCity1.attributeValue("pyName");
- String sCityUrl1 = elementCity1.attributeValue("url");
- String sCityNameCN1 = elementCity1.attributeValue("cityname");
- System.out.println(sCityNameCN1 + ":" + sCityUrl1);
- Element addElementMainCity = DocumentHelper.createElement("city");
- addElementMainCity.addAttribute("pyName", sCityName1);
- addElementMainCity.addAttribute("quName", sCityNameCN1);
- addElementMainCity.addAttribute("url", sCityUrl1);
- try {
- String sUrlCity1 = "http://flash.weather.com.cn/wmaps/xml/" + sCityName1 + ".xml";
- log.info("查询主要城市:" + sCityNameCN1 + " 下的城市!");
- String sCityXml = getUrlString(sUrlCity1);
- Document docCity1 = DocumentHelper.parseText(sCityXml);
- Element rootCity1 = docCity1.getRootElement();
- List<Element> listCity2 = rootCity1.elements("city");
- for (int k = 0; k < listCity2.size(); k++) {
- Element elementCity2 = listCity2.get(k);
- String sCityName2 = elementCity2.attributeValue("pyName");
- String sCityNameCN2 = elementCity2.attributeValue("cityname");
- String sCityUrl2 = elementCity2.attributeValue("url");
- System.out.println(sCityNameCN2 + ":" + sCityUrl2);
- Element addElementCity2 = DocumentHelper.createElement("city2");
- addElementCity2.addAttribute("pyName", sCityName2);
- addElementCity2.addAttribute("quName", sCityNameCN2);
- addElementCity2.addAttribute("url", sCityUrl2);
- addElementMainCity.add(addElementCity2);
- }
- } catch (Exception e) {
- log.info("查询主要城市:" + sCityNameCN1 + " 下的城市失败!");
- }
- addElementProv.add(addElementMainCity);
- }
- } catch (Exception e) {
- log.info("查询省份:" + sProvNameCN + "下的城市失败!");
- }
- addElementRoot.add(addElementProv);
- }
- docResult.setRootElement(addElementRoot);
- return docResult;
- }
- /**
- * 从url获取xml字符串
- *
- * @param sUrl
- * @return
- * @throws Exception
- */
- private String getUrlString(String sUrl) throws Exception {
- String sResult = "";
- StringBuffer sbResult = null;
- log.info("开始连接Url:" + sUrl);
- sbResult = new StringBuffer();
- URL url = new URL(sUrl);
- URLConnection con = url.openConnection();
- BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
- String sLine = null;
- while ((sLine = br.readLine()) != null) {
- sbResult.append(sLine);
- }
- sResult = sbResult.toString();
- log.info("获取到信息:" + sbResult.toString().substring(0, 500));
- if (sResult.contains("html")) {
- String sInt = "null";
- Integer.parseInt(sInt);
- }
- return sResult;
- }
- }
中国天气网 JSON接口的城市编码解析及结果的更多相关文章
- C#实现中国天气网JSON接口测试
接上一篇,经过反复的查看,最终从这篇文章中找到了一个可用的JSON接口,于是研究了一下中国天气网JSON接口的测试: 和上一篇XML接口测试的原理是一样的,只是需要安装一下Newtonsoft.Jso ...
- 爬虫-通过本地IP地址从中国天气网爬取当前城市天气情况
1.问题描述 最近在做一个pyqt登录校园网的小项目,想在窗口的状态栏加上当天的天气情况,用爬虫可以很好的解决我的问题. 2.解决思路 考虑到所处位置的不同,需要先获取本地城市地址,然后作为中 ...
- 中国天气网API接口
http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/101010100.h ...
- 中国天气网-天气预报接口api
中国天气网地址:http://www.weather.com.cn 请求服务 : 查询实时天气信息 http://www.weather.com.cn/data/sk/101110101.html 在 ...
- C#实现中国天气网XML接口测试
点击链接查看中国天气网接口说明,最近想研究一下接口测试,源于最近一次和某公司的技术总监(交大校友)谈话,发现接口测试的需求是比较大的,于是想要研究一下. 好不容易在网上找到了一个关于中国天气网的接口说 ...
- 第十二、模块二、调用中国天气网和qqOnline及TrainTimeWebService接口来突出Json方法
一. 浏览网页的时候,发送的请求.服务器反回来的永远是字符串,由于服务器后台使用的语言不通,所以就需要用工具反解,这里用到了json json方法一 json.loads()将字符串转化为python ...
- Android解析中国天气网的Json数据
在Android开发中.一般的APP都是通过获取server端的数据来更新UI.从server获取到的数据能够是Json.它的数据量要比XML要小,这里解析中国天气网上获取的数据,尽管已经不再更新了. ...
- a中国天气网pi(json格式)
http://m.weather.com.cn/data/101050101.html 此接口的回报格式例如以下 { "weatherinfo": { "city&quo ...
- 天气预报接口api(中国天气网)
中国天气weather.comhttp://m.weather.com.cn/data/101110101.html(六天预报) http://www.weather.com.cn/data/sk/1 ...
随机推荐
- Python 查找binlog文件
经常需要在 binlog 中查找一些日志信息,于是写了一个简单的脚本.对于非常巨大的 binlog 文件,该脚本可能会速度慢,毕竟还是用的 list,暂时没想到好办法. 详细看代码: #/usr/bi ...
- play框架概述
今天是来百度实习的第四天,在项目过程中mentor说会用到play框架,当时就一个晕啊.Java还有一个叫play框架,作为一个从大三开始用java的重度javaer,居然不知道这个框架的存在,内心一 ...
- Windows 路径问题
Windows路径是我们经常使用的东西,它看似简单,实际上隐含许多细节,这些都是在平常的使用过程中注意不到的.下面让我们来看看各种各样的Windows路径. 提起路径,我们都会想到" ...
- 日期和时间特效-查看"今天是否为节假日"
———————————————— <script type="text/javascript"> function start() ...
- 深入浅出requireJS-1
我们都知道,虽然我们可以通过原型和继承来使javascript面向对象.但是,当js代码和逻辑过多时,代码的维护和扩展会变的很不方便.这时,nodejs做的非常好,但是在浏览器端模块化的js编程一直都 ...
- java中的静态变量
大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中 ...
- IoC容器Autofac正篇之类型关联(服务暴露)(八)
类型关联 类型关联就是将类挂载到接口(一个或多个)上去,以方便外部以统一的方式进行调用(看下例). 一.As关联 我们在进行手动关联时,基本都是使用As进行关联的. 1 2 3 4 5 6 7 8 ...
- HDU1686:Oulipo
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...
- 安装mongodb到系统服务
一定要以管理员身份打开命令窗口; d盘 创建一个mongodb文件夹,里面有个data文件夹,data里面有db文件夹和log文件夹 mongodb文件夹里面还有个文件mongod.cfg 内容如下 ...
- AJAX 在手机上用时
Response.ContentType = "text/html; text/plain; charset=UTF-8";