공공데이터 Open API 활용하기

2019. 7. 25. 19:11JAVA

#1 API가 제공하는 XML문서를 파싱하여 사용한다.

 

#2 제공되는 XML은 다음과 같다.

 

#3 먼저 console에서 확인해보기 위한 코드이다.

 

package com.myproject.myapi;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

public class apitest {

    public static void main(String[] args) {

        // 지역코드 List에 담기

        List<String> regId = new ArrayList<String>();

        String strid = "11B10101@" + "11B20201@" + "11B20601@" + "11B20605@" + "11B20602@" + "11B10103@" + "11B10102@"

                + "11B20606@" + "11B20603@" + "11B20609@" + "11B20612@" + "11B20610@" + "11B20611@" + "11B20604@"

                + "11B20503@" + "11B20501@" + "11B20502@" + "11B20504@" + "11B20701@" + "11B20703@" + "11B20702@"

                + "11B20301@" + "11B20302@" + "11B20305@" + "11B20304@" + "11B20401@" + "11B20402@" + "11B20403@"

                + "11B20404@" + "11B20101@" + "11B20102@" + "11B20202@" + "11B20204@" + "11B20203@" + "11A00101@"

                + "11H20201@" + "11H20101@" + "11H20304@" + "11H20102@" + "11H20301@" + "11H20601@" + "11H20603@"

                + "11H20604@" + "11H20602@" + "11H20701@" + "11H20704@" + "11H20402@" + "11H20502@" + "11H20503@"

                + "11H20703@" + "11H20501@" + "11H20401@" + "11H20403@" + "11H20404@" + "11H20405@" + "11H10701@"

                + "11H10702@" + "11H10703@" + "11H10704@" + "11H10705@" + "11H10601@" + "11H10602@" + "11H10603@"

                + "11H10604@" + "11H10605@" + "11H10501@" + "11H10502@" + "11H10503@" + "11H10302@" + "11H10301@"

                + "11H10303@" + "11H10401@" + "11H10402@" + "11H10403@" + "11H10101@" + "11H10102@" + "11H10201@"

                + "11H10202@" + "1.10E+102@" + "1.10E+103@" + "11F20501@" + "11F20503@" + "11F20502@" + "11F20504@"

                + "11F20505@" + "21F20102@" + "21F20101@" + "21F20801@" + "21F20804@" + "21F20802@" + "21F20201@"

                + "21F20803@" + "11F20701@" + "11F20603@" + "11F20405@" + "11F20402@" + "11F20601@" + "11F20602@"

                + "11F20301@" + "11F20303@" + "11F20304@" + "11F20302@" + "11F20401@" + "11F20403@" + "11F20404@"

                + "11F10201@" + "11F10202@" + "21F10501@" + "11F10203@" + "21F10502@" + "11F10401@" + "21F10601@"

                + "11F10302@" + "21F10602@" + "11F10403@" + "11F10204@" + "11F10402@" + "11F10301@" + "11F10303@"

                + "11C20401@" + "11C20404@" + "11C20402@" + "11C20602@" + "11C20403@" + "11C20601@" + "11C20301@"

                + "11C20302@" + "11C20303@" + "11C20101@" + "11C20102@" + "11C20103@" + "11C20104@" + "11C20201@"

                + "11C20202@" + "11C20502@" + "11C20501@" + "11C10301@" + "11C10304@" + "11C10303@" + "11C10102@"

                + "11C10101@" + "11C10103@" + "11C10201@" + "11C10202@" + "11C10302@" + "11C10403@" + "11C10402@"

                + "11C10401@" + "11D10101@" + "11D10102@" + "11D10201@" + "11D10202@" + "11D10301@" + "11D10302@"

                + "11D10401@" + "11D10402@" + "11D10501@" + "11D10502@" + "11D10503@" + "11D20201@" + "11D20401@"

                + "11D20402@" + "11D20403@" + "11D20501@" + "11D20601@" + "11D20602@" + "11D20301@" + "11G00201@"

                + "11G00401@" + "11G00101@" + "11G00501@" + "11G00302@" + "11G00601@" + "11G00800@" + "12F00200@"

                + "12F00100@" + "12B20100@" + "12B20200@" + "12B10100@" + "12D00000@" + "1.20E+01@" + "12C10100@"

                + "12C10201@" + "12C10202@" + "12C30100@" + "12C30200@" + "12C20100@" + "12C20200@" + "12A30100@"

                + "12A30201@" + "12A30202@" + "12A10100@" + "12A10200@" + "12A20200@" + "12A20100@" + "12G00000@"

                + "12B10400@" + "12B10300@" + "12A20102@" + "12A20101@" + "12B20103@" + "12C10101@" + "12B20102@"

                + "12B20101@" + "12B20104@" + "12C10102@" + "12C10103@" + "22A30103@" + "22A30104@" + "22A30105@"

                + "12B10101@" + "12B10102@" + "22A30101@" + "22A30102@" + "12A20103@" + "12A20104@" + "12C20103@"

                + "12C20102@" + "12C20101@" + "12B10302@" + "12B10303@" + "12B10301@" + "12B10304@" + "12B10201@"

                + "12B10202@";

        String[] strid2 = strid.split("@");

        for (int i = 0; i < strid2.length; i++) {

            regId.add(strid2[i]);

        }

        BufferedReader br = null;

        String serviceKey = "인증키";

        for (int k = 0; k < regId.size(); k++) {

            String urlstr = "http://newsky2.kma.go.kr/service/ForecastZoneInfoService/ForecastZoneCodeDataInfo?"

                    + "regId=" + regId.get(k) // 구역 코드

                    + "&" + "pageNo=1" // 페이지 수

                    + "&numOfRows=1" + "&" + "ServiceKey=" + serviceKey;

            try {

                URL url = new URL(urlstr);

                HttpURLConnection urlconnection = (HttpURLConnection) url.openConnection();

                urlconnection.setRequestMethod("GET");

                br = new BufferedReader(new InputStreamReader(urlconnection.getInputStream(), "UTF-8"));

                String result = "";

                String line;

                while ((line = br.readLine()) != null) {

                    result = result + line + "\n";

                } // while

                System.out.println(result);

            } catch (Exception e) {

                System.out.println(e.getMessage());

            } // catch

        }

    }// main

}

 

