· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/Python_XML-TRANS

You are not allowed to 'edit'


Python/XML HOWTO

Python/XML HOWTO

The Python/XML Special Interest Group

¼ÛÀç°æ

XML Àº SGML ÀÇ ¼­ºê¼ÂÀÎ, È®Àå°¡´ÉÇÑ Á¶ÆǾð¾î(eXtensible Markup Language) ·Î¼­, ƯÁ¤ÇÑ ¾îÇø®ÄÉÀÌ¼Ç Á¶ÆǾð¾î¸¦ »ý¼ºÇÏ°í ó¸®Çϴ°ÍÀ» °¡´ÉÇÏ°Ô ÇØÁØ´Ù. Python Àº XML µ¥ÀÌÅ͸¦ ó¸®Çϴµ¥ ¸Å¿ì ÈǸ¢ÇÑ ¾ð¾îÀÌ´Ù. ÀÌ ¹®¼­´Â Python/XML ÆÐÅ°ÁöÀÇ Æ©Å͸®¾ó·Î¼­, À̱ÛÀ» Àд µ¶ÀÚ°¡ ÀÌ¹Ì XML ÀÇ ±¸Á¶¿Í Àü¹®¿ë¾î¿¡ Àͼ÷ÇÏ´Ù°í °¡Á¤ÇÏ¿© ¾²¿©Á³´Ù. À̹®¼­´Â ÃʾÈÀ¸·Î¼­ 'XXX' ¶ó°í Ç¥ÇöµÇ´Â ºÎºÐÀº ÈÄ¿¡ ä¿öÁö°Å³ª, ´Ù½Ã ¾²À̰ųª, ¼öÁ¤µÉ ºÎºÐÀÌ´Ù.


1. XML ÀÇ ½ÃÀÛ

XML Àº eXtensible Markup Language ·Î¼­ SGML(Standardized General Markup Language)ÀÇ ºÎºÐÁýÇÕÀÌ´Ù. XML Àº ½±°Ô ½ÇÇàÇÏ°í »ç¿ëÇϴ°ÍÀ» ÁöÇâÇϸç, ÀÌ¹Ì »õ·Î¿î ´Ù¾çÇÑ Ç¥ÁØÀ» À§ÇÑ Æ¯¼öÇÑ ¸¶Å©¾÷ ¾ð¾î·Î »ç¿ëµÇ°í ÀÖ´Ù. ¿©±â¿¡´Â ¼öÇÐÀûÀÎ µî½ÄÀ» Ç¥ÇöÇϱâ À§ÇÑ MathML, ¸ÖƼ¹Ìµð¾î¸¦ Ç¥ÇöÇϱâ À§ÇÑ Synchronized Multimedia Integration Language µîÀÌ ÀÖ´Ù.

SGML °ú XML Àº ¹®¼­ÀÇ ´Ù¾çÇÑ ±¸¼º¿ä¼ÒµéÀ» ±×µéÀÇ ±â´É°ú Àǹ̰ú ÇÔ²² ű×È­ÇÏ¿© Ç¥ÇöÇÑ´Ù. ¿¹¸¦ µé¾î ·¹Æ÷Æ®´Â ¿©·¯°¡Áö ºÎºÐÀ¸·Î ³ª´·¼öÀÖ´Ù. : ±×°ÍÀº Á¦¸ñ(title) °ú ÇѸíÀÌ»óÀÇ ÀÛ¼ºÀÚ(author), ¼­¹®(abstract), ½ÇÁ¦ ·¹Æ÷Æ®ÀÇ ³»¿ë, Âü°íÀÚ·á ¸ñ·Ï µîÀ¸·Î ³ª´­¼ö ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ·¹Æ÷Æ®¸¦ ÀÛ¼ºÇϱâ À§ÇÑ ¸¶Å©¾÷ ¾ð¾î´Â, ±× ³»¿ëÀÌ ¼­¹®ÀÎÁö, Á¦¸ñÀÎÁöµîÀ» °¡¸®Å³¼öÀִ ű׸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î¼­, ¾î¶»°Ô ¹®¼­°¡ ½ÇÁ¦ÀûÀ¸·Î Ãâ·ÂµÉÁö¿¡ ´ëÇÑ ¹°¸®ÀûÀÎ ¼¼ºÎ±â¼ú¿¡ È¥µ¿À» ÁÖÁö ¾ÊÀ»°ÍÀÌ´Ù. ¼­¹®Àº ¹®¼­ÀÇ ´Ù¸¥ ºÎºÐº¸´Ù ÀÛÀº ÆùÆ®¿Í Á¼Àº ÆøÀÇ ¿©¹éÀ¸·Î Ãâ·ÂµÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ±×·¯³ª ¸¶Å©¾÷Àº º¸Åë ÀÌ·¸°Ô ÀÚ¼¼ÇÑ ¼¼ºÎ±â¼úÀ» ÇÏÁö´Â ¾Ê´Â´Ù.; ´Ù¸¥ ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© ¸¶Å©¾÷ ¾ð¾î¸¦ TEX ¿Í °°Àº ½ÄÀÚ¾ð¾î·Î º¯È¯ÇÒ ¼ö ÀÖÀ»°ÍÀÌ°í, Á¤±³ÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖÀ»°ÍÀÌ´Ù.

XML Àº HTML °ú ¸Å¿ì Èí»çÇÑ ¸ð¾çÀ» °®´Â´Ù; ¹®¼­´Â ÇÏÀ§¿ä¼Ò¸¦ Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¿ä¼Ò(element)·Î ±¸¼ºµÈ´Ù. ±×¸®°í ±× ÇÏÀ§¿ä¼ÒµéÀº ±×µé ÀÚ½ÅÀÇ ³»¿ëÀ¸·Î ¶Ç ÇÏÀ§¿ä¼ÒµéÀ» °¡Áú ¼ö ÀÖ´Ù. ¿ä¼Ò´Â ¹®Àå¾È¿¡¼­ < > ¾È¿¡ Á¸ÀçÇϴ ű׷ΠǥÇöµÈ´Ù. ¿ä¼Ò¿¡´Â µÎ°¡Áö Ç¥Çö ¹æ¹ýÀÌ ÀÖ´Ù. ±×Áß Çϳª´Â <name>Euryale</name> ¿Í °°ÀÌ ½ÃÀÛÅÂ±×¿Í ¸¶Ä§Å±װ¡ Á¸ÀçÇϴ°ÍÀÌ´Ù. ÀÌ°ÍÀº "Euryale" ³»¿ë(content)À» °®´Â name ¿ä¼Ò¸¦ ³ªÅ¸³½´Ù. ÀÌ·¯ÇÑ ³»¿ë¿¡´Â ÀϹÝÀûÀÎ ÅؽºÆ® µ¥ÀÌÅÍ, XML ¿ä¼Ò, ¶Ç´Â ÀÌ µÎ°¡Áö°¡ È¥ÇÕµÇ¾î ³ªÅ¸³¯ ¼ö ÀÖ´Ù. ¿ä¼Ò´Â ¶ÇÇÑ ¾Æ¹«·± ³»¿ëµµ °¡ÁöÁö ¾Ê´Â °ø¹éÀϼöµµ ÀÖ´Ù. ÀÌ·¯ÇÑ ¶§¿¡´Â <stop/> °ú °°ÀÌ ½½·¡½¬·Î ³¡³ª´Â ÇϳªÀÇ Å±׷ΠǥÇöµÈ´Ù. HTML °ú´Â ´Þ¸® XML Àº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÑ´Ù. ±×·¯¹Ç·Î stop °ú Stop Àº ¼­·Î ´Ù¸¥ µÎ°³ÀÇ ¿ä¼Ò·Î ÀνĵȴÙ.

