Download presentation
Presentation is loading. Please wait.
1
XML 조작을 위한 DOM 활용 ㅎㅎ DOM 개념 DOM API 활용 DOM을 활용한 XML 문서 조작
2
학습목표 9장. XML 조작을 위한 DOM 활용 DOM 기본 개념 이해 DOM API 기본 인터페이스 구성 이해
DOM을 활용한 XML 문서 조작 방법 익히기
3
DOM 개념 DOM 사용 목적 Section 01 DOM 개념 Document Object Model(문서 객체 모델) 약어
HTML 문서와 XML 문서를 조작하기 위한 API 일반 프로그래밍 언어나 스크립트를 가지고, HTML이나 XML 문서의 내용, 구조, 스타일 정보를 검색하고 수정할 수 있도록 하는 플랫폼 또는 인터페이스 DOM 사용 목적 어떠한 환경이나 애플리케이션에서도 사용할 수 있는 표준 프로그래밍 인터페이스 제공
4
DOM을 이용한 XML 문서 생성 과정 Section 01 DOM 개념
① XML 문서를 조작하기 위해 XML 문서를 읽어들인다. ② XML 파서로 XML 문서를 문서 트리 구조로 변환한다. ③ DOM API를 사용해서 읽어들인 XML 문서의 요소, 속성, 텍스트 내용을 추출한 후 XML 문서를 조작한다(XML 문서 추가, 삭제, 수정 등). ④ 조작한 XML 문서를 애플리케이션에 따라서 생성, 수정, 삭제한 후 결과 문서를 만든다.
5
XML 문서의 트리 구조 Section 01 DOM 개념 DOM은 XML 문서를 하나의 객체 모델로 인식
각 객체를 인터페이스 개념으로 접근 외부 애플리케이션은 객체에 정의된 인터페이스를 통해 해당 객체를 제어 [그림 9-2] DOM의 자료 구조
6
DOM 레벌 Section 01 DOM 개념 DOM 레벨 주요 내용 레벨 1
HTML과 XML 문서를 검색/관리할 수 있는 인터페이스 제공 레벨 2 네임스페이스를 비롯해서, 뷰, 스타일시트, CSS, 이벤트 모델 자원, 노드 횡단(traversal)을 지원하는 인터페이스 포함 레벨 3 윈도우에서 사용할 수 있는 사용자 인터페이스 포함
7
DOM의 구조적 모델 Section 01 DOM 개념
DOM은 XML 문서를 노드 클래스와 하위 클래스 인스턴스를 트리 구조로 조합하여 표현 특정 노드의 하위 클래스는 요소, 텍스트, 주석을 인스턴스로 갖는다. DOM을 이용한 XML 문서의 접근 방식
8
Section 01 DOM 개념 DOM 기본 인터페이스 구성도
9
DOM Core 기본 인터페이스 Section 01 DOM 개념 종류 내용 DOMImplementation
NodeList 노드 객체를 저장하는 콜렉션 객체 Node DOM 내부 트리 자료구조에서 노드에 해당 트리에 대한 탐색, 추가, 삭제, 수정 기능 제공 DocumentFragment 임시 XML 문서를 다룸 Document XML 문서에 해당. 노드 인터페이스를 상속 받음 XML 문서 내부 요소 탐색과 생성 기능 제공 Element XML 문서에서 요소에 해당하는 객체를 다룸 Attr XML 문서에서 요소 속성에 해당하는 객체를 다룸 CharacterData XML 문서에서 PCDATA, 속성 값, 주석 등에 사용되는 텍스트를 다룸 Text XML 문서에서 PCDATA에 해당하는 내용을 다룸 Comment XML 문서에서 주석에 해당하는 내용을 다룸 NamedNodeMap NodeList의 기능과 유사. 이름을 이용해서 노드에 접근하고, 객체에 포함된 속성을 추출할 때 사용
10
DOM Core 확장 인터페이스 Section 01 DOM 개념 종류 내용 CDATASection
XML 문서에서 CDATA Section에 해당 DocumentType 문서의 타입 정의에 해당하는 객체 Notation DTD의 Notation에 해당하는 객체 EntityReference XML 문서에서 Entity에 대한 참조에 해당하는 객체 Entity XML 문서에서 Entity에 해당 ProcessingInstruction XML 문서의 processing instruction 부분에 해당
11
XML 문서를 DOM 인터페이스를 적용해서 트리 형태로 작성한 예
Section 01 DOM 개념 XML 문서를 DOM 인터페이스를 적용해서 트리 형태로 작성한 예 <students> <student> <name>박미영</name> <age>25</age> </student> <name>고소영</name> <age>24</age> </students> students.xml [그림 9-5] DOM 노드 트리 모델링
12
DOM 인터페이스 속성 Section 02 DOM API 활용 속성 내용 타입(Type)
인터페이스의 형태를 나타내며, 정수나 상수로 표현 이름(Name) Element 인터페이스라면 Element의 태그명이 되지만, Comment면 #Commnet가 이름이 되고, Document 인터페이스면 #Document라는 일반화된 이름이 온다. 값(Value): 해당 인터페이스가 가지는 값을 의미 대부분의 인터페이스가 값을 가지지 않는 경우를 포함하므로 값이 없을 때는 null 값을 갖는다.
13
Node 인터페이스 Section 02 DOM API 활용 DOM의 기본 자료형. DOM 트리에서 노드 표현시 사용
nodeName nodeValue 속성 Attr 속성의 이름 속성의 값 null CDATASection #cdata-section CDATA섹션의 내용 Comment #comment 주석 내용 Document #document DocumentFragment #document-fragment DocumentType 문서 타입 이름 Element 태그 이름 NamedNodeMap Entity 개체 이름 EntityReferencce 개체 참조 이름 Notation 노테이션 이름 ProcessingInstruction 타겟 타겟을 제외한 내용 Text #text 텍스트 노드의 내용
14
Node 인터페이스::멤버 필드 Section 02 DOM API 활용 멤버 필드 상수값 ELEMENT_NODE 1
PROCESSING_INSTRUCTION_NODE 7 ATTRIBUTE_NODE 2 COMMENT_NODE 8 TEST_NODE 3 DOCUMENT_NODE 9 CDATA_SECTION_NODE 4 DOCUMENT_TYPE_NODE 10 ENTITY_REFERENCE_NODE 5 DOCUMENT_FRAGMENT_NODE 11 ENTITY_NODE 6 NOTATION_NODE 12 [표 9-7] 멤버 필드
15
Node 인터페이스::노드 속성 Section 02 DOM API 활용 속성 이름 속성 타입 설명 nodeName String
노드 이름 nodeValue Text 노드 값 nodeType Number 노드 타입. 0부터 시작하는 정수로 표현 parentNode Node 노드의 부모 노드 childNode NodeList 노드의 자식 노드 fisrtNode 첫 번째 자식 노드 lastNode 마지막 자식 노드 prviousSibling 노드의 형제 노드 중 바로 앞 노드 nextSibling 노드의 형제 노드 중 바로 다음 노드 attributes NameNodeMap 노드 속성 ownerDocument 노드를 포함하는 문서 namespaceURI 노드의 네임스페이스 URI prefix 노드의 네임스페이스 접두어 [표 9-8] 노드 속성
16
Node 인터페이스::노드 정보를 얻는 메소드
Section 02 DOM API 활용 Node 인터페이스::노드 정보를 얻는 메소드 메소드 내용 String getNodeName() 노드 이름을 반환 String getNodeValue() 노드 값을 반환 void setNodeValue(String nodeValue) 노드 값을 설정 short getNodeType() 노드 타입을 반환 NamedNodeMap getAttributes() 속성을 반환 Document getOwnerDocument() 현재 노드가 속한 문서를 반환 [표 9-10] 노드 정보를 얻는 메소드
17
Node 인터페이스::XML 문서 조작을 위한 메소드
Section 02 DOM API 활용 Node 인터페이스::XML 문서 조작을 위한 메소드 메소드 내용 Node insertBefore(Node newChild, Node refChild) refChild 노드 앞에 newChild 노드 삽입하는 메소드 refChild 노드가 null이면 newChild 노드는 맨 마지막 자식 노드로 삽입 Node replaceChild(Node newChild, Node oldChild) 노드를 대체하는 메소드 oldChild 노드를 newChild 노드로 대체 Node removeChild(Node oldChild) 자식 노드를 제거하는 메소드 제거하려는 자식 노드를 참조해서 객체를 반환한다. 하지만 완전히 제거되는 것이 아니다. 완전히 제거하려면 제거한 후 문서가 저장되어야 하며, 트리에서 제거하고 그 객체를 변수에 저장해서 보관할 수도 있다. Node appendChild(Node newChild) 노드 추가 메소드 추가하려는 노드 위치에 다른 형제 노드가 있으면 마지막에 노드를 추가한다. Node cloneNode(boolean deep) 노드의 복사본을 만드는 메소드 cloneNode()는 하나의 boolean 파라미터를 갖는다. 파라미터가 true면 deep clone이고 false면 shallow clone이다. deep clone면 노드 밑의 자식을 모두 복사하고, shallow clone이면 해당 노드만 복사한다. shallow clone일 때 자식은 복사가 되지 않지만 속성 등은 함께 복사가 된다. [표 9-11] XML 문서 조작을 위한 메소드
18
노드 인터페이스::부모, 자식, 형제 노드 관련 정보를 얻는 메소드
Section 02 DOM API 활용 노드 인터페이스::부모, 자식, 형제 노드 관련 정보를 얻는 메소드 메소드 내용 Node getParentNode() 부모 노드를 반환 NodeList getChildNodes() 자식 노드를 NodeList 타입으로 반환 Node getFirstChild() 첫 번째 자식 노드를 반환 Node getLastChild() 마지막 자식 노드를 반환 Node getPrevoiusSibling() 현재 노드의 앞에 형제 노드를 반환 Node NextSibling() 현재 노드의 뒤에 형제 노드를 반환 boolean hasChildNodes() 단순히 노드가 자식을 가지고 있는지 없는지 확인을 하기 위해서 쓰는 메소드로, 자식이 있는지 없는지를 불리언 값으로 반환. 자식이 비록 텍스트 노드라도 hasChildNodes()는 true를 반환한다. [표 9-12] 부모, 자식, 형제 노드 관련 정보를 얻는 메소드
19
Document 인터페이스 Section 02 DOM API 활용 문서 전체에 접근을 제어하는 인터페이스
노드 인터페이스에서 확장된 인터페이스 노드 메소드와 속성을 문서 객체 내에서 사용 가능 역할 작업 노드 트리 검색 노트 검색하거나 노드 목록 반환 요구 새로운 노드나 속성 생성 제공 메소드 문서 관련 정보를 얻는 메소드 문서 트리를 순회하기 위한 메소드 문서를 작성하기 위한 메소드
20
Document 인터페이스:: 문서 관련 정보를 얻는 메소드
Section 02 DOM API 활용 Document 인터페이스:: 문서 관련 정보를 얻는 메소드 메소드 내용 DocumentType getDoctype() DocumentType 객체를 반환 DocumentType 인터페이스는 문서에 정의된 개체에 접근하기 위한 메소드들을 제공한다. DOMImplementation getImplementation() DOMImplementation 객체를 반환 DOMImplementation은 파서의 특성을 파악하기 위한 메소드를 가지고 있다. [표 9-13] 문서 관련 정보를 얻는 메소드
21
Document 인터페이스::문서 트리를 순회하기 위한 메소드
Section 02 DOM API 활용 Document 인터페이스::문서 트리를 순회하기 위한 메소드 메소드 내용 Element getDocumentElement() 문서 요소를 반환 elementID안에 지정된 Element getElementByID(String elementID) ID를 가진 요소를 반환 지정된 ID를 가진 요소가 없으면 NULL 반환 namespaceURI로 지정된 네임스페이스와 지정된 로컬 이름을 가진 문서 안에 있는 모든 NodeList getElementsByTagNameNS(String namespaceURI, String localName) 요소의 NodeList를 반환 NodeList getElementsByTagName(String tagName) 문서 안에 tagName의 이름을 가진 모든 요소의 NodeList 객체를 반환 [표 9-14] 문서 트리를 순회하기 위한 메소드
22
Document 인터페이스::문서를 작성하기 위한 메소드
Section 02 DOM API 활용 Document 인터페이스::문서를 작성하기 위한 메소드 메소드 내용 Element createElement(String tagName) 지정된 이름의 요소를 만들 때 사용하는 메소드로, tagName에 지정된 이름의 요소를 생성 Element createElementNs(String namespaceURI, String qulifiedName) 주어진 이름과 네임스페이스를 이용해서 요소를 생성 DocumentFragment createDocumentFragment() 비어있는 DocumentFragment 객체를 생성 Text createTextNode(String data) data에 텍스트가 있는 text 노드를 생성 Comment createComment(String data) data에 텍스트가 있는 Comment 노드를 생성 CDATASection createCDATASection(String data) data에 있는 텍스트가 CDATASection 노드를 생성 ProcessingInstruction createProcessingInstruction(String target, String data) 지정된 target과 data를 가진 ProcessingInstruction 노드를 생성. ProcessingInstruction이 가리키는 애플리케이션을 지정하는 문자열이 오고, data는 target을 제외한 나머지 부분의 문자열이 온다. Attr createAttribute(String name) 지정된 name 속성을 생성. 만들어진 노드는 노드 인터페이스의 nodeName 속성에 접근을 할수 있다. Attr createAttributeNS(String namespaceURI, String qulifiedName) 주어진 이름과 네임스페이스를 이용해서 속성을 생성 EntityReference createEntityReference(String name) 지정된 name의 개체 참조를 생성 필요한 곳으로 노드를 복사할 수 있도록 함 Node importNode(Node importNode, boolean deep) 다른 문서에서 이 문서로 importNode 노드를 가져온다. 원래의 노드는 이전의 문서에서 제거되지 않고 복사된다. deep속성은 deep 또는 shallow clone을 지정한다. [표 9-15] 문서를 작성하기 위한 메소드
23
DOMImplementation 인터페이스
Section 02 DOM API 활용 DOMImplementation 인터페이스 DOM을 구현할 때 어떤 문서에나 적용가능한 메소드 제공 Document 인터페이스와 implementation 속성을 이용해서 DOMImplementation 객체 생성도 가능 DOMImplementation 인터페이스의 메소드 메소드 내용 boolean hasFeature(String feature, String version) 현재 DOM의 어떤 특성을 지원하는지 확인 DOM레벨 1인 경우에 “1.0”을 사용. DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) 지정된 속성의 문서 타입을 생성 Document createDocument(String namespaceURI, String qulifiedName, DocumentType doctype) qulifiedName으로 지정된 문서 요소를 가진 Document 객체 생성. doctype 속성은 반드시 DocumentType 형식의 객체를 참조해야 한다.
24
DocumentFragment 인터페이스
Section 02 DOM API 활용 DocumentFragment 인터페이스 문서 조각을 쉽게 조작할 수 있도록 잠시 보관 보관하는 문서가 반드시 정형식 문서일 필요는 없다. Node 인터페이스가 제공하는 속성과 메소드 제공 객체로 자식을 포함할 수도, 아닐 수도 있음 자식의 의미는 노드나 텍스트 노드 등이 될 수 있다. DocumentFragment 객체 역시 Node 인터페이스에서 제공하는 메소드를 이용하면 자식을 다른 곳으로 보낼 수 있지만, 자기 자신에 해당하는 객체는 어디에서 복사할 수 없다.
25
NodeList 인터페이스 Section 02 DOM API 활용
정렬된 집합체 형태 여러 개의 노드를 호출할 때 유용 NodeList에 포함된 노드들은 인덱스 값을 이용해서 접근할 수 있고, 인덱스는 0부터 시작 NodeList에서 얻는 노드 순서는 XML 문서에서 부모 노드에 노드를 추가한 순서 NodeList 노드는 반드시 부모와 자식 관계나 형제 관계일 필요는 없지만, 적어도 문서의 한 부분이어야 한다.
26
NodeList 인터페이스에서 제공하는 메소드
Section 02 DOM API 활용 NodeList 인터페이스에서 제공하는 메소드 메소드 내용 int getLength() NodeList 안에 포함된 노드 수를 반환 Node item(int index) NodeList 목록 중에서 지시된 곳의 Node를 반환 index는 0부터 시작하고, 범위는 0부터 length-1 만일 index와 length가 같아지면 null을 반환
27
Element 인터페이스 Section 02 DOM API 활용 요소로 바로 접근해서 작업할 수 있도록 하는 인터페이스
유일한 속성은 tagName 속성 tagName 속성은 요소 이름을 반환하며, 읽기 전용 속성으로 사용 제공 메소드 ① 요소 객체의 속성에 접근해서 처리하는 메소드 ② 요소 태그에 접근하기 위한 메소드가 있다.
28
Element 인터페이스::요소 객체의 속성에 접근해서 처리하는 메소드
Section 02 DOM API 활용 Element 인터페이스::요소 객체의 속성에 접근해서 처리하는 메소드 메소드 내용 String getAttribute(String name) 지정된 name 속성값을 반환 속성에 지정된 값이 없거나, 기본값을 가지고 있지 않으면 빈 문자열을 반환 Attr setAttribute(String name, String value) name이라는 지정된 속성 값을 value 값으로 만듬 해당 속성이 존재하지 않으면 name을 가진 속성을 만듬 void removeAttribute(String name) 지정된 속성을 제거 기본값을 가지고 있는 속성은 이 기본값을 가지고 있는 동일한 속성으로 곧바로 대체 Attr getAttributeNode(String name) 지정된 이름의 속성을 담고 있는 Attr노드를 반환 해당 노드가 없으면 null을 반환 Attr setAttributeNode(Attr newAttr) 새로운 속성 노드를 추가. 현재 요소에 Attr 노드를 추가 같은 이름이 존재하면 대체한다. Attr이 대체되면 대체된 값이 반환되고, 그렇지 않으면 null을 반환 Attr removeAttributeNode(Attr oldAttr) 지정된 Attr노드를 제거하고 반환
29
Element 인터페이스::요소 태그에 접근하기 위한 메소드
Section 02 DOM API 활용 Element 인터페이스::요소 태그에 접근하기 위한 메소드 메소드 내용 String getTagName() 태그 이름을 반환 NodeList getElementByTagName(String name) name으로 주어진 노드를 가진 모든 자식의 NodeList를 반환 NodeList getElementByTagNameNS(String namespaceURI, String localName) 주어진 이름과 네임스페이스를 갖는 모든 요소를 반환 boolean hasAttribute(String name) 주어진 이름의 속성이 있는 경우, true를 반환 boolean hasAttributeNS(String namespaceURI, String localName) 주어진 이름과 네임스페이스를 갖는 속성이 있는 경우, true를 반환 [표 9-18] 요소 태그에 접근하기 위한 메소드
30
NamedNodeMap 인터페이스 Section 02 DOM API 활용 nodeList와 유사. 단, 정렬되지 않는 집합체
item()메소드와 getLength() 메소드도 갖고 있음 NamedNodeMap은 이름을 이용해서 노드에 접근하고자 할 때 사용 가능 주로 요소에 포함된 속성을 추출하기 위해 사용 노드는 이름과 인덱스 값을 이용해서 추출할 수 있고, 인덱스는 0부터 시작
31
NamedNodeMap 인터페이스의 메소드
Section 02 DOM API 활용 NamedNodeMap 인터페이스의 메소드 메소드 내용 Node getNamedItem(String name) 노드 이름이 name으로 지정한 것과 같으면 Node를 반환하고, 해당 노드가 없으면 null을 반환 Node setNamedItem(Node arg) 새로운 노드를 추가 같은 이름의 노드가 존재하면, 기존 노드에 새 노드를 대체한다. Node가 대체되면 대체된 Node를 반환하고, 그렇지 않으면 null이 반환된다. Node removeNamedItem(String name) name으로 지정한 Node를 제거하고 해당 Node를 반환 Node item(int index) index로 지정한 위치의 Node를 반환 index가 length보다 크거나 같다면 null을 반환 int getLength() NamedNodeMap에 포함된 노드 수를 반환
32
Attr 인터페이스 Section 02 DOM API 활용 요소의 속성에 대한 인터페이스 제공
xml 문서의 트리 구조를 봤을 때 속성은 트리 구조를 형성하지 않는다. 속성이 요소의 자식으로서 존재하는 것이 아니고 속성으로 존재하는 것이다. node 속성인 parentNode, previousSibling, nextSibling은 속성에 적용할 때 null 값을 갖게 된다. name 속성: 이름을 반환하는 읽기전용 속성 value 속성: 값을 나타내는 속성 보통 속성이 가질 수 있는 값은 DTD에 정의
33
Attr 인터페이스의 메소드 Section 02 DOM API 활용 메소드 내용 String getName()
속성 이름을 반환 boolean getSpecified() 원 문서에서 속성을 명시적인 값으로 준 경우 true를 반환하고, 그렇지 않은 경우에는 false를 반환 String getValue() 속성 값을 반환 void setValue(String value) 속성 값을 설정 Element getOwnerElement() 해당 속성이 소속된 요소를 반환
34
CharaterData와 Text 인터페이스
Section 02 DOM API 활용 CharaterData와 Text 인터페이스 xml 문서에서 사용되는 텍스트를 다루기 위해서 만들어진 인터페이스 Text는 CharaterData의 확장이지만, PCDATA, 속성 값, 주석 등 상당히 많은 곳에서 쓰임. CharaterData 인터페이스도 Attr 인터페이스처럼 자식 노드를 포함할 수 없다는 점을 주의 data 속성: CharaterData 노드 안의 텍스트로, 노드의 문자 데이터를 표현하거나 설정할 때 사용 length 속성: 노드 안의 데이터 글자 수로, 노드가 비어있으면 0을 반환
35
CharaterData 인터페이스의 메소드
Section 02 DOM API 활용 CharaterData 인터페이스의 메소드 메소드 내용 void appendData(String arg) 기존 문자 데이터의 끝에 arg 스트링을 추가 void deleteData(int offset, int count) offset에서 시작하는 스트링의 일부를 삭제한다. count로 지정된 글자(유니코드 문자) 숫자만큼 반환하거나, 그 숫자보다 글자수가 적다면 끝까지 삭제한다. String getData() CharcterData 인터페이스를 구현한 노드의 문자 데이터를 반환 int getLength() 문자열 길이를 반환 void insertData(int offset, String arg) offset에서 지정된 위치에 arg를 삽입 void replaceData(int offset, int count, String arg) 문자 데이터의 일부나 전체를 다른 스트링으로 대체 offset에서 시작하는 스트링 일부를 대체한다. count로 지정된 숫자만큼 반환하거나, 그 숫자보다 글자 수가 작다면 끝까지 대체한다. arg 인자는 새롭게 삽입될 스트링이다. void setData(String data) 데이터를 설정 String substringData(int offset, int count) 문자 데이터 중에서 offset에서 시작해서 count로 지정된 숫자만큼 반환하거나, 그 숫자보다 글자수가 작다면 끝까지 반환 주의: 색인은 0부터 시작
36
Text 인터페이스의 메소드 Section 02 DOM API 활용 메소드 내용
Text splitText(int offset) offset을 기준으로 텍스트를 두 개로 분리
37
Section 03 DOM을 활용한 XML 문서 조작
Comment 인터페이스 주석문을 쓰기 위한 인터페이스 메소드나 프로퍼티는 없음 Comment 객체를 만들어서 문서에 추가를 하면 DOM이 자동으로 주석 마크업을 추가 주석의 마크업은 HTML과 마찬가지로 <!-- --> 형태
38
Section 03 DOM을 활용한 XML 문서 조작
데이터 입출력 차이점 자바 입출력에 의한 데이터 입출력 DOM API에 의한 데이터 입출력 XML 문서 (file) FileReader FileWriter 스트림 구조 버퍼(buffer) ~~ ~~ XML 문서 버퍼(buffer)
39
Section 03 DOM을 활용한 XML 문서 조작
요소 추가를 위해 사용할 메소드 요소 삭제를 위해 사용할 메소드 메소드 내용 Element createElement(String tagName) 문서에 요소를 생성 Text createTextNode(String data) 문서에 텍스트를 생성 Document getOwnerDocument() 노드에 문서를 얻는다 Node appendChild(Node newChild) 노드에 자식 노드를 추가 메소드 내용 Node getParentNode() 노드 부모를 얻는다 Node removeChild(Node oldChild) 노드 자식을 삭제
40
Section 03 DOM을 활용한 XML 문서 조작
데이터 추출을 위해 사용할 메소드 데이터 변환 데이터를 자동으로 의미에 맞게 변환하는 프로그램 제작 메소드 내용 NodeList getElementsByTagName(String tagName) 문서에서 노드 목록를 얻는다 int getLength() 노드 목록의 노드 개수를 얻는다 Node item(int index) 노드 목록에서 노드를 얻는다
Similar presentations