XML DOM (Document Object Model) 박창섭 동덕여대 컴퓨터학과 2016. 10. 7
Content XML 문서 처리 DOM 개요 DOM Tree DOM Core Interfaces DOM 사용 예 Node Document Element Attr DOM 사용 예
XML 문서 처리 XML 문서 처리 과정 XML Parser
XML 문서 처리 XML Parser XML 문서에 대한 parsing 수행 XML 문서를 읽고 해석하여 구성요소 즉, element name, content, attribute name, attribute value 등을 식별 그것들 간의 문법적인 관계를 해석 응용 프로그램이 이용할 수 있도록 메모리 상의 구조 생성 XML 응용 프로그램은 XML Parser의 parsing 결과를 이용 XML Parser 예 Xerces(Apache), MSXML(Microsoft), XML4J(IBM) IE와 같은 웹 브라우저에도 XML Parser가 내장되어 있음
XML 문서 처리 XML Parsing 방식 DOM(Document Object Model) 생성된 트리를 이용하여 데이터 검색, 추가, 수정, 삭제 가능 XML 문서의 크기가 크거나 많은 XML 문서들을 동시에 처리하는 경우 메모리 공간을 많이 사용 SAX(Simple API for XML) XML 문서를 해석하는 과정에서 다양한 이벤트(event)를 발생시킴 이벤트는 응용 프로그램에서 구현한 이벤트 처리기(handler)에 의해 처리됨
DOM(Document Object Model) 개요 What is the DOM? XML이나 HTML 문서를 접근하고 조작하기 위한 표준 방법을 정의 "W3C 문서 객체 모델(DOM; Document Object Model)은 프로그램과 스크립트가 동적으로 문서의 내용, 구조, 형식에 접근하고 수정할 수 있게 해 주는 플랫폼 중립적이고 언어 중립적인 인터페이스 (The W3C Document Object Model (DOM) is a platform and language-neutral interface that allows programs and scripts to dynamically access and update the content, structure, and style of a document.)" -- W3C DOM 문서의 구성요소(element)들에 대한 객체(object)와 속성(property)을 정의하고, 그것들을 접근하는 수단(interface)을 정의함 문서의 구성요소들을 접근하고 조작하기 위해 사용할 수 있는 표준적인 응용 프로그래밍 인터페이스(API) 정의
DOM 개요 DOM(Document Object Model) 표준의 종류 Core DOM: 임의의 문서에 대한 표준 모델을 정의 HTML DOM: HTML 문서에 대한 트리 구조와 인터페이스 정의 XML DOM: XML 문서에 대한 트리 구조와 인터페이스 정의 XML 문서를 하나의 트리로 표현 DOM 기반 parser에 의해 트리 구조가 생성됨 인터페이스를 이용하여 트리(문서)에 속한 엘리먼트와 속성, 텍스트들을 검색, 생성, 수정, 삭제 가능
DOM 개요
DOM 개요 DOM을 이용한 XML 문서의 처리 과정 ① ② ④ ③ ① XML 문서를 읽어들임 ③ DOM API를 사용해서 XML 문서의 구성요소들을 접근 및 변경 ④ 변경된 문서 구조를 새로운 XML 파일로 저장
DOM 개요 예 1: XML 문서에서 첫 번째 <title> element의 값을 찾아 출력
DOM 개요 예 2: HTML 문서에서 id가 "demo"인 element의 값을 변경
DOM Tree
DOM Tree DOM 트리는 Node 타입의 객체들로 구성됨 XML 문서와 그것에 포함된 모든 요소들에 대해 노드 객체 생성 노드의 종류 (하위 타입) 문서 노드(Document node): 전체 XML 문서를 나타냄 엘리먼트 노드(Element node): XML 엘리먼트를 나타냄 텍스트 노드(Text node): XML 엘리먼트 내의 텍스트를 나타냄. 속성 노드(Attribute node): XML 엘리먼트 내의 속성을 나타냄. 주석 노드(Comment node): XML 문서 내의 주석을 나타냄.
DOM Tree 노드들 간의 관계 부모-자식 관계, 형제 관계 최상위 노드를 루트(root)라 함 루트를 제외한 모든 노드는 하나의 부모(parent) 노드를 가짐 노드는 하나 이상의 자식(child) 노드들을 가질 수 있음 모든 자식노드 집합, 첫번째 자식 노드, 마지막 자식 노드를 조회 가능 같은 부모 노드를 갖는 노드들을 형제(sibling) 노드라 함 다음 형제, 이전 형제 노드를 접근 가능
DOM Core Interfaces DOM 트리에 포함된 노드들을 접근하기 위한 인터페이스 집합을 정의 인터페이스 종류 최상위 인터페이스: Node Node의 하위 인터페이스: Element, Document, Attribute, Text 등 인터페이스 종류 기본 인터페이스 (Fundamental interfaces) Node, Element, Attribute, Document, DocumentFragment, Text, Comment 확장 인터페이스 (Extended interfaces) DocumentType, Notation, Entity, EntityReference, ProcessigInstruction, CDATASection
DOM Core Interfaces DOM Interfaces 구성도
DOM Core Interfaces 기본 인터페이스(Fundamental Interfaces) 종류 용도 Node 모든 인터페이스의 부모 인터페이스로, 다른 인터페이스가 공통적으로 갖는 method들이 정의되어 있음 Document DOM 트리의 최상위 노드의 타입으로, XML 문서 자체에 해당됨. 동적으로 다른 노드를 생성하는 method들을 포함 Element XML 문서 내의 엘리먼트에 해당되는 인터페이스 Attr XML 문서 내의 속성에 해당되는 인터페이스 CharacterData XML 문서 내의 문자 데이터에 해당되는 인터페이스 Text XML 엘리먼트의 텍스트 콘텐트에 해당되는 인터페이스 NodeList 노드들의 집합을 유지하고 관리할 수 있도록 설계된 인터페이스 DOMImplementation Document 객체를 생성하는 method가 정의되어 있는 인터페이스 DocumentFragment DOM 트리에서 서브 트리를 분리할 때 사용되는 인터페이스
DOM Core Interfaces 확장 인터페이스(Extended Interfaces) 종류 용도 CDATASection XML 문서에서 CDATA 섹션에 해당되는 인터페이스 DocumentType XML 문서에서 DTD 선언에 해당하는 인터페이스 Notation DTD에서 Notation 선언에 해당하는 인터페이스 Entity DTD에서 Entity 선언에 해당하는 인터페이스 EntityReference XML 문서 또는 DTD에서 Entity 참조에 해당하는 인터페이스 ProcessingInstruction XML 문서에서 프로세싱 지시자에 해당하는 인터페이스
Node Interface Node 인터페이스 기능 노드에 대한 정보를 얻음 DOM 트리에 노드를 추가, 삭제, 변경 가능 DOM 트리의 노드들을 순회(traversal) 할 수 있음
Node Interface 속성(property) 속성 이름 속성 타입 설명 nodeName String 노드 이름 nodeValue Text 노드 값 nodeType Number 노드 타입. 0부터 시작하는 정수로 표현 parentNode Node 노드의 부모 노드 childNodes NodeList 노드의 자식 노드 fisrtChild 첫 번째 자식 노드 lastChild 마지막 자식 노드 previousSibling 노드의 형제 노드 중 바로 앞 노드 nextSibling 노드의 형제 노드 중 바로 다음 노드 attributes NameNodeMap 노드 속성 ownerDocument Document 노드를 포함하는 문서 namespaceURI 노드의 namespace URI prefix 노드의 namespace prefix
Node Interface 하위 인터페이스(노드)에서의 nodeName, nodeValue, attributes의 값 속성의 이름 속성의 값 null CDATASection #cdata-section CDATA Section의 내용 Comment #comment 주석 내용 Document #document DocumentFragment #document-fragment DocumentType 문서 타입 이름 Element 태그 이름 NamedNodeMap Entity 개체 이름 EntityReferencce 개체 참조 이름 Notation notation이름 ProcessingInstruction target target을 제외한 내용 Text #text 텍스트 노드의 내용
Node Interface 메소드(methods) 노드에 관한 정보를 조회 method 기능 String getNodeName() 노드 이름을 반환 String getNodeValue() 노드 값을 반환 void setNodeValue(String nodeValue) 노드 값을 설정 short getNodeType() 노드 타입을 반환 NamedNodeMap getAttributes() 속성을 반환 String getTextContent() 노드와 그 자손들의 text content를 반환 Document getOwnerDocument() 현재 노드가 속한 문서를 반환
Node Interface 문서(DOM tree) 조작: 새로운 노드를 추가하거나 삭제, 복사함 method 기능 Node insertBefore(Node newChild, Node refChild) refChild 노드 앞에 newChild 노드를 삽입 refChild 노드가 null이면 newChild 노드는 맨 마지막 자식 노드로 삽입 Node replaceChild(Node newChild, Node oldChild) oldChild 노드를 newChild 노드로 대체 Node removeChild(Node oldChild) 트리에서 oldChild 자식 노드를 제거한 후 그 노드 객체를 반환 Node appendChild(Node newChild) 트리에 노드를 추가. 추가하려는 노드 위치에 다른 형제 노드가 있으면 마지막에 노드를 추가함 Node cloneNode(boolean deep) 노드의 복사본을 만드는 method. deep 값이 true이면 deep copy, false면 shallow copy 수행
Node Interface 부모, 자식, 형제 노드를 조회 method 기능 Node getParentNode() 부모 노드를 반환 NodeList getChildNodes() 자식 노드를 NodeList 타입으로 반환 Node getFirstChild() 첫 번째 자식 노드를 반환 Node getLastChild() 마지막 자식 노드를 반환 Node getPreviousSibling() 현재 노드의 바로 앞에 있는 형제 노드를 반환 Node getNextSibling() 현재 노드의 바로 뒤에 있는 형제 노드를 반환 boolean hasChildNodes() 단순히 노드가 자식을 가지고 있는지 없는지 확인하는 method로, 자식의 유무를 boolean 값으로 반환. 자식이 Text node라도 true를 반환함
Node Interface 자식 노드들을 순서대로 처리하는 방법 for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) { process child … } 또는 NodeList childNodes = node.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { Node child = childNodes.item(i); process child … }
Node Interface Public void processNode(Node node) { 트리 탐색 (Tree traversal) 재귀 함수 정의 및 호출 "pre-order depth-first traversal" Public void processNode(Node node) { process the current node … for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) { processNode(child); // process child }
Document Interface Document 인터페이스 문서 전체에 대한 접근을 제어하는 인터페이스 Node 인터페이스에서 확장된 인터페이스 Node 인터페이스의 method와 속성을 물려받아 사용 가능 가능한 작업 노드 트리 검색 및 노드 반환 새로운 노드나 속성을 생성
Document Interface 문서 트리 내의 엘리먼트를 검색하기 위한 methods method 기능 Element getDocumentElement() 문서의 Root Element를 반환 Element getElementByID (String elementID) 문서에 elementID를 ID로 가진 엘리먼트를 찾아 반환함. 해당되는 엘리먼트가 없으면 null을 반환 NodeList getElementsByTagName (String tagName) 문서에 tagName 이름을 가진 엘리먼트들을 모두 찾아 NodeList 객체에 저장하여 반환함
Document Interface 새로운 노드를 생성하는 methods method 기능 Element createElement(String tagName) tagName을 이름으로 갖는 Element 노드를 생성 Attr createAttribute(String name) 지정된 name의 속성 노드를 생성 Text createTextNode(String data) data의 텍스트가 있는 Text 노드를 생성 Comment createComment(String data) data의 텍스트가 있는 Comment 노드를 생성 DocumentFragment createDocumentFragment() 비어있는 DocumentFragment 객체를 생성 Node importNode(Node importNode, boolean deep) 다른 문서에서 이 문서로 importNode 노드를 가져옴. 원래의 노드는 이전 문서에서 제거되지 않고 복사됨.
Element Interface Element 인터페이스 XML 문서에 포함된 하나의 엘리먼트를 표현하고 접근하기 위한 인터페이스 유일한 속성은 tagName 속성 엘리먼트의 태그 이름을 반환하며, 읽기 전용임 Methods 엘리먼트의 태그 및 속성에 접근하기 위한 methods
Element Interface Methods method 기능 String getTagName() 태그 이름을 반환 NodeList getElementsByTagName( String name) name의 태그 이름을 갖는 모든 자손 노드들의 NodeList를 반환 (문서 순서대로) boolean hasAttribute(String name) 주어진 이름의 속성이 있는 경우, true를 반환 String getAttribute(String name) 지정된 name 속성값을 반환. 속성에 지정된 값이 없거나, 기본값을 가지고 있지 않으면 빈 문자열을 반환 Attr setAttribute(String name, String value) 지정된 name을 갖는 속성 값을 value 값으로 변경. 해당 속성이 존재하지 않으면 새로운 속성을 추가
Element Interface Methods method 기능 void removeAttribute(String name) 기본값이 정의된 속성인 경우 새로운 속성으로 대체 Attr getAttributeNode(String name) 지정된 name의 속성을 담고 있는 Attr 노드를 반환. 해당 노드가 없으면 null을 반환 Attr setAttributeNode(Attr newAttr) 현재 엘리먼트에 새로운 Attr 노드를 추가. 같은 이름의 속성이 이미 존재하면 대체함. Attr이 대체되면 대체된 값이 반환되고, 그렇지 않으면 null을 반환 Attr removeAttributeNode(Attr oldAttr) 지정된 Attr 노드를 제거하고 반환. 기본값이 정의된 속성인 경우 새로운 Attr 속성으로 대체
Element Interface Example GetFirstBookKind2.java (p.527) + ModifyFirstbook.java (p.531) public static void main(String[] args) throws Exception { // DOM 파서 생성 … // XML 문서 파싱하기 // 루트 엘리먼트 참조 얻기 // 첫번째 book 엘리먼트의 kind 속성값 변경 Element eBook = (Element) eRoot.getFirstChild(); String strKind = fBook.getAttribute(“category"); fBook.setAttribute(“category", "computer"); // == eBook.getAttributeNode("kind").setNodeValue("computer“); System.out.println(eBook.getAttribute("kind"); // 첫번째 book 엘리먼트에 새로운 속성 추가 eBook.setAttribute("publishDate", “20130501"); System.out.println(eBook.getAttribute("publishDate"); }
Attr Interface Attr 인터페이스 엘리먼트에 속한 속성에 대한 인터페이스 Node 인터페이스를 확장한 인터페이스 속성은 XML 트리 구조의 일부가 아님 속성은 관련된 엘리먼트와 자식 및 부모 관계가 아님 Node의 속성인 parentNode, previousSibling, nextSibling은 null 값을 갖음 Attr의 속성 name: 속성의 이름을 반환하는 읽기 전용 속성 value: 속성의 값을 나타내는 속성 ownerElement: 이 속성을 포함하는 엘리먼트 노드를 가리킴
Attr Interface Methods method 기능 String getName() 속성 이름을 반환 String getValue() 속성 값을 반환 void setValue(String value) 속성 값을 설정 Element getOwnerElement() 해당 속성이 속한 Element 노드를 반환
DOM 사용 예 1 book.xml 문서에서 <title> 엘리먼트들을 모두 찾아 그것의 자식노드인 텍스트 노드의 값을 출력
DOM 사용 예 2 book.xml 문서에서 첫번째 <book> 엘리먼트의 모든 자식노드들의 정보를 출력 제목: Everyday Italian 저자: … 연도: … 가격: …
DOM 사용 예 3 book.xml 문서에서 첫번째 <book> 엘리먼트에 대해 새로운 <edition> 자식노드와 그 텍스트 값을 생성하여 추가 <book category=“cooking” > <title>…</title> <author>…</author> <year>…</year> <price>…</price> <edition>first</edition> </book>
DOM 사용 예 4 <book category=“cooking” > <title>…</title> <author>…</author> <year>…</year> ( 삭제) <price>…</price> </book> book.xml 문서에서 첫번째 <book> 엘리먼트에 대해 <year> 자식 노드를 찾아 삭제
DOM 사용 예 5 <book category="cooking” publishDate="20160501"> <title>…</title> <author>…</author> <year>…</year> <price>…</price> </book> book.xml 문서에서 첫번째 <book> 엘리먼트를 찾아 category 속성을 삭제하고 publishDate 속성을 값과 함께 추가
DOM 사용 예 5 <book category="cooking” publishDate="20160501"> <title>…</title> <author>…</author> <year>…</year> <price>…</price> </book> book.xml 문서에서 첫번째 <book> 엘리먼트를 찾아 category 속성을 삭제하고 publishDate 속성을 값과 함께 추가
HTML DOM HTML 문서의 구성요소들을 하나의 DOM 트리로 표현
HTML DOM 예 link 주소 설정 input 값 설정
References W3C Document Object Model XML DOM Tutorial http://www.w3.org/DOM/ XML DOM Tutorial http://www.w3schools.com/xml/dom_intro.asp HTML DOM Tutorial http://www.w3schools.com/js/js_htmldom.asp Books 신민철, Java 개발자를 위한 XML, 프리렉, 2006 B. D. McLaughlin & J. Edelson, Java and XML, 3rd Ed., O'Reilly, 2006 손진현, 김명호, XML 개념 및 응용, 홍릉과학출판사, 2008