`
tang&qiang
  • 浏览: 25977 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

16.中国天气网 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;
    }
}

 

结果在附件中,用分别用 xml 和 Json 保存了 2013-03-10 日的城市编码数据。

 

分享到:
评论
1 楼 gdonline 2013-03-24  
感谢分享,我也在研究这个,没有找到直接搜索的接口,只能通过三个 xml 文件来确定编码问题了。

相关推荐

    中国天气网接口城市天气编码资料

    在中国天气网接口中,城市天气编码是一个重要的概念,它用于标识和检索特定城市的实时或预测天气信息。这个编码系统使得开发者能够通过API调用来获取全国各地的气象数据,从而为用户提供精准的天气服务。本文将详细...

    JSON获取天气源码

    在这个“JSON获取天气源码”项目中,开发者提供了通过JSON获取天气预报的方法,支持GB2312和UTF-8两种字符编码,以适应不同的数据处理需求。 源码通常是程序员编写的未经编译或解释的原始代码,它展示了程序的具体...

    权威天气API (中国天气网)使用整理

    对于中国天气网的API,我们需要提供城市编码作为查询参数,例如,获取北京的天气信息,可以构建如下请求: ``` http://wthrcdn.etouch.cn/weather_mini?city=北京的城市编码 ``` 这里的"北京的城市编码"需要替换为...

    java获取中国各地天气获取demo

    中国天气网提供了一个这样的接口,可以返回全国各地的天气信息。在Java中,我们可以使用HTTP客户端库,如Apache HttpClient或OkHttp,来发送GET请求到这个API。例如,我们可能需要构造一个URL,包含城市编码来获取...

    天气预报接口调用例子

    在这个例子中,我们将探讨如何使用C#语言调用一个天气预报接口,从而获取中国各城市的天气信息。 首先,让我们了解什么是接口。接口在编程中是一种定义了特定功能的协议,它规定了类或对象必须实现的方法和属性。在...

    百度API全国城市地区天气查询代码.zip

    这是一个基于百度API实现的全国城市天气查询代码,用于获取并展示中国各地的实时天气信息。在实际的IT应用中,这种功能通常被整合到网页或者移动应用中,为用户提供便捷的气象查询服务。以下是该代码可能涉及的关键...

    Delphi编写天气预报查询小程序[参考].pdf

    这个程序将依赖于网络上的信息,特别是中国天气网的数据,来获取并显示不同城市的天气状况。Delphi是一个强大的RAD(快速应用程序开发)工具,它自带了Indy库,可以方便地处理HTTP请求。 首先,我们需要了解HTTP...

    城市天气code表,excel表,调用天气api城市代码

    这个Excel文件,名为“城市天气code.xlsx”,包含了一个详尽的城市和县区的编码信息,使得开发者能够准确地获取到不同地区的实时天气数据。下面将详细解释相关知识点。 1. **天气API**:天气API(Application ...

    查询天气的小程序

    这一功能是通过调用外部API(Application Programming Interface)——中国天气查询网提供的接口来实现的。 首先,我们需要理解API的工作原理。API是一种让两个软件应用相互通信的方式,这里是指我们的Python程序与...

    中国天气网省市级联页面

    - **城市编码**:`中国天气网城市code.txt`文件很可能包含中国各城市的唯一编码,这些编码与天气数据对应,用于标识和查询特定地区的天气。 - **地理API**:可能使用了中国天气网提供的API来获取省市级的地理信息...

    省市县.db和区域编码

    它们包含了中国所有省份、城市和县的详细信息,可以便捷地被Android应用程序所使用,特别是对于天气查询等功能来说,其重要性不言而喻。 "province_city.db"是一个SQLite数据库文件,这是Android系统广泛支持的一种...

    Ajax 通过城市名获取数据(全国天气预报API)

    在本文中,我们将深入探讨如何使用Ajax技术通过城市名获取全国天气预报数据,结合聚合数据提供的API接口。首先,我们要了解Ajax(异步JavaScript和XML)的核心原理,它允许我们在不刷新整个网页的情况下与服务器进行...

    天气预报抓取

    在中国天气预报网站上抓取天气数据是一项常见的任务,这涉及到网络爬虫技术、数据分析以及可能的API接口利用。以下是一些相关的IT知识点: 1. **网络爬虫**:网络爬虫是自动抓取网页信息的程序,对于天气预报数据的...

    全国天气实时获取程序

    例如,可能需要提供城市编码来获取特定地区的天气信息。 3. **数据解析**:获取到的天气数据通常是JSON或XML格式,需要将这些数据解析成可操作的对象。可以使用如`json`库(Python)或`Gson`(Java)进行解析。 4....

    weatherget.zip

    本文将详述如何使用Python编程语言,通过调用中国天气网的API接口,实现一个简单的城市天气查询系统。该系统不仅可以获取指定城市的天气预报,还能提供未来7天的天气状况。我们将探讨以下核心知识点: 1. Python...

    java基于高德地图实现实时查询天气功能源代码.zip

    请求参数通常包括API密钥、城市名称(可能通过城市编码转换)等,响应数据通常为JSON格式。 4. **JSON解析**:高德地图返回的天气信息是以JSON格式的字符串,需要使用JSON解析库如`org.json`或`Gson`将字符串转换为...

    天气预报更新程序

    中国天气预报服务提供了一个API接口,允许开发者通过发送请求来获取实时和未来的天气数据。这些数据通常包括日期、时间、温度、湿度、风向、风力等级、能见度、紫外线指数、舒适度指数等。开发者需要按照API的规定,...

    JS 获取天气预报的网页

    标题 "JS 获取天气预报的网页" 指的是一个使用JavaScript编程语言编写的网页应用,其主要功能是获取并展示中国天气网(weather.cn)的天气预报信息。这个应用可能包含了一个动态的交互机制,允许用户选择不同的城市...

    获取省市天气预报

    在中国,获取省市天气预报是日常生活中非常常见的需求,这涉及到一系列与信息技术相关的知识点。本章节将深入探讨如何通过编程方式实现这一功能,并介绍一个名为"WeatherService"的服务,该服务可能是一个专门用于...

Global site tag (gtag.js) - Google Analytics