[Javascript] DOM(Document Object Model) , XML 데이터 가져오기
by 무작정 개발2022.03.17(58일 차_목요일)
DOM(Document Object Model)
- DOM이란 Document Object Model의 줄임말이다.
- HTML이나 XML 등의 문서를 객체로 표현할 때 사용되는 API이다.
- DOM은 트리(Tree) 구조로 표현하기 때문에 쉽게 이해할 수 있다.
- JS, Java, C, C# 등 다양한 언어에서 DOM API를 제공한다.
- XMLHttpRequest 객체는 응답 텍스트 대신 XML 응답 결과를 사용할 수 있다.
- 이때, DOM API를 사용해서 Server가 생성한 XML로부터 데이터를 추출 가능
XML 문서와 DOM 트리 구조


브라우저는 HTML의 모든 요소를 객체화하고 이 객체를 계층 구조로 묶어, 어떤 요소가 다른 요소 내부에
포함되어 있을 때, 이 요소는 자신을 포함한 요소의 자손 요소로써 구조화한다.
위의 트리(Tree) 구조를 보면 author 요소는 title 요소와 형제 관계를 맺고, 이 둘은 book 요소의 자식이다.
이렇게 객체화된 요소는 여러 속성을 가질 수 있고, HTML 요소 속성을 그대로 사용하기도 한다.
즉, 객체 속성 이름으로 속성에 접근하여 상호 작용을 통해 속성을 바꿀 수 있다.
주요 DOM API
- DOM API에서 모든 건 Node(노드)로 표현되며 문서의 각 구성 요소들은 모두 Node 또는 하위
인터페이스로 매핑된다.
- 브라우저에 출력된 웹페이지는 모두 DOM객체로 구성되어있고 객체화시키는 작업을 해서 DOM객체로 바꾼다.
- Document : 전체 문서를 나타낸다.
- Element : 각 태그를 나타낸다. / <books> 혹은 <book>와 같이 태그에 해당하는 Node(노드)가 Element로 매핑된다.
- Text : 문자열 데이터가 Text 노드로 표현된다. / <aithor> 수지 </author>의 경우 '수지'문자열은 Text노드에 저장
XML 문서를 처리하기 위한 DOM 요소의 속성
프로퍼티 이름 | 설명 |
childNodes | 현재 요소의 자식을 배열로 표현 |
firstChild | 현재 요소의 1번째 자식 |
lastChild | 현재 요소의 마지막 자식 |
nextSibling | 현재 요소와 바로 다음 요소를 의미 |
nodeValue | 해당 요소의 값을 읽고 쓸 수있는 속성을 정의 (=data) |
parentNode | 해당 요소의 부모 노드 |
previousSibling | 현재 요소와 바로 이전의 요소를 의미 |
XML 문서를 다루는 유용한 DOM 요소의 메서드(Method)
getElementById(id) | document에서 특정한 id 속성값을 가지고 있는 요소를 반환 |
getElementsByTagName(name) | 특정한 태그 이름을 가지고 있는 자식 요소로 구성된 배열을 리턴 |
.hasChildNodes() | 해당 요소가 자식 요소를 포함하고 있는지를 나타내는 Boolean값 리턴 |
getAttribute(name) | 특정한 name에 해당하는 요소의 속성 값을 리턴 |
XML 파일을 읽어서 웹페이지에 출력
- XMLHttpRequest 객체는 Server로부터 XML 문서를 응답으로 읽어올 수 있고, 서버에서 읽어온 XML 문서는 DOM으로 변환되어 저장된다.
- DOM API를 이용하면 Server가 생성한 XML 문서로부터 원하는 정보를 읽어올 수 있다.
실행 화면

books.xml 파일 생성

DOM의 트리(Tree)에서 Document는 문서 전체를 의미하고,
<books>는 document 하위 루트 노드(node)이다.
firstChild : book 노드를 기준으로 보면 1번째에 위치한 title이다.
lastChild : book 노드를 기준으로 보면 마지막에 위치한 author이다.
getBooksXML.jsp - (출력 페이지)
html<%@ 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="<%=cp%>/data/js/httpRequest.js"></script> <script type="text/javascript"> function getBookList() { sendRequest("books.xml",null,displayBookList,"GET"); } //콜백함수 function displayBookList() { if(httpRequest.readyState==4){ if(httpRequest.status==200){ //전달받은 xml을 dom 객체에 넣음 var Document = httpRequest.responseXML; //dom 객체에서 element 추출 var booksE = Document.documentElement; //book의 갯수 호출 var bookNL = booksE.getElementsByTagName("book"); //전체데이터 읽고, HTML로 출력 var html = ""; html += "<ol>"; for(var i=0;i<bookNL.length;i++){ var bookE = bookNL.item(i); var titleStr = bookE.getElementsByTagName("title") .item(0).firstChild.nodeValue; var authorStr = bookE.getElementsByTagName("author") .item(0).firstChild.nodeValue;//title에는 Text데이터 1개만 들어있다. html += "<li>" + titleStr +" " + 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" style="display: block; margin: 0 auto;"></div> </body> </html>
https://github.com/chaehyuenwoo/jQuery-Ajax/tree/main/ajax4
GitHub - chaehyuenwoo/jQuery-Ajax: jQuery와 Ajax관련 소스
jQuery와 Ajax관련 소스. Contribute to chaehyuenwoo/jQuery-Ajax development by creating an account on GitHub.
github.com
이번 소스코드와 더 많은 예제는 위는 Github 참고
블로그의 정보
무작정 개발
무작정 개발