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

You are not allowed to 'info'


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 ·Î º¯È¯ÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.


ID
Password
Join
You have an ability to sense and know higher truth.


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.0020 sec