Posts XML 파싱
Post
Cancel

XML 파싱

«Tistory 블로그에서 작성했던 글»

새로운 회사에 와서 처음으로 받은 작업..

XML파일을 파싱해서 DB에 저장해달라는 것이었다.

하라면 해야지..

일단 XML의 예제 구조부터 보자.

Data XML


1
2
3
4
5
6
7
8
9
10
11
12
<developmentteam> 
    <solutionteam> 
        <name>홍길동</name> 
        <tel>010-0000-0000</tel> 
        <age>29</age> 
    </solutionteam>
    <solutionteam> 
        <name>이몽룡</name> 
        <tel>010-9999-9999</tel>
        <age>31</age>
    </solutionteam>
</developmentteam>

이런식으로 되어있는 XML 구조에서 tel항목의 전화번호만 빼오고 싶다하자..

그럼 먼저 필요한 파라미터를 정리해야한다.

  • XML파일을 가져올 URL주소
  • XML내에서 추출할 TAG명

두개의 파라미터를 받는 메소드를 작성한다.

JAVA Method


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
/** 전달받은 주소 정보로 XML 데이터 가져오기 
 * @param url URL주소 
 * @param targer추출할 tag명 
 * @return map (code/msg/list) 
 */ 
public Map<String, Object> xmlToStringParse(String urlString, String target) { 
    Map<String, Object> map = new HashMap<String, Object>();// Return Map 
    List<Object> list = new ArrayList<Object>(); // tag List 

    String code = ""; 
    String msg = ""; 

    // 기본 return Map 세팅 
    map.put("code", code); 
    map.put("msg", msg); 
    map.put("list", list); 

    // URL 체크 
    if (urlString == null || urlString.trim().length() == 0) { 
        code = "404"; 
        msg = "URL Check"; 
    } 

    // Target 체크 
    if (target == null || target.trim().length() == 0) { 
        code = "404"; 
        msg = "Target Check"; 
    } 

    // URL과 Target 둘 다 이상이 없을 경우 진행 
    if (code.trim().length() == 0) { 
        System.out.println("############ XML Parsing Start ###############"); 

        try { 
            // URL Setting 
            URL url = new URL(urlString); 
            // Connection open 
            HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

            // 언어설정. 한글이 포함되어 있다면 이 설정을 넣어야 한다. 
            conn.setRequestProperty("accept-language", "ko"); 

            System.out.println("### ResponseCode : "+conn.getResponseCode()); 

            // Success 
            if (conn.getResponseCode() == 200) { 
                // XML 데이터 읽어오기 
                SAXBuilder builder = new SAXBuilder(); 
                Document doc = builder.build(conn.getInputStream()); 

                // 1. XML의 루트 요소를 찾는다. 
                Element element = doc.getRootElement(); 

                // 2. 루트요소에서의 자식 요소 리스트를 가져온다. 
                List<Element> elementList = element.getChildren(); 

                // 3. 요소리스트에서 각 요소들을 추출해서 내가 필요한 정보를 가져와 리스트에 담는다. 
                for (Element e : elementList) { 
                    Object val = URLDecoder.decode(e.getChildTextTrim(target), "UTF-8"); 
                    list.add(val); 
                } 
            } 

            // 작업이 완료되면 Connection 연결을 끊어준다. 
            code = String.valueOf((int) conn.getResponseCode()); 
            msg = conn.getResponseMessage(); 

            conn.disconnect(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
            code = "400"; 
            msg = e.getMessage(); 
        } 

        System.out.println("############ XML Parsing End ###############"); 
    } 
    // 추출한 데이터중에 중복되는 데이터가 없도록 중복 제거를 해준다. 
    if (list.size() > 0) { 
        list = new ArrayList<Object>(new HashSet<Object>(list)); 
    } 

    map.put("code", code); 
    map.put("msg", msg); 
    map.put("list", list); 

    return map; 
}

1.번에서 루트요소(developmentteam)을 찾아오고

2.번에서 그 자식요소들(solutionteam)들을 리스트로 가져온다.

그리고 3.번에서 내가 파라미터로 보냈던 tel정보를 가지고 UTF-8로 인코딩을 해서 리스트에 담는다. (한글로 되어있을 경우 대비)

이제 위의 메소드를 호출 해보자.

1
 xmlToStringParse("https://chaedae.tistory.com", "tel");

메소드 호출 후 맵안에 담긴 값은 아래와 같다.

리턴값


1
2
3
4
5
 map = {
   code: 200, 
   msg: "성공메시지", 
   list: [010-0000-0000, 010-9999-9999]
 }

작업이 끝나면 꼭 connection 연결을 끊어주는것을 잊지 말고..

HashSet을 이용한 리스트 중복제거도 눈여겨 보는게 좋다. (은근히 유용하게 쓰이는곳이 많음)

This post is licensed under CC BY 4.0 by the author.

-

Log4j 로그파일 분리

Comments powered by Disqus.