4. DOM: The Document Object Model

문서 객체 모델(DOM)은 XML 문서를 트리구조 표현으로 명시한다. 최상위 문서 인스턴스는 트리의 루트이며, 하나의 최상위 요소 인스턴스(Element instance)를 갖는다.; 이 요소는 내용을 표현하는 자식노드나, 추가적인 자식을 갖을 수 있는 하위요소를 갖는다. 함수들은 결과트리를 탐색하거나, 요소와 속성값으로의 접근, 노드의 추가와 삭제, 트리를 다시 XML 로 변환하는 등의 작업등을 제공한다.

DOM 은, DOM 트리를 만들어 새로운 노드를 추가하거나 하위트리를 옮긴후, 새로운 XML 문서로 결과를 출력할수있게 함으로서, XML 문서의 수정을 쉽게 해준다. 또한 자신만의 DOM 트리를 만들고, 이를 XML 로 변환하는것도 가능하다; 이 방법은 단순히 파일에 <tag1>...</tag1> 를 쓰는 방법보다, XML 을 생성하는데 더욱 유연한 방법이다.

DOM 은 한시점에서 모든 트리를 메모리에 상주시키는것을 요구하지 않는 반면에, 파이썬 DOM 도구는 RAM 에 모든 트리를 가지고 있어야 한다. 트리의 대부분을 디스크나 데이터베이스에 집어넣고, 필요한 섹션만을 읽어들이는 방법이 가능하겠지만, 현재로서는 지원되지 않는다. 이는 용량이 큰 문서를 DOM 트리로 처리할때, 메모리가 부족할 수도 있음을 나타낸다. 반대로, SAX 핸들러는 가용한 RAM 보다 큰 데이터를 처리하는것이 가능하다.

4.1. Getting A DOM Tree

DOM 트리를 얻는 가장 쉬운 방법은 자기자신이 만드는것이다. PyXML 은 DOM 을 위한 도구로서 xml.dom.minidom 과 4DOM 을 제공한다. xml.dom.minidom 은 파이썬 2.0 에 포함되어 있다. 파이썬 2.0 에 포함되어 있는 xml.dom.minidom 은 최소한의 도구로서, DOM 표준에서 요구하는 모든 인터페이스와 연산을 제공하지 않는다. 4DOM (XXX reference) 은 DOM Level 2 에 충실한 도구이므로, 이번 예제에는 이것을 사용하도록 한다.

xml.dom.package 내의 모듈중 xml.dom.ext.reader.Sax2 는 입력(파일류의 객체, 스트링, 파일이름, URL 등)에서 DOM 트리를 만들어주는, FromXmlStream, FromXml, FromXmlFile, 그리고 FromXmlUrl 함수를 제공한다. 이들은 모두 DOM 문서 객체를 반환한다.

   
   import sys
   from xml.dom.ext.reader.Sax import FromXmlStream
   from xml.dom.ext import PrettyPrint

   # parse the document
   doc = FromXmlStream(sys.stdin)

4.2. Manipulating The Tree

DOM 은 수많은 인터페이스와 메쏘드를 가지고 있으므로, 이 HOWTO 에서 그 모든것을 설명할 수는 없다. 그러나, 다행스럽게도, DOM 권고안은 매우 가독성이 높은 문서이므로, 가능한 인터페이스에 대한 완전한 그림을 얻기 위해 이것을 읽기를 권한다. 여기서는 일부분의 개관만을 보도록 한다.

문서 객체 모델(DOM)은 XML 문서를, 노드 클래스의 하위 클래스의 인스턴스로 표현되는, 노드들의 트리로 표현한다. 어떠한 노드의 하위클래스는 요소(Element), 텍스트, 주석이 될수도 있다.

우리는 이 섹션내에서 하나의 간단한 예제문서를 사용할 것이다. 여기에 그 예제가 있다.

   
   <?xml version="1.0" encoding="iso-8859-1"?>
   <xbel>
     <?processing instruction?>
     <desc>No description</desc>
     <folder>
       <title>XML bookmarks</title>
       <bookmark href="http://www.python.org/sigs/xml-sig/" >
         <title>SIG for XML Processing in Python</title>
       </bookmark>
     </folder>
   </xbel>

DOM 트리로 변환하면, 이 문서는 다음과 같은 트리로 출력된다 :

   
   Element xbel None
      Text #text '  \012  '
      ProcessingInstruction processing 'instruction'
      Text #text '\012  '
      Element desc None
         Text #text 'No description'
      Text #text '\012  '
      Element folder None
         Text #text '\012    '
         Element title None
            Text #text 'XML bookmarks'
         Text #text '\012    '
         Element bookmark None
            Text #text '\012      '
            Element title None
               Text #text 'SIG for XML Processing in Python'
            Text #text '\012    '
         Text #text '\012  '
      Text #text '\012'

이것은 유일하게 가능한 트리는 아니다. 각기 다른 파서들이 어떻게 텍스트 노드들을 처리하느냐에 따라 달라질수 있다. 위의 트리는 텍스트 노드를 어떻게 처리하느냐에 따라 다중의 노드로 나뉘어질수도 있다.

4.2.1. The Node class

기본적인 노드 클래스를 살펴보기로 하자. 모든 Document, Element, Text 등의 기타 DOM 노드들은 노드의 서브 클래스이다. 단지 노드가 제공하는 인터페이스를 사용하여 많은 작업을 하는것이 가능하다.

XXX table of attributes and methods readonly attribute DOMString nodeName; attribute DOMString nodeValue; // raises(DOMException) on setting // raises(DOMException) on retrieval readonly attribute unsigned short nodeType; readonly attribute Node parentNode; readonly attribute NodeList childNodes; readonly attribute Node firstChild; readonly attribute Node lastChild; readonly attribute Node previousSibling; readonly attribute Node nextSibling; readonly attribute NamedNodeMap attributes; readonly attribute Document ownerDocument;

Node insertBefore(in Node newChild, in Node refChild) raises(DOMException); Node replaceChild(in Node newChild, in Node oldChild) raises(DOMException); Node removeChild(in Node oldChild) raises(DOMException); Node appendChild(in Node newChild) raises(DOMException); boolean hasChildNodes(); Node cloneNode(in boolean deep);

4.2.2. Document, Element, and Text nodes

전체 트리의 기본은 도큐먼트 노드이며, 도큐먼트 노드의 documentElement 속성은 루트 요소에 대한 요소노드(element node) 를 포함한다. 도큐먼트 노드는 ProcessingInstruction 노드와 같은 추가적인 자식을 가질 수 있다.

the complete list of children XXX.

4.3. Walking Over The Entire Tree

xml.dom.package 는 트리를 탐색(walk)하는 등의 작업에 다양한 도움을 주는 클래스를 포함하고 있다.

The Walker class

Introduction to the walker class

4.4. Building A Document

Intro to builder

4.5. Processing HTML

Intro to HTML builder

4.6. 관련 홈페이지

http://www.w3.org/DOM/

월드 와이드 웹 컨소시움의 DOM 페이지

http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/

DOM Level 1 권고안. 대부분의 표준과 달리, 이것은 코어 XML 인터페이스에만 관심이 있더라도 읽을수있게 되어있다.