본문 바로가기

Program/JAVA

외부 데이터 받기(XML)

22.07.26-외부 데이터 받기(XML)

기상청 데이터 받기


package com.lsc.jul26nw.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Main {
    public static void main(String[] args) {
        String addr = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4141062000";
        try{
            URL u= new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();

            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            String line = null;
            while((line = br.readLine()) != null){
                System.out.println(line);
            }

            br.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

parsing


XML 파싱을 할때 사용하는 파일

XML(eXtended Markup Language)

데이터를 HTML모양으로 표현해 놓은 것

DOM(Document Object Model) 객체:

<xxx 속성명 =”값” 속성명 =”값”..> 속성은 몇개가 들어가도 상관 없다. : 시작태그

YYY: 글자

: 종료 태그

외부 라이브러리를 사용한 데이터 추출


기본 형식

package com.lsc.jul26nw.main;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

//
public class Main {
    public static void main(String[] args) {
        String addr = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4141062000";
        try{
            URL u= new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();

            InputStream is = huc.getInputStream();
//            InputStreamReader isr = new InputStreamReader(is);
//            BufferedReader br = new BufferedReader(isr);

            String line = null;

            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();

            //외부 라이브러리 사용
            XmlPullParser xpp = xppf.newPullParser();
            xpp.setInput(is,"utf-8");//XML은 대부분 UTF-8로 인코딩 되어있다.
            int what = xpp.getEventType(); //처음에 시작되는 값
            while(what != XmlPullParser.END_DOCUMENT){//문서의 끝이 된다면
                if(what == XmlPullParser.START_TAG){
                    System.out.println(xpp.getName()); //태그 이름만 출력 
                }else if (what==XmlPullParser.TEXT) {
                    System.out.println(xpp.getText());//안쪽에 있는 데이터만 출력
                } else if (what == XmlPullParser.END_TAG) {
                    System.out.println(xpp.getName());// "/"가 빠져있는 태그의 끝이 출력 
                }

                xpp.next();
                what = xpp.getEventType();//
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

hour만 추출

package com.lsc.jul26nw.main;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

//
public class Main {
    public static void main(String[] args) {
        String addr = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4141062000";
        try{
            URL u= new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();

            InputStream is = huc.getInputStream();
  //외부 라이브러리 사용
            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = xppf.newPullParser();
            xpp.setInput(is,"utf-8");//XML은 대부분 UTF-8로 인코딩 되어있다.
            int what = xpp.getEventType(); //처음에 시작되는 값
            String t = null;
            while(what != XmlPullParser.END_DOCUMENT){//문서의 끝이 된다면
                if(what == XmlPullParser.START_TAG){
                   t = xpp.getName();
                }else if (what==XmlPullParser.TEXT) {
                    if(t.equals("hour")){
                        System.out.println(xpp.getText()+"시 까지");
                    }else if(t.equals("temp")){
                        System.out.printf("%sC",xpp.getText());
                    } else if (t.equals("wfKor")) {
                        System.out.println(xpp.getText());
                    }
                } else if (what == XmlPullParser.END_TAG) {
                    t="";//XML파일에 태그 끝에 엔터(\r\n)이 되어있어서 그걸 초기화 해줘야함 -> 안하면 text로 읽힘
                }

                xpp.next(); // 순서가 태그 시작 -> 데이터 -> 태그 끝 -> 다음 태그 시작 순으로 연속된다.
                what = xpp.getEventType();//
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

NetWork


공공데이터 사이트

열린데이터광장 메인

https://www.data.go.kr/

경기데이터드림

공공데이터를 사용해서 미세먼지 농도 나오게 하기


코드

package com.lsc.nw.main;

import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class NTMain {
    public static void main(String[] args) {
        String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/xml/RealtimeCityAir/1/25/";
        try{
            URL u = new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            InputStream is = huc.getInputStream();
            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = xppf.newPullParser();
            xpp.setInput(is,"UTF-8");

            int what = xpp.getEventType();
            String temp=null;

            while(what!=XmlPullParser.END_DOCUMENT){
                if(what == XmlPullParser.START_TAG){
                    temp = xpp.getName();
                } else if (what == XmlPullParser.TEXT) {
                    if(temp.equals("MSRRGN_NM")){
                        System.out.print(xpp.getText()+" ");
                    } else if (temp.equals("MSRSTE_NM")) {
                        System.out.println(xpp.getText());
                    } else if (temp.equals("PM10")) {
                        System.out.println("미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
                    } else if (temp.equals("PM25")) {
                        System.out.println("초미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
                    } else if (temp.equals("IDEX_NM")) {
                        System.out.println("오염 정도 : "+xpp.getText());
                        System.out.println();
                    }
                } else if (what==XmlPullParser.END_TAG) {
                    temp="";

                }
                xpp.next();
                what = xpp.getEventType();
            }
            is.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
package com.lsc.nw.main;

import com.sun.org.apache.xerces.internal.xni.parser.XMLPullParserConfiguration;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import javax.imageio.stream.FileImageOutputStream;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class NTMain {
    public static void main(String[] args) {
        String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/xml/RealtimeCityAir/1/25/";
        try{
            URL u = new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            InputStream is = huc.getInputStream();
            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = xppf.newPullParser();
            xpp.setInput(is,"UTF-8");

            //파일로 입력
            FileOutputStream fos = new FileOutputStream("D:\\LSC\\Java\\Java_Study_SL\\Jul26\\dust.csv",true);
            OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
            BufferedWriter bw = new BufferedWriter(osw);

            int what = xpp.getEventType();
            String temp=null;

            while(what!=XmlPullParser.END_DOCUMENT){
                if(what == XmlPullParser.START_TAG){
                    temp = xpp.getName();
                } else if (what == XmlPullParser.TEXT) {
                    if(temp.equals("MSRDT")){
                        String date = xpp.getText();

                        System.out.println(date.substring(0,4)+"년 "+date.substring(4,6)+"월 "+date.substring(6,8)+"일 "+date.substring(8,10)+"시 "+date.substring(10,12)+"분 ");
                        bw.write(date.substring(0,4)+"년 "+date.substring(4,6)+"월 "+date.substring(6,8)+"일 "+date.substring(8,10)+"시 "+date.substring(10,12)+"분 "+",");
                    }else if(temp.equals("MSRRGN_NM")){
                        System.out.print(xpp.getText()+",");
                        bw.write(xpp.getText());
                    } else if (temp.equals("MSRSTE_NM")) {
                        System.out.println(xpp.getText());
                        bw.write(xpp.getText()+",");
                    } else if (temp.equals("PM10")) {
                        System.out.println("미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
                        bw.write("미세먼지 농도 : "+xpp.getText()+" ㎍/㎥"+",");
                    } else if (temp.equals("PM25")) {
                        System.out.println("초미세먼지 농도 : "+xpp.getText()+" ㎍/㎥");
                        bw.write("초미세먼지 농도 : "+xpp.getText()+" ㎍/㎥"+",");
                    } else if (temp.equals("IDEX_NM")) {
                        System.out.println("오염 정도 : "+xpp.getText());
                        bw.write("오염 정도 : "+xpp.getText()+"\r\n");
                        System.out.println();
                    }
                } else if (what==XmlPullParser.END_TAG) {
                    temp="";

                }
                xpp.next();
                what = xpp.getEventType();
            }
            is.close();
            bw.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

네이버 개발자 API 사용


코드

package com.lsc.nw.main;

import org.xmlpull.v1.XmlPullParserFactory;

import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

//DevNaver ID: FH2X7xmgHzfhxZOwmM4K
//DevNaver PW: Xl615uK2WK
// https://openapi.naver.com/v1/search/news.xml

public class NTMain2 {
    public static void main(String[] args) {
        String addr = "https://openapi.naver.com/v1/search/news.xml?query=q";

        Scanner input = new Scanner(System.in);
        System.out.println("뭐 : ");
        String q = input.next();

        try{
            q = URLEncoder.encode(q,"UTF-8");
            URL u = new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            huc.addRequestProperty("X-Naver-Client-Id","FH2X7xmgHzfhxZOwmM4K");
            huc.addRequestProperty("X-Naver-Client-Secret","Xl615uK2WK");

            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"UTF-8");
            BufferedReader br = new BufferedReader(isr);
            System.out.println(br.readLine());
        }catch (Exception e){

        }
    }
}
package com.lsc.nw.main;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

//DevNaver ID: FH2X7xmgHzfhxZOwmM4K
//DevNaver PW: Xl615uK2WK
// https://openapi.naver.com/v1/search/news.xml

public class NTMain2 {
    public static void main(String[] args) {
        String addr = "https://openapi.naver.com/v1/search/news.xml?sort=sim&display=10&query=";

        Scanner input = new Scanner(System.in);
        System.out.println("뭐 : ");
        String q = input.next();

        try{
            q = URLEncoder.encode(q,"UTF-8");
            URL u = new URL(addr+q);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            huc.addRequestProperty("X-Naver-Client-Id","FH2X7xmgHzfhxZOwmM4K");
            huc.addRequestProperty("X-Naver-Client-Secret","Xl615uK2WK");

            //xpp.setInput에 필요해서 설정함
            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"UTF-8");
            BufferedReader br = new BufferedReader(isr);

            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = xppf.newPullParser();
            xpp.setInput(is,"UTF-8");
            int what = xpp.getEventType();
            String t= null;
            while(what!=XmlPullParser.END_DOCUMENT){
                if(what==XmlPullParser.START_TAG){
                    t= xpp.getName();

                } else if (what==XmlPullParser.TEXT) {

                    if(t.equals("title")){
                        System.out.println(xpp.getText());
                        } else if (t.equals("description")) {
                        System.out.println(xpp.getText()+"\r\n");
                    }

                } else if (what==XmlPullParser.END_TAG) {
                }
                xpp.next();
                what = xpp.getEventType();
            }
        }catch (Exception e){
            System.out.println(e);
        }
    }
}
package com.lsc.nw.main;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

//DevNaver ID: FH2X7xmgHzfhxZOwmM4K
//DevNaver PW: Xl615uK2WK
// https://openapi.naver.com/v1/search/news.xml

public class NTMain2 {
    public static void main(String[] args) {
        String addr = "https://openapi.naver.com/v1/search/news.xml?sort=sim&display=10&query=";

        Scanner input = new Scanner(System.in);
        System.out.println("뭐 : ");
        String q = input.next();

        try{
            q = URLEncoder.encode(q,"UTF-8");
            URL u = new URL(addr+q);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            huc.addRequestProperty("X-Naver-Client-Id","FH2X7xmgHzfhxZOwmM4K");
            huc.addRequestProperty("X-Naver-Client-Secret","Xl615uK2WK");

            //xpp.setInput에 필요해서 설정함
            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"UTF-8");
            BufferedReader br = new BufferedReader(isr);

            XmlPullParserFactory xppf = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = xppf.newPullParser();
            xpp.setInput(is,"UTF-8");
            int what = xpp.getEventType();
            String t= null;
            boolean data =false;//앞에 쓸데없는거 제거
            while(what!=XmlPullParser.END_DOCUMENT){
                if(what==XmlPullParser.START_TAG){
                    t= xpp.getName();
                    if(t.equals("item")){
                        data = true;
                    }
                } else if (what==XmlPullParser.TEXT) {
                    if(data){
                        if(t.equals("title")){
                            System.out.println(StringCleaner.clean(xpp.getText()));
                        } else if (t.equals("description")) {
                            System.out.println(StringCleaner.clean(xpp.getText())+"\r\n");
                        }
                    }

                } else if (what==XmlPullParser.END_TAG) {
                }
                xpp.next();
                what = xpp.getEventType();
            }
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

JSON


JavaScript에서 파일을 보내고 받기위해 만든 형식

뷰어

JSONView

내용

{} : 객체

[ ] : 배열 →인덱스로 접근 가능

코드

package com.lsc.nw.main;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NWMain3 {
    public static void main(String[] args) {
        String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/json/CardSubwayStatsNew/1/548/20151101";

        try {
            URL u = new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"utf-8");

            //JSON , JSONViewer로 하나하나 객체인지 배열인지 확인하면서 작성해야함
            JSONParser jp = new JSONParser();
//            JSONArray ja = jp.parse(isr);//JSON 시작이 []배열로 되어있을때
            JSONObject jo = (JSONObject) jp.parse(isr); // Json 시작이 {}이렇게 되어있을때
            JSONObject cssn = (JSONObject) jo.get("CardSubwayStatsNew");//객체 안에 있는 "변수"를 찾아라
            JSONArray r = (JSONArray) cssn.get("row");//CardSubwayStatsNew 안에 row 배열을 찾아라
            for(int i =0; i<r.size();i++){
                JSONObject station = (JSONObject) r.get(i);
                System.out.println(station.get("LINE_NUM"));
                System.out.println(station.get("SUB_STA_NM"));
                System.out.println(station.get("RIDE_PASGR_NUM"));
                System.out.println(station.get("ALIGHT_PASGR_NUM"));
                System.out.println("-----------------------------------");
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

미세먼지

package com.lsc.nw.main;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NWMain4 {
    public static void main(String[] args) {
        String addr = "http://openapi.seoul.go.kr:8088/575a4655496b636839386f58586542/json/RealtimeCityAir/1/25/";
        try{
            URL u = new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"utf-8");

            JSONParser jp = new JSONParser();
            JSONObject jo = (JSONObject) jp.parse(isr);
            JSONObject cssn = (JSONObject) jo.get("RealtimeCityAir");
            JSONArray r = (JSONArray) cssn.get("row");

            for(int i =0; i<r.size(); i++){
                JSONObject statation = (JSONObject) r.get(i);
                System.out.println(statation.get("MSRDT"));
                System.out.println(statation.get("MSRRGN_NM")+""+statation.get("MSRSTE_NM"));
                System.out.println("미세먼지 : "+statation.get("PM10"));
                System.out.println("초미세먼지 : "+statation.get("PM25"));
                System.out.println("오늘 미세먼지 : "+statation.get("IDEX_NM"));
                System.out.println("--------------------------------------------");
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

날씨받기

package com.lsc.nw.main;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDate;
import java.util.Date;
import java.util.Scanner;

public class NWMain5 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String location = input.next();
        String addr="https://api.openweathermap.org/data/2.5/weather?q="+location+"&appid=baff8f3c6cbc28a4024e336599de28c4&units=metric&lang=kr";
        try{
            URL u = new URL(addr);
            HttpURLConnection huc = (HttpURLConnection) u.openConnection();
            InputStream is = huc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            JSONParser jp = new JSONParser();
            JSONObject jo = (JSONObject) jp.parse(isr);
            System.out.println("지역 : " + jo.get("name"));

            while(true) {
                JSONArray ja = (JSONArray) jo.get("weather");
                JSONObject weather = (JSONObject) ja.get(0);
                JSONObject temp = (JSONObject) jo.get("main");

                System.out.println(LocalDate.now());
                System.out.println(weather.get("description"));
                System.out.println("최대 기온 : " + temp.get("temp_max") + " C" + " 최저 기온 :" + temp.get("temp_min") + " C");

                Thread.sleep(5000);
            }

        }catch (Exception e){
           e.printStackTrace();
        }
    }
}