XML DOM (Document Object Model) 2017. 9. 27
Content XML 문서처리 DOM 개요 DOM Tree DOM Core Interfaces Node Document Element Attr DOM 사용예 1
XML 문서처리 XML 문서처리과정 XML Parser 2
XML 문서처리 XML Parsing XML 문서를읽고해석하여구성요소, 즉, element name, content, attribute name, attribute value 등을식별하고그것들간의문법적인관계를파악 응용프로그램이이용할수있도록메모리상에데이터구조생성 DOM(Document Object Model) XML 문서를 parsing 한후메모리에객체들의트리구조를생성 XML 문서에대한메모리내표현 생성된트리를이용하여데이터검색, 추가, 수정, 삭제가능 XML 문서의크기가크거나많은 XML 문서들을동시에처리하는경우 메모리공간을많이사용 3
DOM 개요 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) 정의 4
DOM 개요 DOM 표준의종류 Core DOM: 임의의문서에대한표준모델을정의 HTML DOM: HTML 문서에대한트리구조와인터페이스정의 XML DOM: XML 문서에대한트리구조와인터페이스정의 XML 문서를하나의트리로표현 DOM 기반 parser 에의해트리구조가생성됨 인터페이스를이용하여트리 ( 문서 ) 에속한엘리먼트와속성, 텍스트들을검색, 생성, 수정, 삭제가능 5
DOM 개요 6
DOM 개요 DOM 을이용한 XML 문서의처리과정 1 2 4 3 1 XML 문서를읽어들임 2 XML 문서를해석하여객체트리구조를생성 3 DOM API 를사용해서 XML 문서의구성요소들을접근및변경 4 변경된문서구조를새로운 XML 파일로저장 7
DOM 개요 예 1: XML 문서에서첫번째 <title> element 의값을찾아출력 8
DOM 개요 예 2: HTML 문서에서 id 가 "demo" 인 element 의값을변경 9
DOM Tree 10
DOM Tree DOM 트리는 Node 타입의객체들로구성됨 XML 문서와그것에포함된모든요소들에대해노드객체생성 노드의종류 ( 하위타입 ) 문서노드 (Document node): 전체 XML 문서를나타냄 엘리먼트노드 (Element node): XML 엘리먼트를나타냄 텍스트노드 (Text node): XML 엘리먼트내의텍스트를나타냄. 속성노드 (Attribute node): XML 엘리먼트내의속성을나타냄. 주석노드 (Comment node): XML 문서내의주석을나타냄. 11
DOM Tree 노드들간의관계 부모-자식관계, 형제관계 최상위노드를루트 (root) 라함 루트를제외한모든노드는하나의부모 (parent) 노드를가짐 노드는하나이상의자식 (child) 노드들을가질수있음 모든자식노드집합, 첫번째자식노드, 마지막자식노드를조회가능 같은부모노드를갖는노드들을형제 (sibling) 노드라함 다음형제, 이전형제노드를접근가능 12
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 13
DOM Core Interfaces DOM Interfaces 구성도 14
DOM Core Interfaces 기본인터페이스 (Fundamental Interfaces) Node 종류 용도 모든인터페이스의부모인터페이스로, 다른인터페이스가공통적으로갖는 method 들이정의되어있음 Document Element Attr CharacterData Text NodeList DOMImplementation DocumentFragment DOM 트리의최상위노드의타입으로, XML 문서자체에해당됨. 동적으로다른노드를생성하는 method 들을포함 XML 문서내의엘리먼트에해당되는인터페이스 XML 문서내의속성에해당되는인터페이스 XML 문서내의문자데이터에해당되는인터페이스 XML 엘리먼트의텍스트콘텐트에해당되는인터페이스 노드들의집합을유지하고관리할수있도록설계된인터페이스 Document 객체를생성하는 method 가정의되어있는인터페이스 DOM 트리에서서브트리를분리할때사용되는인터페이스 15
DOM Core Interfaces 확장인터페이스 (Extended Interfaces) 종류 CDATASection DocumentType Notation Entity EntityReference ProcessingInstruction 용도 XML 문서에서 CDATA 섹션에해당되는인터페이스 XML 문서에서 DTD 선언에해당하는인터페이스 DTD에서 Notation 선언에해당하는인터페이스 DTD에서 Entity 선언에해당하는인터페이스 XML 문서또는 DTD에서 Entity 참조에해당하는인터페이스 XML 문서에서프로세싱지시자에해당하는인터페이스 16
Node Interface Node 인터페이스 기능 노드에대한정보를얻음 DOM 트리에노드를추가, 삭제, 변경가능 DOM 트리의노드들을순회 (traversal) 할수있음 17
Node Interface 속성 (property) 속성이름 속성타입 설명 nodename String 노드이름 nodevalue Text 노드값 nodetype Number 노드타입. 0부터시작하는정수로표현 parentnode Node 노드의부모노드 childnodes NodeList 노드의자식노드 fisrtchild Node 첫번째자식노드 lastchild Node 마지막자식노드 previoussibling Node 노드의형제노드중바로앞노드 nextsibling Node 노드의형제노드중바로다음노드 attributes NameNodeMap 노드속성 ownerdocument Document 노드를포함하는문서 namespaceuri String 노드의 namespace URI prefix String 노드의 namespace prefix 18
Node Interface 하위인터페이스 ( 노드 ) 에서의 nodename, nodevalue, attributes 의값 하위인터페이스 nodename nodevalue attributes Attr 속성의이름 속성의값 null CDATASection #cdata-section CDATA Section의내용 null Comment #comment 주석내용 null Document #document null null DocumentFragment #document-fragment null null DocumentType 문서타입이름 null null Element 태그이름 null NamedNodeMap Entity 개체이름 null null EntityReferencce 개체참조이름 null null Notation notation이름 null null ProcessingInstruction target target을제외한내용 null Text #text 텍스트노드의내용 null 19
Node Interface 메소드 (methods) 노드에관한정보를조회 method String getnodename() String getnodevalue() void setnodevalue(string nodevalue) short getnodetype() NamedNodeMap getattributes() String gettextcontent() Document getownerdocument() 기능노드이름을반환노드값을반환노드값을설정노드타입을반환속성을반환노드와그자손들의 text content를반환현재노드가속한문서를반환 20
Node Interface 문서 (DOM tree) 조작 : 새로운노드를추가하거나삭제, 복사함 method Node insertbefore(node newchild, Node refchild) Node replacechild(node newchild, Node oldchild) Node removechild(node oldchild) Node appendchild(node newchild) Node clonenode(boolean deep) 기능 refchild 노드앞에 newchild 노드를삽입 refchild 노드가 null이면 newchild 노드는맨마지막자식노드로삽입 oldchild 노드를 newchild 노드로대체트리에서 oldchild 자식노드를제거한후그노드객체를반환트리에노드를추가. 추가하려는노드위치에다른형제노드가있으면마지막에노드를추가함노드의복사본을만드는 method. deep 값이 true이면 deep copy, false면 shallow copy 수행 21
Node Interface 부모, 자식, 형제노드를조회 method 기능 Node getparentnode() NodeList getchildnodes() Node getfirstchild() Node getlastchild() Node getprevioussibling() Node getnextsibling() boolean haschildnodes() 부모노드를반환자식노드를 NodeList 타입으로반환첫번째자식노드를반환마지막자식노드를반환현재노드의바로앞에있는형제노드를반환현재노드의바로뒤에있는형제노드를반환단순히노드가자식을가지고있는지없는지확인하는 method로, 자식의유무를 boolean 값으로반환. 자식이 Text node라도 true를반환함 22
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 } 23
Node Interface 트리탐색 (Tree traversal) 재귀함수정의및호출 Public void processnode(node node) { process the current node for (Node child = node.getfirstchild(); child!= null; child = child.getnextsibling()) { processnode(child); // process child } } "pre-order depth-first traversal" 24
Document Interface Document 인터페이스 문서전체에대한접근을제어하는인터페이스 Node 인터페이스에서확장된인터페이스 Node 인터페이스의 method와속성을물려받아사용가능 가능한작업 노드트리검색및노드반환 새로운노드나속성을생성 25
Document Interface 문서트리내의엘리먼트를검색하기위한 methods method Element getdocumentelement() Element getelementbyid (String elementid) NodeList getelementsbytagname (String tagname) 기능문서의 Root Element를반환문서에 elementid를 ID로가진엘리먼트를찾아반환함. 해당되는엘리먼트가없으면 null을반환문서에 tagname 이름을가진엘리먼트들을모두찾아 NodeList 객체에저장하여반환함 26
Document Interface 새로운노드를생성하는 methods method Element createelement(string tagname) Attr createattribute(string name) Text createtextnode(string data) Comment createcomment(string data) DocumentFragment createdocumentfragment() Node importnode(node importnode, boolean deep) 기능 tagname 을이름으로갖는 Element 노드를생성 지정된 name 의속성노드를생성 data 의텍스트가있는 Text 노드를생성 data 의텍스트가있는 Comment 노드를생성 비어있는 DocumentFragment 객체를 생성 다른문서에서이문서로 importnode 노드를가져옴. 원래의노드는이전문서에서제거되지않고복사됨. 27
Element Interface Element 인터페이스 XML 문서에포함된하나의엘리먼트를표현하고접근하기위한인터페이스 유일한속성은 tagname 속성 엘리먼트의태그이름을반환하며, 읽기전용임 Methods 엘리먼트의태그및속성에접근하기위한 methods 28
Element Interface Methods method 기능 String gettagname() NodeList getelementsbytagname( String name) boolean hasattribute(string name) 태그이름을반환 name의태그이름을갖는모든자손노드들의 NodeList를반환 ( 문서순서대로 ) 주어진이름의속성이있는경우, true를반환 String getattribute(string name) 지정된 name 속성값을반환. 속성에지정된값이없거나, 기본값을 가지고있지않으면빈문자열을반환 Attr setattribute(string name, String value) 지정된 name 을갖는속성값을 value 값으로변경. 해당속성이존재하지 않으면새로운속성을추가 29
Element Interface Methods method 기능 void removeattribute(string name) 지정된 name을갖는속성을제거. 기본값이정의된속성인경우새로운속성으로대체 Attr getattributenode(string name) 지정된 name의속성을담고있는 Attr 노드를반환. 해당노드가없으면 null을반환 Attr setattributenode(attr newattr) 현재엘리먼트에새로운 Attr 노드를추가. 같은이름의속성이이미존재하면대체함. Attr이대체되면대체된값이반환되고, 그렇지않으면 null을반환 Attr removeattributenode(attr oldattr) 지정된 Attr 노드를제거하고반환. 기본값이정의된속성인경우새로운 Attr 속성으로대체 30
Element Interface Example 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"); 31
Attr Interface Attr 인터페이스 엘리먼트에속한속성에대한인터페이스 Node 인터페이스를확장한인터페이스 속성은 XML 트리구조의일부가아님 속성은관련된엘리먼트와자식및부모관계가아님 Node의속성인 parentnode, previoussibling, nextsibling은 null 값을갖음 Attr의속성 name: 속성의이름을반환하는읽기전용속성 value: 속성의값을나타내는속성 ownerelement: 이속성을포함하는엘리먼트노드를가리킴 32
Attr Interface Methods method String getname() String getvalue() void setvalue(string value) Element getownerelement() 기능속성이름을반환속성값을반환속성값을설정해당속성이속한 Element 노드를반환 33
DOM 사용예 1 book.xml 문서에서 <title> 엘리먼트들을모두찾아그것의자식노드인텍스트노드의값을출력 34
DOM 사용예 2 book.xml 문서에서첫번째 <book> 엘리먼트의모든자식노드들의정보를출력 제목 : Everyday Italian 저자 : 연도 : 가격 : 35
DOM 사용예 3 book.xml 문서에서첫번째 <book> 엘리먼트에대해새로운 <edition> 자식노드와그텍스트값을생성하여추가 <book category= cooking > <title> </title> <author> </author> <year> </year> <price> </price> <edition>first</edition> </book> 36
DOM 사용예 4 book.xml 문서에서첫번째 <book> 엘리먼트에대해 <year> 자식노드를찾아삭제 <book category= cooking > <title> </title> <author> </author> <year> </year> ( 삭제 ) <price> </price> </book> 37
DOM 사용예 5 book.xml 문서에서첫번째 <book> 엘리먼트를찾아 category 속성을삭제하고 publishdate 속성을값과함께추가 <book category="cooking publishdate="20160501"> <title> </title> <author> </author> <year> </year> <price> </price> </book> 38
DOM 사용예 5 book.xml 문서에서첫번째 <book> 엘리먼트를찾아 category 속성을삭제하고 publishdate 속성을값과함께추가 <book category="cooking publishdate="20160501"> <title> </title> <author> </author> <year> </year> <price> </price> </book> 39
HTML DOM HTML 문서의구성요소들을하나의 DOM 트리로표현 HTML 문서내의모든엘리먼트와속성들을접근및수정가능 40
HTML DOM 예 link 주소설정 input 값설정 41
References W3C Document Object Model 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 42