½ÃÀÛÅÂ±×¿Í °ø¹éű״Â, ±× ¿ä¼Ò¿Í ÇÔ²²Çϴ ƯÁ¤°ªÀ» °®´Â ¼Ó¼º(attribute)À» °¡Áú ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î <name lang='greek'>Herakles</name> Àº ±× °ªÀÌ "greek" ÀÎ lang ¼Ó¼ºÀ» °®´Â name ¿ä¼Ò¸¦ ³ªÅ¸³½´Ù. ÀÌ°ÍÀº ¼Ó¼º°ªÀÌ 'latin' ÀÎ <name lang='latin'>Hercules</name> °ú ºñ±³µÉ ¼ö ÀÖÀ»°ÍÀÌ´Ù.

XML ¾ð¾î´Â DTD (Document Type Definition) ·Î Á¤ÀǵȴÙ. DTD ´Â ¿ä¼Ò°¡ °¡Áú ¼ö ÀÖ´Â À̸§°ú, ¾î¶² ¿ä¼Ò°¡ ¼­·Î ÁßøµÉ¼ö Àִ°¡µîÀ» Á¤ÀÇÇØÁØ´Ù. DTD ´Â ¶ÇÇÑ °¢ ¿ä¼Ò¿¡ ³ªÅ¸³¯¼öÀÖ´Â ¼Ó¼º°ú ±× ±âº»°ª, ±×¸®°í ±× °ªÀÌ »ý·«ÇÒ ¼ö ÀÖ´Â °ªÀÎÁö µî¿¡ ´ëÇØ Á¤ÀÇÇÑ´Ù. HTML À» ¿¹·Î µé¸é, LI ¿ä¼Ò´Â ¸®½ºÆ®ÀÇ ¸ñ·ÏÀ» Ç¥ÇöÇÒ ¶§ »ç¿ëµÇ¾îÁö´Âµ¥, ¸®½ºÆ®¸¦ Ç¥ÇöÇÏ´Â OL ¶Ç´Â UL ¿ä¼Ò¾È¿¡¼­¸¸ »ç¿ëÇؾßÇÑ´Ù. ÀûÇÕÇÑ Æļ­´Â DTD ¿Í ¹®¼­¸¦ ³Ñ°Ü¹Þ¾Æ, ±× ¹®¼­°¡ DTD ÀÇ ¹ýÄ¢¿¡ Àß ¸Â´ÂÁö¸¦ °ËÁõÇØÁְųª, Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ¹ýÄ¢¿¡ À§¹èµÇ¾ú´Ù´Â °ÍÀ» °áÁ¤ÇØÁÖ°Ô µÈ´Ù.

XML À» ó¸®Çϱâ À§ÇÑ ¾îÇø®ÄÉÀ̼ÇÀº µÎ°¡Áö ŸÀÔÀ¸·Î ±¸ºÐµÇ¾îÁú ¼ö ÀÖ´Ù. °¡Àå °£´ÜÇÑ ºÎ·ù´Â ƯÁ¤ÇÑ ÇϳªÀÇ ¸¶Å©¾÷ ¾ð¾î¸¦ Á¶ÀÛÇϱâ À§ÇÑ ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù. ¿¹¸¦ µé¾î, È­Çаü·Ã ÇÁ·Î±×·¥Àº MathML ÀÌ ¾Æ´Ñ, È­ÇÐ ¸¶Å©¾÷ ¾ð¾î¸¸À» ó¸®Çϱ⸦ ¿øÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¾îÇø®ÄÉÀ̼ÇÀº ÇϳªÀÇ DTD ·Î ¸í¼¼È­ ÇÒ¼ö ÀÖÀ¸¸ç, ¿©·¯Á¾·ùÀÇ ¸¶Å©¾÷ ¾ð¾î¸¦ Çڵ鸵Çϱâ À§ÇÑ ´É·ÂÀº ÇÊ¿ä¾øÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ºÎ·ù´Â ÀÛ¼ºÇϱⰡ ½¬¿ì¸ç, ÀÌ¿ë°¡´ÉÇÑ ÆÄÀ̽㠼ÒÇÁÆ®¿þ¾î·Î ±¸ÇöÇϱⰡ ½¬¿îÆíÀÌ´Ù.

µÎ¹ø° ºÎ·ù´Â Á» ´õ ¹ü¿ëÀûÀ̸ç, ¾î¶°ÇÑ ¸¶Å©¾÷ ¾ð¾î¿¡ ´ëÇؼ­µµ Çڵ鸵ÀÌ °¡´ÉÇÑ °ÍÀÌ´Ù. ¼±ÅÃµÈ DTD ¸¦ µû¸£´Â XML À» ÀÛ¼ºÇϵµ·Ï µµ¿ÍÁÖ´Â '½º¸¶Æ® XML ¿¡µðÅÍ' °°Àº ÇÁ·Î±×·¥À» ¿¹·Î µé¾îº¸ÀÚ. ÀÌ°ÍÀº Çã¿ëµÇÁö ¾Ê´Â ¿ä¼Ò¸¦ ÀÔ·ÂÇϴ°ÍÀ» ¸·¾ÆÁÖ¾î¾ß ÇÒ°ÍÀÌ°í, Ä¿¼­À§Ä¡¿¡ ³õÀϼö ÀÖ´Â ÀûÀýÇÑ ¿ä¼ÒµéÀ» Á¦¾ÈÇÒ ¼ö ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¾îÇø®ÄÉÀ̼ÇÀº ¾î¶°ÇÑ °¡´ÉÇÑ XML ±â¹ÝÀÇ ¸¶Å©¾÷µµ Çڵ鸵 °¡´ÉÇØ¾ß Çϸç, ±×·¯±â À§Çؼ­´Â, »ç¿ëµÇ´Â DTD ¸¦ Æ÷ÇÔÇÏ´Â µ¥ÀÌÅÍ ±¸Á¶¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. XXX ÀÌ·¯ÇÑ ÇüÅÂÀÇ ¾îÇø®ÄÉÀ̼ÇÀº ÇöÀç·Î¼± ÆÄÀ̽ãÀ¸·Î ±¸ÇöÇϱâ´Â ¾î·Á¿î »óȲÀÌ´Ù. (XXX DTD ¸ðµâÀÌ Ãß°¡µÇ±â¸¦ ÁöÄѺÁ¾ß ÇÒ°ÍÀÌ´Ù...)

XML ÀÇ ¹®¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ÀÚ·á´Â, http://www.w3.org/TR/xml-spec.html ¿¡¼­ XML 1.0 ¸í¼¼¼­¸¦ º¼ ¼ö ÀÖÀ»°ÍÀÌ´Ù. ¸ðµç ¸í¼¼¼­¿Í ¸¶Âù°¡Áö·Î, ÀÌ°ÍÀº ¸Å¿ì Çü½ÄÀûÀ̸ç, XML À» ½ÃÀÛÇϰųª ¹è¿ì±â À§ÇØ º¸±â¿¡´Â ÀûÇÕÇÏÁö°¡ ¾Ê´Ù. Ç¥ÁØ¿¡ ÁÖ¼®ÀÌ ºÙÀº ¹öÀüÀÎ http://www.xml.com/xml/pub/axml/axmlintro.html ÀÌ ´õ ÀÌÇØÇϱ⠽¬¿ï°ÍÀÌ´Ù. ¶ÇÇÑ ¿©±â¿¡´Â XML À» ½ÃÀÛÇÏ·Á´Â »ç¶÷¿¡°Ô ÀûÇÕÇÑ Æ©Å丮¾óµîÀÇ ´Ù¾çÇÑ ¹®¼­µéµµ ÀÖ´Ù.

ÀÌ HOWTO ÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­´Â, ÀÌ¹Ì ÀûÀýÇÑ Àü¹®¿ë¾î¿¡ Àͼ÷ÇÏ´Ù°í »ý°¢ÇÒ°ÍÀ̸ç, ´ëºÎºÐÀÇ ¼½¼Ç¿¡¼­ ¿ä¼Ò(element) ¿Í ¼Ó¼º(attribute) µîÀÇ XML ¿ë¾îµéÀ» »ç¿ëÇÒ °ÍÀÌ´Ù. ¹®¼­ °´Ã¼ ¸ðµ¨À» ´Ù·ç´Â ¼½¼Ç 4¿¡¼­´Â, ´ç½ÅÀÌ °ü·Ã ¹®¼­µéÀ» ÀоîºÃÀ¸¸ç, ³ëµå(Node) µî°ú °°Àº °Í¿¡ Ä£¼÷ÇÏ´Ù°í °¡Á¤ÇÒ°ÍÀÌ´Ù. ±×·¯³ª ¼½¼Ç 3À» À§ÇØ Æ¯º°È÷ Java SAX µµ±¸¿¡ ´ëÇÑ °æÇèÀ» ¿ä±¸ÇÏÁö´Â ¾Ê´Â´Ù.


