ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [XML] XML 파싱..
    JAVA 2015. 10. 29. 17:02

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

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

    하라면 해야지..

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

    Data XML

    <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

    /** 전달받은 주소 정보로 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로 인코딩을 해서 리스트에 담는다. (한글로 되어있을 경우 대비)

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

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

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

    리턴값

     map = {
       code=200, 
       msg="성공메시지", 
       list=[010-0000-0000, 010-9999-9999]
     }

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

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

    'JAVA' 카테고리의 다른 글

    REST API 호출  (0) 2015.12.02
    경로 구하기  (0) 2015.11.30
    [Exception] printStackTrace String값으로 읽기  (0) 2015.11.17
    [LOG] Logger 2개 사용하기  (0) 2015.11.17
    [LOG] Log4j 로그파일 분리  (1) 2015.11.13

    댓글

Designed by Tistory.