#4 XML을 파싱하여 사용해보자

package com.myproject.myapi;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

 

public class xmlParing {

    //item 정보를 가져오는 메소드 

    private static String getTagValue(String tag, Element ele) {

        NodeList nodeList = ele.getElementsByTagName(tag).item(0).getChildNodes();

        Node nValue = (Node) nodeList.item(0);

        if(nValue == null) {

            return null;

        }

        return nValue.getNodeValue();

    }// getTagValue

    

    public static void main(String[] args) {

        String serviceKey = "인증키";

        int page =1//페이지 초기값

        try {

            while(true) {

                //parsing할 url 지정 

                String url = "http://newsky2.kma.go.kr/service/ForecastZoneInfoService/ForecastZoneCodeDataInfo?"

                        + "regId=11B10101"  // 구역 코드

                        + "&" + "pageNo="+page // 페이지 수

                        + "&numOfRows=1" + "&" + "ServiceKey=" + serviceKey;

                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

                DocumentBuilder dBuilder  = dbFactory.newDocumentBuilder();

                Document doc = dBuilder.parse(url);

                 

                //root tag

                doc.getDocumentElement().normalize();

                System.out.println("Root Element : "+doc.getDocumentElement().getNodeName());

                

                // parsing tag

                NodeList nodeList = doc.getElementsByTagName("item");

                System.out.println("파싱할 리스트 수 : "+ nodeList.getLength());

                for(int temp =0; temp<nodeList.getLength(); temp++) {

                    Node nNode = nodeList.item(temp);

                    if(nNode.getNodeType()==Node.ELEMENT_NODE) {

                        Element element = (Element) nNode;

                        System.out.println("##########################");

                        System.out.println("위도: "+getTagValue("lat", element));

                        System.out.println("경도: "+getTagValue("lon", element));

                        System.out.println("예보구역명(영문): "+getTagValue("regEn", element));

                        System.out.println("예보구역코드: "+getTagValue("regId", element));

                        System.out.println("예보구역명(한글): "+getTagValue("regName", element));

                        System.out.println("지역특성: "+getTagValue("regSp", element));

                        System.out.println("상위구역코드: "+getTagValue("regUp", element));

                        System.out.println("순번: "+getTagValue("seq", element));

                        System.out.println("3시간예보관서: "+getTagValue("stnF3", element));

                        System.out.println("종료시각: "+getTagValue("tmEd", element));

                        System.out.println("시작시각: "+getTagValue("tmSt", element));

                    }//if

                }//for

                page += 1;

                if(page >12) {

                    break;

                }

            }//while 

        } catch (Exception e) {

            e.printStackTrace();

        }

    }//main

}