2. XML Toolkit ÀÇ ¼³Ä¡

Windows »ç¿ëÀÚ´Â http://sourceforge.net/projects/pyxml ¿¡¼­ ÆÐÅ°Áö¸¦, Mac »ç¿ëÀÚ´Â XXX ¿¡¼­ ÆÐÅ°Áö¸¦ ãÀ»¼öÀÖ´Ù. Linux »ç¿ëÀÚ´Â µ¥ºñ¾È¸¦ »ç¿ëÇÑ´Ù¸é XXX ¿¡¼­, RPM À» »ç¿ëÇÑ´Ù¸é http://sourceforge.net/projects/pyxml ¿¡¼­ ´Ù¿î¹ÞÀ» ¼ö ÀÖÀ»°ÍÀÌ´Ù. Unix Ç÷§Æû»ó¿¡¼­ ¼Ò½º¸¦ ÄÄÆÄÀÏ Çϱâ À§Çؼ­´Â ´ÙÀ½ÀÇ ¼³Ä¡¼ø¼­¸¦ µû¶óÇÏ¸é µÉ°ÍÀÌ´Ù.

  1. ¸¸ÀÏ Python 1.5 ¹öÀüÀ» »ç¿ëÇÑ´Ù¸é, ¸ÕÀú distutils À» ¼³Ä¡ÇؾßÇÑ´Ù. ÀÌ°ÍÀº http://www.python.org/sigs/distutils-sig¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. Python 1.6 ÀÌÈÄÀÇ ¹öÀü¿¡¼­´Â distutils ÀÌ Æ÷ÇԵǾî ÀÖÀ¸¹Ç·Î, ÀÌ ´Ü°è´Â °Ç³Ê¶Ù¾îµµ µÈ´Ù.

  2. http://sourceforge.net/projects/pyxml¿¡¼­ ¼Ò½º¸¦ ´Ù¿î¹Þ¾Æ ´ÙÀ½°ú °°ÀÌ ¾ÐÃàÀ» Ǭ´Ù.

    
   gzip -dc xml-package.tgz | tar -xvf -

  3. ´ÙÀ½À» ½ÇÇàÇÑ´Ù.:

    
   python setup.py install

    ÀÌ ¸í·ÉÀ» ½ÇÇàÇϱâ À§Çؼ­´Â, ÀûÀýÇÑ C ÄÄÆÄÀÏ·¯°¡ ÇÊ¿äÇϸç, Unix ½Ã½ºÅÛ¿¡¼­ ½´ÆÛÀ¯ÀúÀÇ ±ÇÇÑÀ¸·Î À̸¦ ½ÇÇàÇÏ¿©¾ß ÇÒ°ÍÀÌ´Ù. setup.py ´Â ¸î°¡Áö ¼­·Î´Ù¸¥ ¸í·É°ú ¿É¼ÇÀ» Á¦°øÇϴµ¥, ÀÌ¿¡ ´ëÇؼ­´Â ¾Æ¹«·± ¿É¼Ç¾øÀÌ setup.py ¸¦ ½ÇÇàÇÏ¸é µµ¿ò¸»ÀÌ ³ª¿Ã°ÍÀÌ´Ù.

¸¸ÀÏ ¼³Ä¡¿¡ ¾î·Á¿òÀÌ ÀÖ´Ù¸é, <xml-sig@python.org>·Î ¹®Á¦¸¦ Àû¾î º¸³»Áֱ⠹ٶõ´Ù. ¶Ç´Â http://sourceforget.net/projects/pyxml·Î ¹ö±×¸®Æ÷ÆÃÀ» ÇØÁ־ µÈ´Ù.

¹èÆ÷µÇ´Â ¼Ò½ºÀÇ demo/ µð·ºÅ丮¿¡ ¸¹Àº µ¥¸ð ÇÁ·Î±×·¥µéÀÌ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥µéÀ» ÅëÇØ, XML Åø·Î °¡´ÉÇÑ ÀÏÀÌ ¹«¾ùÀÎÁö »ìÆ캸°Å³ª, ¿¹Á¦ ¼Ò½ºµéÀ» ¾òÀ» ¼ö ÀÖÀ»°ÍÀÌ´Ù.


2.1. °ü·Ã ȨÆäÀÌÁö

http://www.python.org/topics/xml/

ÆÄÀ̽ãÀÇ XML ÅäÇÈÀ¸·Î ¸ðµç ¼ÒÇÁÆ®¿þ¾î, ¸ÞÀϸµ ¸®½ºÆ®, ¹®¼­µîÀÇ ¾÷µ¥ÀÌÆ®µéÀ» »ìÆ캼 ¼ö ÀÖÀ»°ÍÀÌ´Ù.


3. SAX: The Simple API for XML

SAX ´Â xml-dev ¸ÞÀϸµ ¸®½ºÆ®¸¦ ÅëÇÑ ¸¹Àº »ç¶÷µéÀÇ Á¶¾ðÀ» ÅëÇØ, David Megginson ÀÌ °³¹ßÇÏ¿´´Ù. SAX ´Â XML ÀÇ ÆĽ̿¡ ´ëÇØ À̺¥Æ®-±¸µ¿(event-driven) ÀÎÅÍÆäÀ̽º¸¦ °®´Â´Ù. SAX ¸¦ »ç¿ëÇϱâ À§Çؼ­, ÀûÀýÇÑ ÀÎÅÍÆäÀ̽º°¡ ¼±¾ðµÈ ÆÄÀ̽ã Ŭ·¡½º ÀνºÅϽº¸¦ Çϳª »ý¼ºÇÏ°í, ÀÌ ¿ÀºêÁ§Æ®ÀÇ ÀûÀýÇÑ ¸Þ½îµå¸¦ È£ÃâÇÔÀ¸·Î¼­ ÆĽÌÀ» ÇÏ°Ô µÈ´Ù.

ÀÌÀü ¹öÀüÀÇ ¹®¼­¿¡¼­´Â SAX1 À» ¼³¸íÇÏ¿´Áö¸¸, À̹ø ÇÏ¿ìÅõ¿¡¼­´Â SAX ¹öÀü 2 (SAX2) ¸¦ °¡Áö°í ¼³¸íÀ» ÇÑ´Ù.

SAX ´Â óÀ½ºÎÅÍ ³¡±îÁö ±¸¼ºµÈ XML ¹®¼­¸¦ Àоîµé¿©, ´Ù¸¥ ¹®¼­·Î º¯È¯ÇϱâÀ§ÇØ ¿¬»êÇϰųª, ±× ¹®¼­ÀÇ Á¤º¸µéÀ» Á¤¸®ÇÏ´Â (¿¹¸¦µé¾î ƯÁ¤ ¿ä¼ÒÀÇ Æò±Õ°ªµîÀ» °è»êÇÏ´Â ÀÛ¾÷) µî¿¡ ÀûÇÕÇÏ´Ù. ±×·¯³ª, °£´ÜÇÑ ¿ä¼ÒÀÇ ³»¿ëÀ̳ª ¼Ó¼ºÀ» ´Ù¸¥°ªÀ¸·Î ¹Ù²Ù´Â µîÀÇ °£´ÜÇÑ ¸ñÀû¿¡ »ç¿ëµÉ¼ö´Â À־, ÁßøµÈ ¾î¶°ÇÑ ¿ä¼ÒµéÀ» ±³È¯ÇÑ´Ù´øÁö ÇÏ´Â º¹ÀâÇÑ ¿¬»êµîÀÇ ¹®¼­±¸Á¶ º¯È¯¿¡´Â ÀûÇÕÇÏÁö ¾Ê´Ù. ¿¹¸¦ µé¾î, SAX ¸¦ »ç¿ëÇÏ¿© ¼Ó¼º°ªÀÌ 'greek'ÀÎ ¾î¶² ¿ä¼ÒÀÇ ³»¿ëÀ» Greek ¹®ÀÚ·Î º¯È¯ÇÏ´Â µîÀÇ ÀÛ¾÷¿¡´Â ÀûÇÕÇÏÁö¸¸, Àüü Ã¥ÀÇ Ã©Å͸¦ Àç¹èÄ¡ÇÑ´Ù´Â µîÀÇ ÀÛ¾÷Àº ÀûÇÕÇÏÁö ¾Ê´Ù.

