반응형
공공데이터 다운로드
XmlVo
더보기
package xml;
public class BookVo {
private int num;
private String title;
private String author;
private int price;
public BookVo() {
}
public BookVo(int num, String title, String author, int price) {
super();
this.num = num;
this.title = title;
this.author = author;
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "BookVo [num=" + num + ", title=" + title + ", author=" + author + ", price=" + price + "]";
}
}
XmlHandler
- DocumentBuilder 객체를 주는 factory 객체를 생성한다
- DocumnetBuilder 객체를 생성한다.
- DocumentBuilderFactory는 XML 파서를 생성하는 인터페이스이고, DocumentBuilder는 XML 파서를 생성한 후, 실제로 XML 문서를 파싱하고, DOM 객체를 생성하는 클래스이다.
- xml 을 파싱한다. (builder.parse)
- root 요소를 뽑는다. (제일 바깥에 있는 태그. 내가 사용한 파일의 경우에는 <books>태그이다.
- 자식 노드를 추출한다. (<book> 태그 4개, 자식이 한두개가 아니니 list 형태로 반환한다.)
- 배열을 생성한다.
- <book>의 자식노드들을 추출한다. item(i)는 nodelist에서 i번째 노드를 추출한다. <book> 태그 한세트이다. (자식하나)
- infos에는 bookid, title, author, price이 들어간다.
- if(infos.getLength()==0)은 공란을 읽지 않기 위해 추가한 if 문이다.
package handler;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import xml.BookVo;
public class XmlHandler implements Handler {
@Override
public String process(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
String path = request.getServletContext().getRealPath("WEB-INF/files/data.xml");
try {
FileInputStream fi = new FileInputStream(path);
//DocumentBuilder 객체를 주는 factory 객체 생성
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//DocumentBuilder 객체 생성
DocumentBuilder builder = factory.newDocumentBuilder();
//xml 파싱
Document doc = builder.parse(fi);
// 1. root 요소를 뽑는다.(제일 바깥에 있는 <books> 태그 )
Element root = doc.getDocumentElement();
// 2. 자식 노드 추출 (<book> 태그 4개, 자식이 한두개가 아니니까 list형태로 반환)
NodeList list = root.getChildNodes();
ArrayList<BookVo> datas = new ArrayList<>();
for(int i=0;i<list.getLength();i++) {
Node child = list.item(i); //item(i) : nodelist에서 i번째 노드 추출. <book> 태그 한세트
//<book>의 자식노드들 추출
NodeList infos = child.getChildNodes(); //bookid, title,author, price -> infos 에 들어감.
if(infos.getLength()==0) { //공란 읽지 않기 위해 추가한 if문
continue;
}
BookVo vo = new BookVo();
for(int j=0;j<infos.getLength();j++) {
Node info = infos.item(j);
String tagName = info.getNodeName(); //getnodename():태그명 추출
switch(tagName) {
case "bookid":
vo.setNum(Integer.parseInt(info.getTextContent()));
break;
case "title":
vo.setTitle(info.getTextContent());
break;
case "author":
vo.setAuthor(info.getTextContent());
break;
case "price":
vo.setPrice(Integer.parseInt(info.getTextContent()));
break;
}
// String val = info.getTextContent(); //gettextcontent():태그값 추출
System.out.println(vo);
}
datas.add(vo);
request.setAttribute("datas", datas);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/xml/list.jsp";
}
}
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>
</head>
<body>
<h3>xml 데이터 로드</h3>
<table border = "1">
<tr><th>북아이디</th><th>제목</th><th>저자</th><th>가격</th></tr>
<c:forEach var="vo" items="${datas }">
<tr><td>${vo.num }</td><td>${vo.title }</td><td>${vo.author }</td><td>${vo.price }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
반응형