Python/XML HOWTOThe 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 Ç÷§Æû»ó¿¡¼ ¼Ò½º¸¦ ÄÄÆÄÀÏ Çϱâ À§Çؼ´Â ´ÙÀ½ÀÇ ¼³Ä¡¼ø¼¸¦ µû¶óÇÏ¸é µÉ°ÍÀÌ´Ù.
¸¸ÀÏ ¼³Ä¡¿¡ ¾î·Á¿òÀÌ ÀÖ´Ù¸é, <xml-sig@python.org>·Î ¹®Á¦¸¦ Àû¾î º¸³»Áֱ⠹ٶõ´Ù. ¶Ç´Â http://sourceforget.net/projects/pyxml·Î ¹ö±×¸®Æ÷ÆÃÀ» ÇØÁ־ µÈ´Ù. ¹èÆ÷µÇ´Â ¼Ò½ºÀÇ demo/ µð·ºÅ丮¿¡ ¸¹Àº µ¥¸ð ÇÁ·Î±×·¥µéÀÌ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥µéÀ» ÅëÇØ, XML Åø·Î °¡´ÉÇÑ ÀÏÀÌ ¹«¾ùÀÎÁö »ìÆ캸°Å³ª, ¿¹Á¦ ¼Ò½ºµéÀ» ¾òÀ» ¼ö ÀÖÀ»°ÍÀÌ´Ù. 2.1. °ü·Ã ȨÆäÀÌÁö
3. SAX: The Simple API for XMLSAX ´Â 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 ÀÎÅÍÆäÀ̽º´Â ´ÙÀ½°ú °°´Ù.:
ÆÄÀ̽ãÀº ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ³»¿ëÀ» Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î À§ÀÇ ÀÎÅÍÆäÀ̽º´Â ÆÄÀ̽ã Ŭ·¡½º·Î ÀçÁ¤ÀÇ µÇ¾î¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¸Þ½îµå´Â ¾Æ¹«·± Àϵµ ÇÏÁö ¾Ê´Â´Ù.(¸Þ½îµåÀÇ ³»¿ëÀº ÆÄÀ̽ãÀÇ pass ¸í·ÉÀ¸·Î µÇ¾îÀÖ´Ù.) ±×·¯¹Ç·Î ¾îÇø®ÄÉÀ̼ǿ¡¼ »ç¿ëÇÏÁö ¾Ê´Â ¸Þ½îµå¿¡ ´ëÇؼ´Â ´Ü¼øÈ÷ ¹«½ÃÇØ ¹ö¸®¸é µÈ´Ù. ¿©±â SAX ¸¦ »ç¿ëÇÏ´Â ½´µµÄÚµåÀÇ ¿¹°¡ ÀÖ´Ù :
3.1. Starting Out¸¸ÈÃ¥µé¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÏ´Â °£´ÜÇÑ XML Æ÷¸Ë¿¡ ´ëÇØ »ý°¢Çغ¸ÀÚ. Çѱǿ¡ ´ëÇÑ °£´ÜÇÑ ¹®¼°¡ ¿©±â ÀÖ´Ù. :
XML ¹®¼´Â ¹Ýµå½Ã ÇϳªÀÇ ÃÖ»óÀ§ ¿ä¼Ò¸¦ °¡Áö°í ÀÖ¾î¾ßÇÑ´Ù. ¿©±â¼´Â "collection" ÀÌ ÃÖ»óÀ§ ¿ä¼ÒÀÌ´Ù. ÀÌ°ÍÀº ÇϳªÀÇ ÀÚ½Ä ¿ä¼ÒÀÎ comic À» °®´Â´Ù. comic ¿ä¼ÒÀÇ ¼Ó¼ºÀ¸·Î Ã¥ÀÇ Á¦¸ñ(title)°ú ¹øÈ£(number)°¡ ÁÖ¾îÁ³À¸¸ç, ÀúÀÚ(writer)¿Í ¹Ì¼ú°¡(artist)¿¡ ´ëÇØ Çϳª ¶Ç´Â ±×ÀÌ»óÀÇ ÀÚ½ÄÀ» °¡Áö°í ÀÖ´Ù. ÇϳªÀÇ °£Ç๰(issue)¿¡ ´ëÇØ ¿©·¯¸íÀÇ ¹Ì¼ú°¡(artist) ³ª ÀúÀÚ(writer)°¡ ÀÖÀ»¼ö ÀÖ´Ù. °£´ÜÇÑ »óÅ·Π½ÃÀÛÀ» Çغ¸ÀÚ : FindIssue ¶ó À̸§ Áö¾îÁø ¹®¼Çڵ鷯(document handler)´Â ÁÖ¾îÁø °£Ç๰ÀÌ Ä÷¢¼Ç ³»¿¡ ÀÖ´ÂÁö ã´ÂÀÏÀ» ÇÒ°ÍÀÌ´Ù.
DefaultHandler Ŭ·¡½º´Â ³×°³ÀÇ ÀÎÅÍÆäÀ̽º - ContentHandler, DTDHandler, EntityResolver, ±×¸®°í ErrorHandler ¿¡¼ »ó¼ÓÀ» ¹Þ´Â´Ù. ÀÌ°ÍÀº ¸ðµç°ÍÀ» ÇϳªÀÇ Å¬·¡½º ³»¿¡¼ »ç¿ëÇÏ±æ ¿øÇÒ¶§ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ¸¸ÀÏ °¢°¢ÀÇ ¸ñÀû¿¡ µû¶ó Ŭ·¡½º¸¦ ³ª´©±æ ¿øÇϰųª, ÇϳªÀÇ ÀÎÅÍÆäÀ̽º¸¸À» ¼±¾ðÇÏ±æ ¿øÇÑ´Ù¸é, °¢ ÀÎÅÍÆäÀ̽º¿¡ µû¶ó °¢°¢ ¼ºêŬ·¡½º¸¦ ¸¸µé¼ö ÀÖ´Ù. ÀÌÁß¿¡ ¾î´À ¹æ¹ýÀÌ ´õ ÁÁ´Ù°í ÇÒ¼ö´Â ¾øÀ¸¸ç, ¹«¾ùÀ» ÇÒ°ÍÀΰ¡¿¡ µû¶ó ÀûÀýÇÑ ¹æ¹ýÀ» ÅÃÇÏ¸é µÉ°ÍÀÌ´Ù. Ŭ·¡½º°¡ °Ë»öÀ» Çϱâ À§Çؼ, ÀνºÅϽº´Â ¹«¾ùÀ» °Ë»öÇÒ°ÍÀÎÁö¸¦ ¾Ë¾Æ¾ßÇÑ´Ù. ã±â¸¦ ¿øÇÏ´Â title °ú ¹ßÇ๰ ¹øÈ£´Â FindIssue »ý¼ºÀÚ¿¡°Ô °Ç³»Áö°í, ÀνºÅϽºÀÇ ÀϺηΠÀúÀåµÉ°ÍÀÌ´Ù. ÀÚ ÀÌÁ¦ ½ÇÁ¦·Î µ¿ÀÛÀ» ÇÏ´Â ÇÔ¼ö¸¦ »ìÆ캸µµ·Ï ÇÏÀÚ. ÀÌ °£´ÜÇÑ ÀÛ¾÷Àº ´ÜÁö ÁÖ¾îÁø ¿ä¼ÒÀÇ ¼Ó¼ºÀ» »ìÆ캸´Â °ÍÀ̹ǷΠstartElement ¸Þ¼Òµå°¡ ÀûÇÕÇÒ °ÍÀÌ´Ù.
startElement() ´Â ¹®¼ÀÇ ¸ðµç ¿ä¼Ò¸¦ ¸¸³¯¶§¸¶´Ù È£ÃâµÈ´Ù. startElement() ÇÔ¼öÀÇ Ã³À½¿¡ 'Starting element:' ¸¦ Ãâ·ÂÇϵµ·Ï Äڵ带 Áý¾î³Ö´Â´Ù¸é, ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» º¸°Ô µÉ°ÍÀÌ´Ù.
½ÇÁ¦ Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ, parser ¿Í FindIssue ÀνºÅϽº¸¦ »ý¼ºÇÏ°í À̵éÀ» ¿¬°áÇÏ°í, ÀԷ°ªÀ» ÆĽÌÇϵµ·Ï Æļ¸¦ È£ÃâÇÏ´Â ÃÖ»óÀ§ Äڵ尡 ÇÊ¿äÇÏ´Ù.
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ÀÌÁ¦ À§ÀÇ Äڵ忡 ¾Æ·¡ÀÇ ÆÄÀÏÀ» ÀÔ·ÂÀ¸·Î ³Ö¾îº¸ÀÚ:
&foo; ¿£Æ¼Æ¼´Â ¾Ë·ÁÁöÁö ¾ÊÀº°ÍÀ̸ç, comic ¿ä¼Ò´Â ´ÝÈ÷Áö ¾Ê¾Ò´Ù. (¸¸ÀÏ ºó ³»¿ëÀ» °®´Â´Ù ÇÏ´õ¶óµµ ">" ·Î ´Ý±â Àü¿¡ "/" ¸¦ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.) ÀÌ·¯ÇÑ °á°ú·Î, SAXParseException ÀÌ ¹ß»ýÇÑ´Ù.
ErrorHandler ÀÎÅÍÆäÀ̽ºÀÇ ±âº»ÄÚµå´Â ¾î¶°ÇÑ ¿¡·¯¿¡ ´ëÇؼµµ ÀÚµ¿ÀûÀ¸·Î ¿¹¿Ü¸¦ ¹ß»ý½ÃŲ´Ù; ¸¸ÀÏ ÀÌ·¯ÇÑ ¿¡·¯Ã³¸®¸¦ ¿øÇÑ´Ù¸é, ¿¡·¯ Çڵ鷯¸¦ ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾øÀ»°ÍÀÌ´Ù. ¶ÇÇÑ, ÀÚ±â ÀڽŸ¸ÀÇ ErrorHandler ÀÎÅÍÆäÀ̽º³ª, error(), fatalError() ¿¡ ´ëÇÑ ÃÖ¼ÒÇÑÀÇ ¿À¹ö¶óÀ̵带 ¸¸µé¼öµµ ÀÖ´Ù. °¢ ¸Þ¼Òµå´Â ÃÖ¼Ò·Î ÇÑ ÁÙ Àϼöµµ ÀÖ´Ù. warning, error, fatalError ¿¡ ´ëÇÑ ErrorHandler ÀÎÅÍÆäÀ̽º ¸Þ½îµå´Â ¸ðµÎ ÇϳªÀÇ ÀÎÀÚ°ª - exception ÀνºÅϽº¸¦ °®´Â´Ù. exception Àº Ç×»ó SAXException ÀÇ ¼ºêŬ·¡½ºÀ̸ç, str() ¸¦ ÀÌ¿ëÇÏ¿© ÀÐÀ»¼öÀÖ´Â ¹®Á¦Á¡À» ¼³¸íÇÏ´Â ¿¡·¯ ¸Þ¼¼Áö·Î ¸¸µé¼öÀÖ´Ù. ´ÙÀ½Àº, ¿©·¯°¡Áö ¿¡·¯¹ß»ý »óȲÀ» Àç¼³Á¤Çϱâ À§ÇØ, ¼¼°¡ÁöÁß ÇϳªÀÇ ¸Þ¼Òµå¸¦ ¿¹¿Ü¸¦ Ãâ·ÂÇϵµ·Ï Á¤ÀÇÇÏ¿´´Ù:
ÀÌ Á¤ÀÇ¿¡ ÀÇÇϸé, Ä¡¸íÀûÀÌÁö ¾ÊÀº 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 ¿ä¼ÒÀÇ ³»ºÎ¿¡ Á¸ÀçÇϹǷÎ, ¿ä¼ÒÀÇ ³»¿ëÀ» °Ë»öÇؾßÇÑ´Ù. ÀÌ·¯ÇÑ °Ë»öÀº ´ÙÀ½°ú °°Àº ¾Ë°í¸®ÁòÀ» µû¶ó 󸮵ȴÙ:
¿©±â¿¡ ù¹ø° ºÎºÐÀÇ Äڵ尡 ÀÖ´Ù.
startElement() ¸Þ¼Òµå¿¡ ´ëÇؼ´Â ÀÌÀü¿¡ ¼³¸íÇÏ¿´´Ù. ÀÌÁ¦ ¿ä¼ÒÀÇ ³»¿ëÀ» ¾î¶»°Ô ó¸®ÇÏ´ÂÁö º¸ÀÚ. normalize_whitespace() ÇÔ¼ö´Â ¸Å¿ì Áß¿äÇϹǷÎ, Äڵ峻¿¡ ÀÌ°ÍÀ» »ç¿ëÇÏ¿©¾ß ÇÑ´Ù. XML Àº °ø¹é¹®ÀÚ(whitespace) ¿¡ ¸Å¿ì ¹Î°¨ÇÏ´Ù; ´ç½ÅÀº ´ç½ÅÀÌ ¿øÇÏ´Â °÷¿¡ ¿©ºÐÀÇ °ø¹é°ú °³Ç๮ÀÚµéÀ» Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ¼Ó¼º°ªÀ̳ª ¿ä¼ÒÀÇ ³»¿ëÀ» ºñ±³Çϱâ Àü¿¡, °ø¹é¹®ÀÚ¸¦ Á¤»óÀûÀ¸·Î ¸¸µé¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù; ¸¸ÀÏ µÎ°³ÀÇ ¿ä¼ÒÀÇ ³»¿ëÀÌ ´Ù¸¥ ¼öÀÇ °ø¹é¹®ÀÚ¸¦ °®´Â´Ù¸é, ºñ±³¿¬»êÀº À߸øµÈ °á°ú¸¦ ¸¸µé¾î³¾ °ÍÀÌ´Ù.
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 & Seagle" °ú °°ÀÌ ¿£Æ¼Æ¼ ÂüÁ¶¸¦ °¡Áö°í ÀÖ´Ù¸é, Æļ´Â "Wagner ", ¿£Æ¼Æ¼ ÂüÁ¶¸¦ »ó¡ÇÏ´Â "&", ±×¸®°í " Seagle" ¿¡ ´ëÇØ °¢ ¼¼¹øÀÇ ¸Þ¼Òµå È£ÃâÀ» ÇÏ°Ô µÈ´Ù. FindWriter ÀÇ µÎ¹ø° °úÁ¤¿¡¼, characters() ´Â ´ÜÁö inWriterContent ¸¦ °Ë»çÇÏ°í, ÀÌ °ªÀÌ ÂüÀ̸é, ¹®ÀÚ¸¦ ¹®ÀÚ¿¿¡ Ãß°¡ÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù. ¸¶Áö¸·À¸·Î, writer ¿ä¼Ò°¡ ³¡³¯¶§, Àüü À̸§ÀÌ ¼öÁýµÉ°ÍÀÌ°í, ÀÌ°ÍÀ» ¿ì¸®°¡ ã°íÀÚÇÏ´Â À̸§°ú ºñ±³ÇÏ°Ô µÈ´Ù.
´Ù¸¥ °ø¹é¹®ÀÚ¼ö¿¡ ÀÇÇÑ È¥µ¿À» ¸·±âÀ§ÇØ, normalize_whitespace() ÇÔ¼ö°¡ È£ÃâµÇ¾ú´Ù. ÀÌ°ÍÀº ÀÌ DTD ³»¿¡¼´Â, ÀÌ ¿ä¼Ò°¡ °¡Áö°í ÀÖ´Â °ø¹é¹®ÀÚ°¡ Áß¿äÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ¸¶Ä§ ű×(End tags)´Â ¼Ó¼ºÀ» °¡Áú¼ö ¾øÀ¸¹Ç·Î, ¿©±â¿¡´Â attrs ÀÎÀÚ°¡ ¾ø´Ù. "<arc name="Season of Mists"/>" ¿Í °°ÀÌ ¼Ó¼ºÀ» °®´Â ºó ű״Â, startElement() ¸¦ È£ÃâÇÑ ÈÄ ¹Ù·Î endElement() ¸¦ È£ÃâÇÑ´Ù. XXX ¿ÜºÎ ¿£Æ¼Æ¼ 󸮴 ¾î¶»°Ô ÇÒ°ÍÀΰ¡? ±×µé¿¡ ´ëÇÑ Ã³¸®°¡ Ưº°È÷ ÇÊ¿äÇÑ°¡? 3.4. °ü·Ã ȨÆäÀÌÁö
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 TreeDOM Æ®¸®¸¦ ¾ò´Â °¡Àå ½¬¿î ¹æ¹ýÀº ÀÚ±âÀÚ½ÅÀÌ ¸¸µå´Â°ÍÀÌ´Ù. 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 ¹®¼ °´Ã¼¸¦ ¹ÝȯÇÑ´Ù.
4.2. Manipulating The TreeDOM Àº ¼ö¸¹Àº ÀÎÅÍÆäÀ̽º¿Í ¸Þ½îµå¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î, ÀÌ HOWTO ¿¡¼ ±× ¸ðµç°ÍÀ» ¼³¸íÇÒ ¼ö´Â ¾ø´Ù. ±×·¯³ª, ´ÙÇེ·´°Ôµµ, DOM ±Ç°í¾ÈÀº ¸Å¿ì °¡µ¶¼ºÀÌ ³ôÀº ¹®¼À̹ǷÎ, °¡´ÉÇÑ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ¿ÏÀüÇÑ ±×¸²À» ¾ò±â À§ÇØ ÀÌ°ÍÀ» Àб⸦ ±ÇÇÑ´Ù. ¿©±â¼´Â ÀϺκÐÀÇ °³°ü¸¸À» º¸µµ·Ï ÇÑ´Ù. ¹®¼ °´Ã¼ ¸ðµ¨(DOM)Àº XML ¹®¼¸¦, ³ëµå Ŭ·¡½ºÀÇ ÇÏÀ§ Ŭ·¡½ºÀÇ ÀνºÅϽº·Î Ç¥ÇöµÇ´Â, ³ëµåµéÀÇ Æ®¸®·Î Ç¥ÇöÇÑ´Ù. ¾î¶°ÇÑ ³ëµåÀÇ ÇÏÀ§Å¬·¡½º´Â ¿ä¼Ò(Element), ÅؽºÆ®, ÁÖ¼®ÀÌ µÉ¼öµµ ÀÖ´Ù. ¿ì¸®´Â ÀÌ ¼½¼Ç³»¿¡¼ ÇϳªÀÇ °£´ÜÇÑ ¿¹Á¦¹®¼¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ¿©±â¿¡ ±× ¿¹Á¦°¡ ÀÖ´Ù.
DOM Æ®¸®·Î º¯È¯Çϸé, ÀÌ ¹®¼´Â ´ÙÀ½°ú °°Àº Æ®¸®·Î Ãâ·ÂµÈ´Ù :
ÀÌ°ÍÀº À¯ÀÏÇÏ°Ô °¡´ÉÇÑ Æ®¸®´Â ¾Æ´Ï´Ù. °¢±â ´Ù¸¥ ÆļµéÀÌ ¾î¶»°Ô ÅؽºÆ® ³ëµåµéÀ» ó¸®ÇÏ´À³Ä¿¡ µû¶ó ´Þ¶óÁú¼ö ÀÖ´Ù. À§ÀÇ Æ®¸®´Â ÅؽºÆ® ³ëµå¸¦ ¾î¶»°Ô ó¸®ÇÏ´À³Ä¿¡ µû¶ó ´ÙÁßÀÇ ³ëµå·Î ³ª´µ¾îÁú¼öµµ ÀÖ´Ù. 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 Treexml.dom.package ´Â Æ®¸®¸¦ Ž»ö(walk)ÇÏ´Â µîÀÇ ÀÛ¾÷¿¡ ´Ù¾çÇÑ µµ¿òÀ» Áִ Ŭ·¡½º¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù. The Walker class Introduction to the walker class 4.6. °ü·Ã ȨÆäÀÌÁö
5. ¿ë¾îÇؼ³XML Àº ¸¹Àº ¿ë¾îµéÀ» °¡Áö°í ÀÖ´Ù. À̹øÀå¿¡¼´Â ±×Áß¿¡¼ Áß¿äÇÑ ¿ë¾î¿Í ±×¿¡ °ü·ÃµÈ ³»¿ëÀ» ¼³¸íÇϵµ·Ï ÇÑ´Ù. ¿©±â¿¡ ³ª¿Â Á¤ÀǵéÀº Lars Marius Garshol ÀÇ SGML ¿ë¾îÇؼ³ (http://www.stud.ifi.uio.no/~larsga/download/diverse/sgmlglos.html) ¿¡¼ Âü°íÇÏ¿´´Ù.
|
Show your affection, which will probably meet with pleasant response. |