SAX ÀÇ ÀåÁ¡Àº ¼Óµµ¿Í ´Ü¼øÇÔ¿¡ ÀÖ´Ù. ¸¸È­Ã¥µéÀ» ³ª¿­Çϱâ À§ÇÑ DTD °¡ Á¤ÀǵǾî ÀÖ´Ù°í °¡Á¤ÇÏ°í, ´ç½ÅÀÌ ´ç½ÅÀÌ ¼ÒÀåÇÏ°í ÀÖ´Â ¸¸È­Ã¥Áß¿¡¼­ ÀúÀÚ(writer)°¡ Neil Gaiman ÀÎ ¸ðµç°ÍÀ» ãÀ¸·Á ÇÑ´Ù°í ÇÏÀÚ. ÀÌ·¯ÇÑ Æ¯Á¤ÇÑ ÀÏ¿¡ ´ëÇؼ­, °Ë»ö¿¡ °ü·ÃÀÌ ¾ø´Â ¹Ì¼ú°¡(artist)³ª ÆíÁýÀÚ(editor), ä»ö°¡(colourist) µîÀÇ ¿ä¼Ò¿¡ ´ëÇÑ ¼³¸íÀ» È®ÀåÇÒ ÇÊ¿ä´Â ¾ø´Ù. ±×·¯¹Ç·Î ÀÌ·²¶§¿¡´Â ¿ä¼ÒÁß ÀúÀÚ(writer)¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ¿ä¼Ò´Â ¹«½ÃÇϵµ·Ï Ŭ·¡½º ÀνºÅϽº¸¦ ÀÛ¼ºÇÏ¸é µÈ´Ù.

¶Ç´Ù¸¥ ÀÌÁ¡Àº, ƯÁ¤½ÃÁ¡¿¡ ÀÖ¾î ¸ðµç ¹®¼­ÀÇ ³»¿ëÀ» ¸Þ¸ð¸®¿¡ ¿Ã¸®Áö ¾Ê¾Æµµ µÈ´Ù´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº ¸Å¿ì Å« ¹®¼­¸¦ ó¸®ÇÒ¶§ ¸Å¿ì À¯¿ëÇÒ°ÍÀÌ´Ù.

SAX ´Â 4°³ÀÇ ±âº»ÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ´Ù. SAX ¸¦ µû¸£´Â Æļ­´Â µ¥ÀÌÅ͸¦ ó¸®Çϱâ À§ÇØ ´Ù¾çÇÑ ¸Þ½îµå¸¦ È£ÃâÇϸç, ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÏ´Â ¾î¶°ÇÑ ¿ÀºêÁ§Æ®µµ ³Ñ°Ü¹ÞÀ» ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î, ´ç½ÅÀÇ ÀÛ¾÷¿¡ ´ç½ÅÀÇ ¾îÇø®ÄÉÀ̼ǰú °ü·ÃµÈ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ¸é µÉ°ÍÀÌ´Ù.

SAX ÀÎÅÍÆäÀ̽º´Â ´ÙÀ½°ú °°´Ù.:

Interface Purpose
ContentHandler ÀÌ ÀÎÅÍÆäÀ̽º´Â SAX ÀÇ ÇÙ½ÉÀ¸·Î, ÀϹÝÀûÀÎ ¹®¼­ À̺¥Æ®¸¦ À§ÇÑ È£ÃâÀÌ´Ù. ÀÌ ¸Þ½îµå´Â ¹®¼­ÀÇ ½ÃÀÛ, ¿ä¼ÒÀÇ ½ÃÀÛ°ú ³¡, ¿ä¼Ò°¡ Æ÷ÇÔÇÏ´Â ³»¿ëÀÇ ¹®ÀÚ¸¦ ¸¸³¯¶§ È£ÃâÀ» ÇÑ´Ù.
DTDHandler ±âº»ÀûÀÎ ÆĽ̿¡ ÀÖ¾î ¿ä±¸µÇ´Â DTD À̺¥Æ®¸¦ Çڵ鸵Çϱâ À§ÇØ È£ÃâµÈ´Ù. Áï Ç¥±â¹ý(XML spec section 4.7)°ú ÆĽ̵ÇÁö ¾Ê´Â ¿£Æ¼Æ¼(entity) ¼±¾ð(XML spec section 4)À»¸¸³­¶§ È£ÃâÀ» ÇÑ´Ù.
EntityResolver ¿ÜºÎ ¿£Æ¼Æ¼¸¦ ÂüÁ¶Çϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù.¸¸ÀÏ ¹®¼­¿¡ ¿ÜºÎ ¿£Æ¼Æ¼ ÂüÁ¶°¡ ¾ø´Ù¸é, ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ½ÇÇàÇÒ ÇÊ¿ä°¡ ¾øÀ»°ÍÀÌ´Ù.
ErrorHandler ¿¡·¯¸¦ ó¸®Çϱâ À§ÇØ È£ÃâÇÑ´Ù.Æļ­´Â ¸ðµç °æ°í¿Í ¿¡·¯¸¦ º¸°íÇϱâ À§ÇØ ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ¸Þ½îµå¸¦ È£ÃâÇÑ´Ù.

ÆÄÀ̽ãÀº ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ³»¿ëÀ» Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î À§ÀÇ ÀÎÅÍÆäÀ̽º´Â ÆÄÀ̽ã Ŭ·¡½º·Î ÀçÁ¤ÀÇ µÇ¾î¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¸Þ½îµå´Â ¾Æ¹«·± Àϵµ ÇÏÁö ¾Ê´Â´Ù.(¸Þ½îµåÀÇ ³»¿ëÀº ÆÄÀ̽ãÀÇ pass ¸í·ÉÀ¸·Î µÇ¾îÀÖ´Ù.) ±×·¯¹Ç·Î ¾îÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëÇÏÁö ¾Ê´Â ¸Þ½îµå¿¡ ´ëÇؼ­´Â ´Ü¼øÈ÷ ¹«½ÃÇØ ¹ö¸®¸é µÈ´Ù.

¿©±â SAX ¸¦ »ç¿ëÇÏ´Â ½´µµÄÚµåÀÇ ¿¹°¡ ÀÖ´Ù :

   
   # Çڵ鷯 Ŭ·¡½ºÀÇ Á¤ÀÇ
   from xml.sax import Contenthandler, ...
   class docHandler(ContentHandler):
       ...

   # Çڵ鷯 Ŭ·¡½ºÀÇ ÀνºÅϽº »ý¼º
   dh = docHandler()

   # XML parser »ý¼º
   parser = ...

   # Æļ­¿¡ Çڵ鷯 ÀνºÅϽº¸¦ ÁöÁ¤
   parser.setContentHandler(dh)

   # ÆÄÀÏ ÆĽÌ; Çڵ鷯 ¸Þ¼Òµå°¡ È£ÃâµÉ°ÍÀÌ´Ù.
   parser.parse(sys.stdin)


3.1. Starting Out

¸¸È­Ã¥µé¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÏ´Â °£´ÜÇÑ XML Æ÷¸Ë¿¡ ´ëÇØ »ý°¢Çغ¸ÀÚ. Çѱǿ¡ ´ëÇÑ °£´ÜÇÑ ¹®¼­°¡ ¿©±â ÀÖ´Ù. :

   
   <collection>
     <comic title="Sandman" number='62'>
       <writer>Neil Gaiman</writer>
       <penciller pages='1-9,18-24'>Glyn Dillon</penciller>
       <penciller pages="10-17">Charles Vess</penciller>
     </comic>
   </collection>

