본문 바로가기

Ajax & jQuery

Ajax(5) - Document Object Model (DOM), DOM API를 이용한 XML 파싱 (pdf파일로부터 내용 더 보완하기)

1. DOM API를 이용해서 HTML 화면변경을 하는 예제 - changeHTMLUsingDOM.jsp
2. DOM API를 이용해서 XML 파싱 

 

DOM과 XML

DOM, 즉 Document Object Model은 문서를 객체로 표현하기 위한 표준으로서 HTML 이나 XML등의 문서를 객체로 표현할 때 사용되는 API이다. 자바스크립트 ,자바,C,C# 등다양한 언어에서 DOM API를 제공하고있다.

DOM은 문서를 트리구조로 표현하기 때문에 쉽게 이해할수있다. XMLHttpRequest 객체는 응답텍스트대신 XML 응답결과를 사용할수있는데,이 때 DOM API를 사용해서 서버가 생성한 XML로부터 데이터를 추출할 수 있다.  

 

DOM API의 주요 인터페이스 

DOM API에서 모든 건 Node로 표현된다.

Document: 전체 문서

Element: 각 태그. <books>나 <book>과 같이 태그에 해당하는 노드가 Element로 매핑됨

Text: 문자열 데이터가 Text노드로 표현된다. <author>이승재</author>의 경우 '이승재' 문자열은 text노드에 저장된다

CDataSection: XML문서의 CDATA 영역의 문자열 값을 저장한다. 이 영역에 해당하는 내용은 모두 텍스트로 인식된다. [!CDATA]
 

<XML문서와 DOM 트리구조>

 

<HTML문서와 DOM 트리구조>

1. DOM API를 이용해서 HTML 화면변경을 하는 예제

changeHTMLUsingDOM.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTML을 변경시키기</title>

<script type="text/javascript">

	var count = 0;
	
	function addItem() {
		
		count++;
		
		//E: Element
		var newItemE = document.createElement("div");
		newItemE.setAttribute("id","item_" + count);
		// id라는 속성에 item_1 , item_2 ...
		// <div id="item_1"></div>
		
		var html = "새로 추가된 아이템[" + count + "]&nbsp;";
		html += "<input type=\"button\" value=\"삭제\"" + 
			"onclick=\"removeItem('item_" + count + "');\"/>"; //input box 만들기
		
		// <div id="item_0">
		// 새로 추가된 아이템[0] <input type="button" value="삭제" onclick="removeItem('item_0')"/> 
		// </div>
		
		newItemE.innerHTML = html;
		
		var itemListDiv = document.getElementById("itemList");
		itemListDiv.appendChild(newItemE);
		
	}
	
	function removeItem(itemId) {
		var removeItem = document.getElementById(itemId);
		removeItem.parentNode.removeChild(removeItem);
	}
	
</script>

</head>
<body>

<h1>HTML DOM을 이용한 화면 변경</h1>
<hr/>

<input type="button" value="추가" onclick="addItem();"/>
<div id="itemList"></div>

</body>
</html>

2. DOM API를 이용하여 XML 파일 파싱하기

books.xml
<?xml version="1.0" encoding="UTF-8"?>

<books>

	<book>
		<title>겨울왕국</title>
		<author>디즈니</author>
	</book>
	
	<book>
		<title>이솝우화</title>
		<author>미드</author>
	</book>
	
	<book>
		<title>힐러리의삶</title>
		<author>클린턴</author>
	</book>
	
	<book>
		<title>수지의 어린시절</title>
		<author>EBS</author>
	</book>

</books>

 

getBookXML.xml
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setCharacterEncoding("UTF-8"); 
	String cp = request.getContextPath(); 
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/httpRequest.js"></script>
<script type="text/javascript">

	//메인
	function getBookList() {
		
		// 현재 위치의 books.xml을 읽어와라
		sendRequest("books.xml",
				null,displayBookList,"GET");
		
		
	}
	
	//콜백함수
	function displayBookList() {
		
		// 이 예제에서 서버가 작동하는건 아님. (걍 써줬음)
		if(httpRequest.readyState==4) {
			if(httpRequest.status==200) {
				
				// books.xml 을 출력하는 작업 (파싱)
				// 전달받은 XML을 DOM객체에 넣음
				var Document = httpRequest.responseXML;
				
				// DOM객체에서 Element 추출
				var booksE = Document.documentElement;
				
				// book 의 갯수 추출
				var bookNL = booksE.getElementsByTagName("book");
				//alert(bookNL.length + "개");  4개 나와야함
				

	//전체 데이터를 읽고 HTML로 출력
				var html = "";

				html += "<ol>";

				for (var i = 0; i < bookNL.length; i++) {
					
					//한개의 book 읽음
					var bookE = bookNL.item(i);
					
					// title 값 읽어오기 - title 안에도 여러개 만들 수 있음 지금은 하나이기 때문에
					// title.item(0)으로 가져온 것, 여러개면 item(1),item(2)...
					var titleStr = bookE.getElementsByTagName("title").item(0).firstChild.nodeValue;
					
					// author 값 읽어오기
					var authorStr = bookE.getElementsByTagName("author").item(0).firstChild.nodeValue;
					
					// 읽어낸 값을 가지고 html 완성하기

					html += "<li>" + titleStr + "&nbsp;&nbsp;&nbsp;" + authorStr + "</li>";
					
				}
				
				html += "</ol>";
				
				document.getElementById("bookDiv").innerHTML = html;
				// 원래 변수 하나 선언해서 집어넣던거 이렇게 줄인거임

			}

		}
	}

	window.onload = function() {
		getBookList();
	}
</script>


</head>
<body>


<h1 id="list">Book List</h1>
<hr/>
<div id="bookDiv"></div>


</body>
</html>