[Java] 기상청 날씨 정보 파싱 : 동네별>시간별 예보 XML (jdom 이용)

JAVA 2014. 11. 17. 10:33

출처 : http://javaking75.blog.me/220092064359



=> 기상청 RSS 안내 페이지 : 

=> 동네 예보 XML 서비스 요청 URL


=> 동네예보 XML 설명

※ XML 파싱은 jdom(http://www.jdom.org/)을 이용.

 [코드]

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package jdom.exam;

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class RssReadExam {

    //http://www.kma.go.kr/wid/queryDFS.jsp?gridx=59&gridy=125
    private String rssFeed = "http://www.kma.go.kr/wid/queryDFS.jsp?gridx=%s&gridy=%s"; //주소
        
    /**
     *  테스트를 위한 메인메소드
     */

    public static void main(String[] args) {
        
        RssReadExam r = new RssReadExam();
        r.getTownForecast("59","125");        
        
    }  
    
    
    /**
     *  해당 좌표의 날씨 정보를 반환.
     */

    public List<Map<String, String>> getTownForecast(String x, String y) {        
        
               
        List<Map<String, String>> result = new ArrayList<Map<String, String>>();
                
        try {
        
            SAXBuilder parser = new SAXBuilder();        
            parser.setIgnoringElementContentWhitespace(true);
            
            //URL url = new URL(rssFeed);
            //InputSource is = new InputSource(url.openStream());
            //Document doc = parser.build(is);
            
            String url = String.format(rssFeed, x, y);
            Document doc = parser.build(url);
            Element root = doc.getRootElement();
            
            Element channel = root.getChild("body");
            List<Element> list = channel.getChildren("data");
           
            
           
            for (int i=0; i<list.size(); i++) {
              
                Element el = (Element)list.get(i);
                
                Map<String, String> data = new LinkedHashMap<String, String>();
                
                data.put("seq", el.getAttributeValue("seq"));   //48시간중 몇번째 인지 가르킴
                data.put("hour",el.getChildTextTrim("hour") );     //동네예보 3시간 단위 
                data.put("day",el.getChildTextTrim("day") );     //1번째날 (0: 오늘/1: 내일/2: 모레)
                data.put("temp",el.getChildTextTrim("temp") );    //현재 시간온도
                data.put("tmx",el.getChildTextTrim("tmx") );    //최고 온도 
                data.put("tmn",el.getChildTextTrim("tmn") );    //최저 온도
                data.put("sky",el.getChildTextTrim("sky") );    //하늘 상태코드 (1: 맑음, 2: 구름조금, 3:구름많음, 4:흐림)
                data.put("pty",el.getChildTextTrim("pty") );    //강수 상태코드 (0: 없음, 1: 비, 2: 비/눈, 3: 눈/비, 4: 눈)
                data.put("wfkor",el.getChildTextTrim("wfKor") ); //날씨 한국어
                data.put("wfEn",el.getChildTextTrim("wfEn") );      //날씨 영어
                data.put("pop",el.getChildTextTrim("pop") );     //강수 확률%
                data.put("r12",el.getChildTextTrim("r12") );     //12시간 예상 강수량
                data.put("s12",el.getChildTextTrim("s12") );     //12시간 예상 적설량
                data.put("ws",el.getChildTextTrim("ws") );         //풍속(m/s)
                data.put("wd",el.getChildTextTrim("wd") );         //풍향 (0~7:북, 북동, 동, 남동, 남, 남서, 서, 북서)
                data.put("wdKor",el.getChildTextTrim("wdKor") ); //풍향 한국어
                data.put("wdEn",el.getChildTextTrim("wdEn") );     //풍향 영어
                data.put("reh",el.getChildTextTrim("reh") );     //습도 %
                data.put("r06",el.getChildTextTrim("r06") );     //6시간 예상 강수량
                data.put("s06",el.getChildTextTrim("s06") );     //6시간 예상 적설량
                
                System.out.println(data);
                result.add(data);
            }

        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return result;
    }    
}

 

 

 

 

방식2 v140816

  

 [코드]

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package jdom.exam;

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class RssReadExam2 {

    //http://www.kma.go.kr/wid/queryDFS.jsp?gridx=59&gridy=125
    private String rssFeed = "http://www.kma.go.kr/wid/queryDFS.jsp?gridx=%s&gridy=%s"; //주소
        
    /**
     *  테스트를 위한 메인메소드
     */

    public static void main(String[] args) {
        
        RssReadExam2 r = new RssReadExam2();
        r.getTownForecast("59","125");        
        
    }  
    
    
    /**
     *  해당 좌표의 날씨 정보를 반환.
     */

    public List<Map<String, String>> getTownForecast(String x, String y) {        
        
               
        List<Map<String, String>> result = new ArrayList<Map<String, String>>();
                
        try {        
            SAXBuilder parser = new SAXBuilder();        
            parser.setIgnoringElementContentWhitespace(true);
            
            //URL url = new URL(rssFeed);
            //InputSource is = new InputSource(url.openStream());
            //Document doc = parser.build(is);
            
            String url = String.format(rssFeed, x, y);
            Document doc = parser.build(url);
            Element root = doc.getRootElement();            
            Element channel = root.getChild("body");
            List<Element> list = channel.getChildren("data");
           
            for (int i=0; i<list.size(); i++) {
              
                Element el = (Element)list.get(i);
            
                String seq = el.getAttributeValue("seq");
                if(seq.equals("8")) break; //24시간 데이터만 추출
                
                Map<String, String> data = new LinkedHashMap<String, String>();
                
                data.put("x",x);
                data.put("y", y);
                data.put("seq",seq);
                
                //data요소의 자식요소들을 하나씩 꺼내서 저장 : (요소이름, 요소의 테스트노드)
                for(Element dataChild : el.getChildren()){ 
                    //<hour>3</hour>
                    //data.put("hour","3");
                    data.put(dataChild.getName(), dataChild.getTextTrim());
                }  
                System.out.println(data); //콘솔에 출력.
                result.add(data);
            }

        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return result;
    }    
}

 

 

 

'JAVA' 카테고리의 다른 글

이클립스 콘솔 버퍼 사이즈 제한 풀기  (0) 2015.11.25
자바 실행파일 만드는법  (0) 2015.01.06
- Eclipse 자주 쓰는 단축키 -  (0) 2014.07.13
for each문  (0) 2014.06.23
ConcurrentModificationException 설명  (0) 2014.06.23