XML ¹®¼­´Â ¹Ýµå½Ã ÇϳªÀÇ ÃÖ»óÀ§ ¿ä¼Ò¸¦ °¡Áö°í ÀÖ¾î¾ßÇÑ´Ù. ¿©±â¼­´Â "collection" ÀÌ ÃÖ»óÀ§ ¿ä¼ÒÀÌ´Ù. ÀÌ°ÍÀº ÇϳªÀÇ ÀÚ½Ä ¿ä¼ÒÀÎ comic À» °®´Â´Ù. comic ¿ä¼ÒÀÇ ¼Ó¼ºÀ¸·Î Ã¥ÀÇ Á¦¸ñ(title)°ú ¹øÈ£(number)°¡ ÁÖ¾îÁ³À¸¸ç, ÀúÀÚ(writer)¿Í ¹Ì¼ú°¡(artist)¿¡ ´ëÇØ Çϳª ¶Ç´Â ±×ÀÌ»óÀÇ ÀÚ½ÄÀ» °¡Áö°í ÀÖ´Ù. ÇϳªÀÇ °£Ç๰(issue)¿¡ ´ëÇØ ¿©·¯¸íÀÇ ¹Ì¼ú°¡(artist) ³ª ÀúÀÚ(writer)°¡ ÀÖÀ»¼ö ÀÖ´Ù.

°£´ÜÇÑ »óÅ·Π½ÃÀÛÀ» Çغ¸ÀÚ : FindIssue ¶ó À̸§ Áö¾îÁø ¹®¼­Çڵ鷯(document handler)´Â ÁÖ¾îÁø °£Ç๰ÀÌ Ä÷¢¼Ç ³»¿¡ ÀÖ´ÂÁö ã´ÂÀÏÀ» ÇÒ°ÍÀÌ´Ù.

   
   from xml.sax import saxutils

   class FindIssue(saxutils.DefaultHandler):
       def __init__(self, title, number):
           self.search_title, self.search_number = title, number

DefaultHandler Ŭ·¡½º´Â ³×°³ÀÇ ÀÎÅÍÆäÀ̽º - ContentHandler, DTDHandler, EntityResolver, ±×¸®°í ErrorHandler ¿¡¼­ »ó¼ÓÀ» ¹Þ´Â´Ù. ÀÌ°ÍÀº ¸ðµç°ÍÀ» ÇϳªÀÇ Å¬·¡½º ³»¿¡¼­ »ç¿ëÇÏ±æ ¿øÇÒ¶§ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ¸¸ÀÏ °¢°¢ÀÇ ¸ñÀû¿¡ µû¶ó Ŭ·¡½º¸¦ ³ª´©±æ ¿øÇϰųª, ÇϳªÀÇ ÀÎÅÍÆäÀ̽º¸¸À» ¼±¾ðÇÏ±æ ¿øÇÑ´Ù¸é, °¢ ÀÎÅÍÆäÀ̽º¿¡ µû¶ó °¢°¢ ¼­ºêŬ·¡½º¸¦ ¸¸µé¼ö ÀÖ´Ù. ÀÌÁß¿¡ ¾î´À ¹æ¹ýÀÌ ´õ ÁÁ´Ù°í ÇÒ¼ö´Â ¾øÀ¸¸ç, ¹«¾ùÀ» ÇÒ°ÍÀΰ¡¿¡ µû¶ó ÀûÀýÇÑ ¹æ¹ýÀ» ÅÃÇÏ¸é µÉ°ÍÀÌ´Ù.

Ŭ·¡½º°¡ °Ë»öÀ» Çϱâ À§Çؼ­, ÀνºÅϽº´Â ¹«¾ùÀ» °Ë»öÇÒ°ÍÀÎÁö¸¦ ¾Ë¾Æ¾ßÇÑ´Ù. ã±â¸¦ ¿øÇÏ´Â title °ú ¹ßÇ๰ ¹øÈ£´Â FindIssue »ý¼ºÀÚ¿¡°Ô °Ç³»Áö°í, ÀνºÅϽºÀÇ ÀϺηΠÀúÀåµÉ°ÍÀÌ´Ù.

ÀÚ ÀÌÁ¦ ½ÇÁ¦·Î µ¿ÀÛÀ» ÇÏ´Â ÇÔ¼ö¸¦ »ìÆ캸µµ·Ï ÇÏÀÚ. ÀÌ °£´ÜÇÑ ÀÛ¾÷Àº ´ÜÁö ÁÖ¾îÁø ¿ä¼ÒÀÇ ¼Ó¼ºÀ» »ìÆ캸´Â °ÍÀ̹ǷΠstartElement ¸Þ¼Òµå°¡ ÀûÇÕÇÒ °ÍÀÌ´Ù.

   
    def startElement(self, name, attrs):
        # comic ¿ä¼Ò°¡ ¾Æ´Ï¸é ¹«½ÃÇ϶ó.
        if name != 'comic': return

        # title °ú number ¼Ó¼º¿¡ ´ëÇØ °Ë»öÀ» ÇÑ´Ù.
        title = attrs.get('title', None)
        number = attrs.get('number', None)
        if title == self.search_title and number == self.search_number:
            print title, '#'+str(number), 'found'
startElement() ¸Þ½îµå¿¡´Â ÁÖ¾îÁø ¿ä¼ÒÀÇ À̸§°ú ±× ¿ä¼ÒÀÇ ¼Ó¼ºÀ» °®´Â ÀνºÅϽº°¡ ÀüÇØÁø´Ù. ¸¶Áö¸· AttributeList ÀÎÅÍÆäÀ̽º´Â ÆÄÀ̽㠻çÀüÇüÀÌ´Ù. ±×·¯¹Ç·Î ÇÔ¼ö´Â ¸ÕÀú comic ¿ä¼ÒÀÎÁö È®ÀÎÇÏ°í, ƯÁ¤ title °ú number ¼Ó¼ºÀ» °Ë»öÇÏ°Ô µÈ´Ù. ºñ±³¿¡ ¼º°øÇÏ¸é ¸Þ¼¼Áö°¡ Ãâ·ÂµÈ´Ù.

startElement() ´Â ¹®¼­ÀÇ ¸ðµç ¿ä¼Ò¸¦ ¸¸³¯¶§¸¶´Ù È£ÃâµÈ´Ù. startElement() ÇÔ¼öÀÇ Ã³À½¿¡ 'Starting element:' ¸¦ Ãâ·ÂÇϵµ·Ï Äڵ带 Áý¾î³Ö´Â´Ù¸é, ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» º¸°Ô µÉ°ÍÀÌ´Ù.

   
   Starting element: collection
   Starting element: comic
   Starting element: writer
   Starting element: penciller
   Starting element: penciller

½ÇÁ¦ Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­, parser ¿Í FindIssue ÀνºÅϽº¸¦ »ý¼ºÇÏ°í À̵éÀ» ¿¬°áÇÏ°í, ÀԷ°ªÀ» ÆĽÌÇϵµ·Ï Æļ­¸¦ È£ÃâÇÏ´Â ÃÖ»óÀ§ Äڵ尡 ÇÊ¿äÇÏ´Ù.

   
   from xml.sax import make_parser
   from xml.sax.handler import feature_namespaces

   if __name__ == '__main__':
       # Æļ­ÀÇ »ý¼º
       parser = make_parser()
       # Æļ­¿¡°Ô XML À̸§¿µ¿ªÀº ¹«½ÃÇϵµ·Ï ÀüÇÑ´Ù.
       parser.setFeature(feature_namespaces, 0)

       # handler ÀÇ »ý¼º
       dh = FindIssue('Sandman', '62')

       # Æļ­¿¡ ¿ì¸®°¡ ¸¸µç Çڵ鷯¸¦ »ç¿ëÇϵµ·Ï ÀüÇÑ´Ù.
       parser.setContentHandler(dh)

       # ÀÔ·ÂÀ» ÆĽÌÇÑ´Ù.
       parser.parse(file)

