BackEnd/WEB

XML_국비_DAY70

Leo.K 2022. 6. 10. 15:39

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

 

'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