728x90
XML(eXtensible Markup Language)
- 확장된 마크업 언어
- 사용자가 필요에 의해서 태그(Element)를 생성할 수 있다. 태그는 계층구조로 형성된다.
- DTD만 맞추어 두면, HTML과는 달리 사용자가 태그를 직접 만들어서 사용할 수 있다.
- DTD없이 XML을 정의해도 되지만, 데이터의 신뢰성이 떨어진다. 참고하는 형식 기준(DTD)없이 사용자가 임의로 태그를 추가해서 사용할 수 있기 때문이다.
- 반드시 DTD에서 정의한 형식으로 XML을 작성해야 한다.
- 하나의 xml문서 전체에서 root element는 반드시 1개만 존재해야 한다. 두 개 이상이 존재하면 오류난다.
- xml을 파싱하는 parser가 xml 전체 문서를 document라고 부른다. 파싱하는 순서는 반드시 정의된 순서대로 파싱해야 한다.
- 용도
- 데이터를 표현(저장관리 또는 전달 )
- 환경설정 파일(server.xml, context.xml, web.xml)
xml의 태그를 검사하는 언어 -> DTD( Document Type Definition )
XML문서를 파싱하는 방법
- jdom.org사이트에 접속해서 jdom-2.6.0.1버전을 다운로드 받는다.
- jdom-2.6.0.1.jar파일을 현재 다이나믹 프로젝트 라이브러리에 추가한다.
- 위 라이브러리 안에 xml을 파싱해주는 SAXBuilder객체가 존재한다.
- 위의 파싱 객체를 사용해서 xml데이터를 읽어서 arraylist로 포장해준다.
[ person.xml ]
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
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML의 형식을 정의할 DTD를 지정 -->
<!DOCTYPE persons SYSTEM "person.dtd">
<!-- Root Element(요소) -->
<persons>
<person>
<!-- nickname : Attribute(속성) -->
<name nickname="원님">일길동</name>
<age>33</age>
<tel hometel="02-111-1111">010-111-1111</tel>
</person>
<person>
<!-- nickname : Attribute(속성) -->
<name nickname="투님">이길동</name>
<age>22</age>
<tel hometel="031-111-1111">010-222-2222</tel>
</person>
<person>
<!-- nickname : Attribute(속성) -->
<name nickname="삼님">삼길동</name>
<age>55</age>
<tel hometel="02-555-0555">010-555-5555</tel>
</person>
</persons>
|
cs |
[ person.dtd ]
1
2
3
4
5
6
7
8
9
|
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT persons (person*) > <!-- persons라는 루트태그 밑에 다양한 자식을 가질 수 있다. -->
<!ELEMENT person (name,age,tel) >
<!ELEMENT name (#PCDATA)> <!-- 정의한 순서와 달라도 에러발생 -->
<!ATTLIST name nickname CDATA #REQUIRED><!-- 필수 입력 조건, #IMPLIED : 선택 입력 조건 -->
<!ELEMENT age (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ATTLIST tel hometel CDATA #REQUIRED><!-- 필수 입력 조건 -->
|
cs |
[ PersonVo ]
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
|
package vo;
public class PersonVo {
String name;
String nickname;
int age;
String tel;
String hometel;
public PersonVo() {
super();
}
public PersonVo(String name, String nickname, int age, String tel, String hometel) {
super();
this.name = name;
this.nickname = nickname;
this.age = age;
this.tel = tel;
this.hometel = hometel;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getHometel() {
return hometel;
}
public void setHometel(String hometel) {
this.hometel = hometel;
}
}
|
cs |
[ PersonListAction ]
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
96
97
98
99
100
101
102
103
104
|
package action;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import vo.PersonVo;
/**
* Servlet implementation class PersonListAction
*/
@WebServlet("/person/list.do")
public class PersonListAction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
List<PersonVo> list = new ArrayList<PersonVo>();
//XML Parsing
try {
//Parser 생성
SAXBuilder builder = new SAXBuilder();
String path = request.getServletContext().getRealPath("/");
File f = new File(path, "person.xml");
//1. xml에 대한 전체 문서 정보를 구함
Document doc = builder.build(f); //path 경로에 있는 xml문서를 파일로 읽어들인다.
//2. Root Element 정보를 구한다.
Element root = doc.getRootElement();
//3. Root Element의 자식 정보를 구한다. parser도 자바 언어로 만든거라서 자식 요소들을 어레이리스트로 반환해준다.
//root element 아래에 있는(하위 요소중에) person element를 구해라.
List<Element> personList = root.getChildren("person");
for(Element person : personList) {
//name이라는 이름을 가지는 자식 element의 text를 파싱한다 -> 일길동
String name = person.getChildText("name");
//element의 속성 얻어오기 -> 원님
// 이름이 name인 요소 선택 선택된 요소의 속성값 추출
String nickname = person.getChild("name").getAttributeValue("nickname");
//값을 숫자로 바꿀건데 혹시라도 공백이 들어오거나 33a이런식의 문자을 파싱해서 숫자로 변환할 때
//에러가 발생할 수 있으므로 그에 대한 예외 처리
int age = 0;
try {
age = Integer.parseInt(person.getChildText("age"));
} catch (Exception e) {
// TODO: handle exception
}
String tel = person.getChildText("tel");
String hometel = person.getChild("tel").getAttributeValue("hometel");
PersonVo vo = new PersonVo(name, nickname, age, tel, hometel);
list.add(vo);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
//request binding
request.setAttribute("list", list);
//forward
String forward_page = "person_list.jsp";
RequestDispatcher disp = request.getRequestDispatcher(forward_page);
disp.forward(request, response);
}
}
|
cs |
[ person_list.jsp ]
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
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
<tr>
<th>이름</th>
<th>닉네임</th>
<th>나이</th>
<th>전화번호</th>
<th>집전화</th>
</tr>
<c:forEach var="vo" items="${list }">
<tr>
<td>${vo.name }</td>
<td>${vo.nickname }</td>
<td>${vo.age }</td>
<td>${vo.tel }</td>
<td>${vo.hometel }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
|
cs |
728x90
'BackEnd > WEB' 카테고리의 다른 글
ORM_DB프레임워크_국비_DAY72 (0) | 2022.06.14 |
---|---|
XML_Naver검색API_국비DAY71 (0) | 2022.06.13 |
PhotoGallery[완결]_국비_DAY69 (0) | 2022.06.09 |
세션 트래킹_국비_Day68 (0) | 2022.06.08 |
파일업로드_국비_DAY67 (0) | 2022.06.07 |