make_parser Ŭ·¡½º´Â Æļ­¸¦ ¸¸µå´Â ÀÛ¾÷À» ÀÚµ¿À¸·Î ÇØÁØ´Ù. ÆÄÀ̽㿡´Â ÀÌ¹Ì ¿©·¯°¡Áö XML Æļ­°¡ Á¸ÀçÇϸç, ¾ÕÀ¸·Îµµ ¸¹Àº Æļ­°¡ Ãß°¡µÉ ¿¹Á¤ÀÌ´Ù. ÆÄÀ̽ã 1.5 ¹öÀü¿¡ ÀÖ´Â xmllib.py ´Â Ưº°È÷ ºü¸£Áö´Â ¾ÊÁö¸¸, ÇöÀçµµ »ç¿ë°¡´ÉÇÏ´Ù. xmllib.py ÀÇ ¼Óµµ¸¦ °³¼±ÇÑ ¹öÀüÀÌ xml.parsers ¿¡ Æ÷ÇԵǾîÀÖ´Ù. xml.parsers.expat ¸ðµâÀº Áö±Ý±îÁö´Â °¡Àå ºü¸£¸ç, °¡´ÉÇÏ´Ù¸é ÀÌ°ÍÀÌ ¼±ÅõȴÙ. make_parser ´Â ¾î¶² Æļ­°¡ »ç¿ë°¡´ÉÇÑÁö¸¦ °áÁ¤ÇÏ°í, °¡Àå ºü¸¥ Æļ­¸¦ ¼±ÅÃÇÑ´Ù. ±×·¯¹Ç·Î, °¢ Æļ­µéÀÌ ¾î¶»°Ô ´Ù¸¥Áö¿¡ ´ëÇؼ­´Â »ç¿ëÀÚ°¡ ¾Ë°í ÀÖ¾î¾ß ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. (make_parser ¿¡ ´ç½ÅÀÌ »ç¿ëÇϱ⸦ ¿øÇÏ´Â Æļ­ ¸®½ºÆ®¸¦ ¾Ë·ÁÁÙ¼öµµ ÀÖ´Ù.)

SAX2 ¿¡¼­ºÎÅÍ, XML À̸§¿µ¿ª(namespace)ÀÌ Áö¿øµÈ´Ù. ¸¸ÀÏ À̸§¿µ¿ª ÇÁ·Î¼¼½ÌÀÌ ¿¢Æ¼ºê µÇ¾îÀÖ´Ù¸é, startElement ´ë½Å startElementNS ÀÌ È£ÃâµÈ´Ù. content Çڵ鷯°¡ À̸§¿µ¿ª¿¡ ´ëÇÑ ¸Þ¼Òµå¸¦ Á¤ÀÇÇÏÁö ¾Ê¾Ò´Ù¸é, À̸§¿µ¿ª 󸮸¦ ÇÏÁö ¾Ê°Ú´Ù°í ¿ä±¸ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¼³Á¤ÀÇ ±âº»Àº Æļ­¿¡¼­ Æļ­·Î ¼öÁ¤À» °¡ÇÑ´Ù. ±×·¯¹Ç·Î ¾ÈÀüÇÑ °ªÀ¸·Î ¼³Á¤À» Çϴ°ÍÀÌ ÁÁ´Ù.

Æļ­ ÀνºÅϽº¸¦ »ý¼ºÇÑ ÈÄ, setContentHandler ¸¦ È£ÃâÇÏ¿© Æļ­¿¡°Ô »ç¿ëÇÒ Çڵ鷯¸¦ ³Ñ°ÜÁØ´Ù.

¿¹Á¦ XML ¹®¼­¸¦ À§ÀÇ Äڵ忡 ´ëÀÔÇϸé, Ãâ·ÂÀ¸·Î 'Sandman #62 found' °¡ ³ª¿Ã°ÍÀÌ´Ù.


3.2. Error Handling

ÀÌÁ¦ À§ÀÇ Äڵ忡 ¾Æ·¡ÀÇ ÆÄÀÏÀ» ÀÔ·ÂÀ¸·Î ³Ö¾îº¸ÀÚ:

   
   <collection>
     &foo;
     <comic title="Sandman" number='62'>
   </collection>

&foo; ¿£Æ¼Æ¼´Â ¾Ë·ÁÁöÁö ¾ÊÀº°ÍÀ̸ç, comic ¿ä¼Ò´Â ´ÝÈ÷Áö ¾Ê¾Ò´Ù. (¸¸ÀÏ ºó ³»¿ëÀ» °®´Â´Ù ÇÏ´õ¶óµµ ">" ·Î ´Ý±â Àü¿¡ "/" ¸¦ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.) ÀÌ·¯ÇÑ °á°ú·Î, SAXParseException ÀÌ ¹ß»ýÇÑ´Ù.

   
   xml.sax._exceptions.SAXParseException: undefined entity at None:2:2

ErrorHandler ÀÎÅÍÆäÀ̽ºÀÇ ±âº»ÄÚµå´Â ¾î¶°ÇÑ ¿¡·¯¿¡ ´ëÇؼ­µµ ÀÚµ¿ÀûÀ¸·Î ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ´Ù; ¸¸ÀÏ ÀÌ·¯ÇÑ ¿¡·¯Ã³¸®¸¦ ¿øÇÑ´Ù¸é, ¿¡·¯ Çڵ鷯¸¦ ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾øÀ»°ÍÀÌ´Ù. ¶ÇÇÑ, ÀÚ±â ÀڽŸ¸ÀÇ ErrorHandler ÀÎÅÍÆäÀ̽º³ª, error(), fatalError() ¿¡ ´ëÇÑ ÃÖ¼ÒÇÑÀÇ ¿À¹ö¶óÀ̵带 ¸¸µé¼öµµ ÀÖ´Ù. °¢ ¸Þ¼Òµå´Â ÃÖ¼Ò·Î ÇÑ ÁÙ Àϼöµµ ÀÖ´Ù. warning, error, fatalError ¿¡ ´ëÇÑ ErrorHandler ÀÎÅÍÆäÀ̽º ¸Þ½îµå´Â ¸ðµÎ ÇϳªÀÇ ÀÎÀÚ°ª - exception ÀνºÅϽº¸¦ °®´Â´Ù. exception Àº Ç×»ó SAXException ÀÇ ¼­ºêŬ·¡½ºÀ̸ç, str() ¸¦ ÀÌ¿ëÇÏ¿© ÀÐÀ»¼öÀÖ´Â ¹®Á¦Á¡À» ¼³¸íÇÏ´Â ¿¡·¯ ¸Þ¼¼Áö·Î ¸¸µé¼öÀÖ´Ù.

´ÙÀ½Àº, ¿©·¯°¡Áö ¿¡·¯¹ß»ý »óȲÀ» Àç¼³Á¤Çϱâ À§ÇØ, ¼¼°¡ÁöÁß ÇϳªÀÇ ¸Þ¼Òµå¸¦ ¿¹¿Ü¸¦ Ãâ·ÂÇϵµ·Ï Á¤ÀÇÇÏ¿´´Ù:

   
    def error(self, exception):
        import sys
        sys.stderr.write("\%s\n" \% exception)

ÀÌ Á¤ÀÇ¿¡ ÀÇÇϸé, Ä¡¸íÀûÀÌÁö ¾ÊÀº error ´Â ¿¡·¯ ¸Þ¼¼Áö¸¦ Ãâ·ÂÇÏ°Ô µÇÁö¸¸, Ä¡¸íÀûÀÎ ¿¡·¯(fatal error) ´Â Æ®·¹À̽º¹é(traceback)À» »ý¼ºÇÏ´Â ÀÏÀ» °è¼ÓÇÒ °ÍÀÌ´Ù.


3.3. Searching Element Content

