-
[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