«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을 이용한 리스트 중복제거도 눈여겨 보는게 좋다. (은근히 유용하게 쓰이는곳이 많음)