ƯÁ¤ ÀúÀÚ(author) °¡ ¾´ ¸ðµç ¹ßÇ๰(issue) ¸¦ Ãâ·ÂÇÏ´Â, Á¶±Ý´õ º¹ÀâÇÑ ÀÛ¾÷À» Çغ¸ÀÚ. Let's tackle a slightly more complicated task, printing out all issues written by a certain author. ÀÌ°ÍÀº ÀúÀÚÀÇ À̸§ÀÌ <writer>Peter Milligan</writer> °ú °°ÀÌ writer ¿ä¼ÒÀÇ ³»ºÎ¿¡ Á¸ÀçÇϹǷÎ, ¿ä¼ÒÀÇ ³»¿ëÀ» °Ë»öÇؾßÇÑ´Ù.

ÀÌ·¯ÇÑ °Ë»öÀº ´ÙÀ½°ú °°Àº ¾Ë°í¸®ÁòÀ» µû¶ó 󸮵ȴÙ:

  1. startElement ¸Þ½îµå´Â Á¶±Ý´õ º¹ÀâÇÏ°Ô µÈ´Ù. comic ¿ä¼Ò¿¡ ´ëÇØ, °Ë»ö±âÁØ¿¡ ÀûÇÕÇÑ comic À» ³ªÁß¿¡ ã±âÀ§ÇØ, Çڵ鷯´Â title °ú number ¸¦ ÀúÀåÇÏ¿©¾ßÇÑ´Ù. writer ¿ä¼Ò¿¡ ´ëÇؼ­´Â, inWriterContent Ç÷¡±×¸¦ ÂüÀ¸·Î ¼³Á¤ÇÏ°í, writerName ¼Ó¼ºÀ» ºó ¹®ÀÚ¿­·Î ¼³Á¤ÇÑ´Ù.

  2. XML ű׹ÛÀÇ ¹®ÀÚµé(Characters)À» ó¸®ÇÏ¿©¾ß ÇÑ´Ù. inWriterContent °¡ ÂüÀ̸é, ÀÌ ¹®ÀÚµéÀ» writeName ¹®ÀÚ¿­¿¡ Ãß°¡ÇÑ´Ù.

  3. writer ¿ä¼Ò°¡ ³¡³ª¸é, writerName ¼Ó¼º¾ÈÀÇ ¸ðµç ¿ä¼ÒÀÇ ³»¿ëÀ» ¼öÁýÇÑ°ÍÀÌ µÈ´Ù. ±×·¯¹Ç·Î, ã°íÀÚÇÏ´Â name °ú µ¿ÀÏÇÑ°ÍÀÎÁö °Ë»çÇÏ°í, ¸¸ÀÏ ¸Â´Â´Ù¸é, ÀÌ comic ¿¡ ´ëÇÑ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. ´Ù½Ã inWriterContent ¸¦ °ÅÁþÀ¸·Î ¼³Á¤ÇÑ´Ù.

¿©±â¿¡ ù¹ø° ºÎºÐÀÇ Äڵ尡 ÀÖ´Ù.

   
   from xml.sax import ContentHandler

   def normalize_whitespace(text):
       "¹®ÀÚ¿­¿¡¼­ Áߺ¹ÀûÀ¸·Î ³ªÅ¸³ª´Â °ø¹é¹®ÀÚ(whitespace)¸¦ Á¦°ÅÇÑ´Ù."
       return ' '.join(text.split())

   class FindWriter(ContentHandler):
       def __init__(self, search_name):
           # ã°íÀÚ ÇÏ´Â À̸§À» ÀúÀåÇÑ´Ù.
           self.search_name = normalize_whitespace(search_name)

           # Ç÷¡±×¸¦ °ÅÁþ(false)À¸·Î ÃʱâÈ­ÇÑ´Ù.
           self.inWriterContent = 0

       def startElement(self, name, attrs):
           # comic ¿ä¼ÒÀ̸é, title °ú issue ¸¦ ÀúÀåÇÑ´Ù.
           if name == 'comic':
               title = normalize_whitespace(attrs.get('title', ""))
               number = normalize_whitespace(attrs.get('number', ""))
               self.this_title = title
               self.this_number = number

           # writer ¿ä¼ÒÀÇ ½ÃÀÛÀ̸é, Ç÷¡±×¸¦ ¼³Á¤ÇÑ´Ù.
           elif name == 'writer':
               self.inWriterContent = 1
               self.writerName = ""

startElement() ¸Þ¼Òµå¿¡ ´ëÇؼ­´Â ÀÌÀü¿¡ ¼³¸íÇÏ¿´´Ù. ÀÌÁ¦ ¿ä¼ÒÀÇ ³»¿ëÀ» ¾î¶»°Ô ó¸®ÇÏ´ÂÁö º¸ÀÚ.

normalize_whitespace() ÇÔ¼ö´Â ¸Å¿ì Áß¿äÇϹǷÎ, Äڵ峻¿¡ ÀÌ°ÍÀ» »ç¿ëÇÏ¿©¾ß ÇÑ´Ù. XML Àº °ø¹é¹®ÀÚ(whitespace) ¿¡ ¸Å¿ì ¹Î°¨ÇÏ´Ù; ´ç½ÅÀº ´ç½ÅÀÌ ¿øÇÏ´Â °÷¿¡ ¿©ºÐÀÇ °ø¹é°ú °³Ç๮ÀÚµéÀ» Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ¼Ó¼º°ªÀ̳ª ¿ä¼ÒÀÇ ³»¿ëÀ» ºñ±³Çϱâ Àü¿¡, °ø¹é¹®ÀÚ¸¦ Á¤»óÀûÀ¸·Î ¸¸µé¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù; ¸¸ÀÏ µÎ°³ÀÇ ¿ä¼ÒÀÇ ³»¿ëÀÌ ´Ù¸¥ ¼öÀÇ °ø¹é¹®ÀÚ¸¦ °®´Â´Ù¸é, ºñ±³¿¬»êÀº À߸øµÈ °á°ú¸¦ ¸¸µé¾î³¾ °ÍÀÌ´Ù.

   
    def characters(self, ch):
        if self.inWriterContent:
            self.writerName = self.writerName + ch

characters() ¸Þ½îµå´Â XML ű׹ÛÀÇ ¹®ÀÚµéÀ» ¸¸³¯¶§ È£ÃâµÈ´Ù. ch ´Â ¹®ÀÚµéÀÇ ½ºÆ®¸µÀÌÁö¸¸, ¹Ýµå½Ã ¹ÙÀÌÆ® ½ºÆ®¸µÀΰÍÀº ¾Æ´Ï´Ù; Æļ­´Â ¹®¼­ÀÇ ÀϺκÐÀÎ ¹öÆÛ ¿ÀºêÁ§Æ®¸¦ Á¦°øÇϰųª, À¯´ÏÄÚµå ¿ÀºêÁ§Æ®¸¦ °Ç³»ÁÖ°Ô µÈ´Ù(ÆÄÀ̽ã 2.0 ÀÇ expat Æļ­). parsers may also provide a buffer object that is a slice of the full document, or they may pass Unicode objects (as the expat parser does in Python 2.0).

¸ðµç ¹®ÀÚµéÀÌ ÇѹøÀÇ ÇÔ¼ö È£Ãâ·Î ó¸®µÈ´Ù°í °¡Á¤ÇÏÁö ¸»±â ¹Ù¶õ´Ù. À§ÀÇ ¿¹¸¦ µé¾îº¸¸é, "Peter Milligan" ¶ó´Â ¹®ÀÚ¿­¿¡ ´ëÇØ ÇѹøÀÇ characters() È£ÃâÀÌ Àְųª, ¶Ç´Â °¢ ¹®ÀÚ¿¡ ´ëÇØ Çѹø¾¿ characters() ÀÇ È£ÃâÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. ´õ¿í Çö½ÇÀûÀ¸·Î, ¸¸ÀÏ ³»¿ëÀÌ "Wagner &amp; Seagle" °ú °°ÀÌ ¿£Æ¼Æ¼ ÂüÁ¶¸¦ °¡Áö°í ÀÖ´Ù¸é, Æļ­´Â "Wagner ", ¿£Æ¼Æ¼ ÂüÁ¶¸¦ »ó¡ÇÏ´Â "&", ±×¸®°í " Seagle" ¿¡ ´ëÇØ °¢ ¼¼¹øÀÇ ¸Þ¼Òµå È£ÃâÀ» ÇÏ°Ô µÈ´Ù.

