xml

xml - 파싱

우가본 2024. 7. 8. 11:23

)PersonVo 생성

 

)PersonListAction 생성 (person.xml의 데이터를 파싱할 액션) - 전부 jdom 패키지의 클래스를 사용해야 함.

package action;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import xml.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 {
		
		List<PersonVo> p_list = new ArrayList<PersonVo>();
		
		// XML Parser : SAXBulider
		SAXBuilder builder = new SAXBuilder();
		
		// web경로 -> 절대경로
		String absPath = request.getServletContext().getRealPath("/");
		File f		   = new File(absPath, "person.xml");
		
		try {
			// XML의 문서정보 읽어오기
			Document doc   = builder.build(f);
			// XML내의 RootElement얻어오기
			Element root = doc.getRootElement();
			
			// root element밑의 자식 Element(person)
			List<Element> person_list = root.getChildren("person");
			
			// 데이터를 파싱하기 위한 개선루프
			for(Element person : person_list) {
				// person.xml에서 person element 하위에 name을 갖는 텍스트를 얻어오라는 뜻
				String name 	= person.getChildText("name");
				// 속성명에 대한 정보를 얻어올 때는 하위 태그에서 속성값을 불러오는 메서드를 활용해야 함
				String nickname = person.getChild("name").getAttributeValue("nickname");
				// 정수값은 변환(값이 안들어오더라도 넘어가기 위해 미리 0으로 초기화 해두기)	
				int age			= 0;
				try {
					age 		= Integer.parseInt(person.getChildText("age"));
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				String tel		= person.getChildText("tel");
				String homeTel	= person.getChild("tel").getAttributeValue("hometel");				
				
				// 파싱된 데이터를 vo로 포장해서 list에 넣기
				PersonVo vo = new PersonVo(name, nickname, age, tel, homeTel);
				p_list.add(vo);				
			} // end:for		
		}  catch (Exception e) {
			e.printStackTrace();
		}
		
		// request binding
		request.setAttribute("p_list", p_list);
		
		// Dispatcher형식으로 호출
		String forward_page = "person_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

)person_list.jsp

<%@ 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>

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">
	#box{
		width: 800px;
		margin: auto;
		margin-top: 50px;
	}
</style>

</head>
<body>
	<div id="box">
		<table class="table">
			<tr class="success">
				<th>순번</th>
				<th>이름</th>
				<th>별명</th>
				<th>나이</th>
				<th>휴대전화</th>
				<th>집전화</th>
			</tr>
			<!-- for(PersonVo vo : p_list -->
			<c:forEach var="vo" items="${ p_list }" varStatus="i">
				<tr>
					<td>${ i.count }</td>
					<td>${ vo.name }</td>
					<td>${ vo.nickName }</td>
					<td>${ vo.age }</td>
					<td>${ vo.tel }</td>
					<td>${ vo.homeTel }</td>
				</tr>
			</c:forEach>
		</table>
	</div>
</body>
</html>

 

완성