4. DOM: The Document Object Model

¹®¼­ °´Ã¼ ¸ðµ¨(DOM)Àº XML ¹®¼­¸¦ Æ®¸®±¸Á¶ Ç¥ÇöÀ¸·Î ¸í½ÃÇÑ´Ù. ÃÖ»óÀ§ ¹®¼­ ÀνºÅϽº´Â Æ®¸®ÀÇ ·çÆ®À̸ç, ÇϳªÀÇ ÃÖ»óÀ§ ¿ä¼Ò ÀνºÅϽº(Element instance)¸¦ °®´Â´Ù.; ÀÌ ¿ä¼Ò´Â ³»¿ëÀ» Ç¥ÇöÇÏ´Â Àڽijëµå³ª, Ãß°¡ÀûÀÎ ÀÚ½ÄÀ» °®À» ¼ö ÀÖ´Â ÇÏÀ§¿ä¼Ò¸¦ °®´Â´Ù. ÇÔ¼öµéÀº °á°úÆ®¸®¸¦ Ž»öÇϰųª, ¿ä¼Ò¿Í ¼Ó¼º°ªÀ¸·ÎÀÇ Á¢±Ù, ³ëµåÀÇ Ãß°¡¿Í »èÁ¦, Æ®¸®¸¦ ´Ù½Ã 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 ÀÎÅÍÆäÀ̽º¿¡¸¸ °ü½ÉÀÌ ÀÖ´õ¶óµµ ÀÐÀ»¼öÀÖ°Ô µÇ¾îÀÖ´Ù.