FindWriter ÀÇ µÎ¹ø° °úÁ¤¿¡¼­, characters() ´Â ´ÜÁö inWriterContent ¸¦ °Ë»çÇÏ°í, ÀÌ °ªÀÌ ÂüÀ̸é, ¹®ÀÚ¸¦ ¹®ÀÚ¿­¿¡ Ãß°¡ÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù.

¸¶Áö¸·À¸·Î, writer ¿ä¼Ò°¡ ³¡³¯¶§, Àüü À̸§ÀÌ ¼öÁýµÉ°ÍÀÌ°í, ÀÌ°ÍÀ» ¿ì¸®°¡ ã°íÀÚÇÏ´Â À̸§°ú ºñ±³ÇÏ°Ô µÈ´Ù.

   
    def endElement(self, name):
        if name == 'writer':
            self.inWriterContent = 0
            self.writerName = normalize_whitespace(self.writerName)
            if self.search_name == self.writerName:
                print 'Found:', self.this_title, self.this_number

´Ù¸¥ °ø¹é¹®ÀÚ¼ö¿¡ ÀÇÇÑ È¥µ¿À» ¸·±âÀ§ÇØ, normalize_whitespace() ÇÔ¼ö°¡ È£ÃâµÇ¾ú´Ù. ÀÌ°ÍÀº ÀÌ DTD ³»¿¡¼­´Â, ÀÌ ¿ä¼Ò°¡ °¡Áö°í ÀÖ´Â °ø¹é¹®ÀÚ°¡ Áß¿äÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

¸¶Ä§ ű×(End tags)´Â ¼Ó¼ºÀ» °¡Áú¼ö ¾øÀ¸¹Ç·Î, ¿©±â¿¡´Â attrs ÀÎÀÚ°¡ ¾ø´Ù. "<arc name="Season of Mists"/>" ¿Í °°ÀÌ ¼Ó¼ºÀ» °®´Â ºó ű״Â, startElement() ¸¦ È£ÃâÇÑ ÈÄ ¹Ù·Î endElement() ¸¦ È£ÃâÇÑ´Ù.

XXX ¿ÜºÎ ¿£Æ¼Æ¼ 󸮴 ¾î¶»°Ô ÇÒ°ÍÀΰ¡? ±×µé¿¡ ´ëÇÑ Ã³¸®°¡ Ưº°È÷ ÇÊ¿äÇÑ°¡?


3.4. °ü·Ã ȨÆäÀÌÁö

http://www.megginson.com/SAX/

SAX ȨÆäÀÌÁö´Ù. ¿©±â¿¡´Â °¡Àå ÃÖ½ÅÀÇ ¸í¼¼¼­¿Í ´Ù¾çÇÑ ¾ð¾î¿Í Ç÷§Æû»óÀÇ SAX µµ±¸ ¸®½ºÆ®°¡ ÀÖ´Ù. ÇöÀç´Â ÀÚ¹Ù Áß½ÉÀûÀ¸·Î µÇ¾îÀÖ´Ù.


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 ÀÎÅÍÆäÀ̽º¿¡¸¸ °ü½ÉÀÌ ÀÖ´õ¶óµµ ÀÐÀ»¼öÀÖ°Ô µÇ¾îÀÖ´Ù.


5. ¿ë¾îÇؼ³

XML Àº ¸¹Àº ¿ë¾îµéÀ» °¡Áö°í ÀÖ´Ù. À̹øÀå¿¡¼­´Â ±×Áß¿¡¼­ Áß¿äÇÑ ¿ë¾î¿Í ±×¿¡ °ü·ÃµÈ ³»¿ëÀ» ¼³¸íÇϵµ·Ï ÇÑ´Ù.

¿©±â¿¡ ³ª¿Â Á¤ÀǵéÀº Lars Marius Garshol ÀÇ SGML ¿ë¾îÇؼ³ (http://www.stud.ifi.uio.no/&#126;larsga/download/diverse/sgmlglos.html) ¿¡¼­ Âü°íÇÏ¿´´Ù.

  • DOM (Document Object Model)

    ¹®¼­ ¿ÀºêÁ§Æ® ¸ðµ¨Àº Ç÷§Æû °ú ¾ð¾î¿¡ Á߸³ÀûÀÎ ÀÎÅÍÆäÀ̽º·Î¼­, ÇÁ·Î±×·¥°ú ½ºÅ©¸³Æ®°¡ µ¿ÀûÀ¸·Î ¹®¼­ÀÇ ³»¿ë°ú ±¸Á¶, ½ºÅ¸ÀÏ¿¡ Á¢±ÙÇÏ°í °»½ÅÇÒ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ¹®¼­´Â Ⱦ´ÜÇÏ°í ¼öÁ¤ÇÒ¼öÀÖ´Â Æ®¸®±¸Á¶·Î ÀçÇ¥ÇöµÉ ¼ö ÀÖ´Ù.

  • DTD (Document Type Definition)

    ¹®¼­ ÇüÀ» Á¤ÀÇÇÏ´Â DTD ´Â XML ¹®¼­Çü°ú, ¿ÏÀüÇÑ ¿ä¼ÒÀÇ Å¸ÀÔ, ¿£Æ¼Æ¼ ±×¸®°í XML ¼±¾ðÀ» Á¤ÀÇÇÑ´Ù. ´Ù¸£°Ô Ç¥ÇöÇÑ´Ù¸é, DTD ´Â XML ¹®¼­°°Àº ƯÁ¤ÇÑ Á¾·ùÀÇ ¹®¼­¸¦ ¿Ïº®ÇÏ°Ô ¹¦»çÇÑ´Ù.

  • SAX (Simple API for XML)

    SAX ´Â xml-dev ¸ÞÀϸµ¸®½ºÆ®ÀÇ ¸¹Àº ±â°íÀÚ¿¡ ÀÇÇØ °³¹ßµÈ XML Æļ­¸¦ À§ÇÑ °£´ÜÇÑ Ç¥ÁØ API ÀÌ´Ù. ÀÎÅÍÆäÀ̽º´Â °´Ã¼ÁöÇâ ¾ð¾îÀÎ °æ¿ì¿¡ ÇÑÇØ, ¾ð¾î-µ¶¸³ÀûÀÌ´Ù. ÃÖÃÊ¿¡´Â Java ·Î ±¸ÇöµÇ¾úÁö¸¸, ÇöÀç·Î¼­´Â Python ÀÇ »ç¿ëµµ °¡´ÉÇÏ´Ù. SAX ´Â ¸¹Àº XML Æļ­°¡ Áö¿øÇÑ´Ù.

  • XML (eXtensible Markup Language)

    XML Àº °³¹ßÁßÀÎ linking °ú stylesheets ¿¡ ´ëÇÑ ÀڽŸ¸ÀÇ Ç¥ÁØÀ» °®À¸¸ç, web ¿¡¼­ »ç¿ë°¡´ÉÇÑ SGML ¾îÇø®ÄÉÀ̼ÇÀÇ Æ¯Á¤ Ãø¸éÀÌ´Ù.

  • XSL (eXtensible Style Language)

    XSL Àº XML ÀÇ ½ºÅ¸ÀϽÃÆ® ¾ð¾î·Î¼­ÀÇ Á¦¾ÈÀÌ´Ù. ÀÌ°ÍÀº XML ¹®¼­¸¦ ¸Å·ÂÀûÀÎ ¹æ¹ýÀ¸·Î ºê¶ó¿ì¡ ÇÒ¼öÀÖ°Ô Çϸç, XML ¹®¼­¸¦ HTML ·Î º¯È¯ÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-02-03 17:33:29
Processing time 0.0018 sec