IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

IBM developerWorks > ÀÚ¹Ù
developerWorks

ÀÚ¹Ù¿¡¼­ÀÇ XML : ÀÚ¹Ù ¹®¼­ ¸ðµ¨ »ç¿ë¹ý
»óÀÌÇÑ ÀÚ¹Ù XML ¹®¼­ ¸ðµ¨µéÀÌ ÀÛµ¿ÇÏ´Â ¹æ½Ä

Dennis M. Sosnoski
ȍˌ, Sosnoski Software Solutions, Inc.
2002³â 2¿ù

ÀÌ ±Û¿¡¼­ XML Åø Àü¹®°¡ÀÎ Dennis Sosnosk´Â ¸î °¡Áö ÀÚ¹Ù ¹®¼­ ¸ðµ¨µéÀÇ ¿ë¹ýÀ» ºñ±³ÇÑ´Ù. ¿©·¯ºÐÀÌ ÇÑ ¸ðµ¨À» ¼±ÅÃÇÒ ¶§ ¾ò´Â °Í°ú ÀÒ´Â °ÍÀÌ ¹«¾ùÀÎÁö°¡ Ç×»ó ¸íÈ®ÇÑ °ÍÀº ¾Æ´Ï¸ç, ³ªÁß¿¡ ¸¶À½À» ¹Ù²Ü °æ¿ì ¾öû³­ ÀçÄÚµùÀÌ ÇÊ¿äÇÒ ¼ö ÀÖ´Ù. ÇÊÀÚ´Â ¸ðµ¨ APIµéÀ» ºÐ¼®ÇÏ°í ÀÌ¿Í °ü·ÃÇÑ »ùÇà Äڵ带 Á¦°øÇÏ¿© ¾î¶² ¸ðµ¨ÀÌ ½ÇÁ¦·Î ¿©·¯ºÐÀÇ ÀÛ¾÷À» ½±°Ô ¸¸µé¾î ÁÙÁö¿¡ ´ëÇÑ ±ÇÀå »çÇ×À» Á¦°øÇÑ´Ù. ´Ù¼¸ °³ÀÇ °¢±â ´Ù¸¥ ¹®¼­ ¸ðµ¨µéÀÇ ¸Þ¼Òµå¸¦ º¸¿©ÁÖ´Â ÄÚµå »ùÇÃÀÌ Æ÷ÇԵǾî ÀÖ´Ù.

(DOM ´ë ¾ð¾î¿¡ µ¶ÀÚÀûÀÎ ¸ðµ¨¿¡ °üÇÑ ´Ù¸¥ °ßÇظ¦ º¸·Á¸é ÷ºÎµÇ¾î ÀÖ´Â Joe KesselmanÀÇ "¹®¼­ ¸ðµ¨¿¡ ´ëÇÑ ¸î ¸¶µð"¸¦ ÂüÁ¶ÇÑ´Ù.)

ÀÌ ½Ã¸®ÁîÀÇ Ã¹¹ø° ±Û¿¡¼­ ³ª´Â ÀÚ¹Ù·Î µÈ ¸î °¡Áö ¼±µÎÀûÀÎ XML ¹®¼­ ¸ðµ¨µéÀÇ ¼º´ÉÀ» »ìÆì º¸¾Ò´Ù. ±×·¯³ª ¼º´ÉÀº ÀÌ·¯ÇÑ À¯ÇüÀÇ ±â¼úÀ» ¼±ÅÃÇÒ ¶§ °í·ÁÇØ¾ß ÇÏ´Â »çÇ×ÀÇ ÀϺκÐÀÏ »ÓÀÌ´Ù. »ç¿ëÀÇ ¿ëÀ̼ºÀº Àû¾îµµ ¼º´É¸¸Å­ Áß¿äÇϸç, ¾ð¾î¿¡ µ¶¸³ÀûÀÎ DOMº¸´Ù ÀÚ¹Ù¿¡ ±¹ÇÑµÈ ¸ðµ¨ÀÇ »ç¿ëÀ» ÁöÁöÇÏ´Â ÁÖ¿ä ÀÎÀÚ Áß ÇϳªÀÌ´Ù.

½ÇÁ¦·Î ¾î¶² ¸ðµ¨À» ÁöÁöÇÒ °ÍÀÎÁö¿¡ ´ëÇÑ ±×¸²À» ¸¶Àú ±×¸®±â À§ÇØ ¿ì¸®´Â ÀÌ ¸ðµ¨µéÀÌ »ç¿ëÀÇ Æí¸®¼º ¸é¿¡¼­ ¾î¶»°Ô µî±ÞÀÌ ¸Å°ÜÁö´ÂÁö¸¦ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ ±Û¿¡¼­ ³ª´Â ÀÌ ÀÛ¾÷À» ½ÃµµÇÒ °ÍÀε¥, °¢ ¸ðµ¨¿¡¼­ ÀϹÝÀûÀÎ ÀÛ¾÷ À¯ÇüµéÀÌ ¾î¶»°Ô ÄÚµùµÇ´ÂÁö¸¦ º¸¿©ÁÖ´Â »ùÇà Äڵ带 °¡Áö°í Ãâ¹ßÇÏ°Ú´Ù. ³ª´Â ±× °á°ú¸¦ ¿ä¾àÇϸ鼭 ÀÌ ±ÛÀ» ³¡³¾ °ÍÀÌ°í, ÇÑ Ç¥Çö¹ýÀ» ´Ù¸¥ °Íº¸´Ù »ç¿ëÇϱ⠽±°Ô ¸¸µå´Â ´Ù¸¥ ¸î °¡Áö ¿äÀε鵵 Á¦½ÃÇÏ°Ú´Ù.

À̹ø ºñ±³¿¡¼­ »ç¿ëµÉ ¸ðµ¨µéÀÇ ½ÇÁ¦ ¹öÀü ³Ñ¹ö¸¦ Æ÷ÇÔÇØ ¹è°æ Á¤º¸¸¦ º¸·Á¸é ÀÌÀü ±Û (Âü°í Àڷᳪ ÀÌ ±ÛÀÇ ¸ñÂ÷ ¾Æ·¡¿¡ ÀÖ´Â ¸µÅ© ÂüÁ¶)À» º¸±â ¹Ù¶õ´Ù. ¶ÇÇÑ ¼Ò½º Äڵ带 ´Ù¿î·Îµå ¹Þ°Å³ª ¸ðµ¨ÀÇ È¨ÆäÀÌÁö¿¡ ¿¬°áÇÏ·Á ÇÒ ¶§, ȤÀº ±âŸ °ü·Ã Á¤º¸¸¦ ¾òÀ¸·Á¸é Âü°í ÀڷḦ ÂüÁ¶ÇÑ´Ù.

ÄÚµå ºñ±³

À̹ø ´Ù¸¥ ¹®¼­ Ç¥Çö¹ýµéÀÇ »ç¿ë ±â¹ý ºñ±³¿¡¼­ ³ª´Â ¼¼ °³ÀÇ ±âº»ÀûÀÎ ÀÛ¾÷ À¯ÇüµéÀÌ ÀÌ ¸ðµ¨µé¿¡¼­ ¾î¶»°Ô ¼öÇàµÇ´ÂÁö¸¦ º¸¿©ÁÖ°Ú´Ù.:

  • ÀÔ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ ¹®¼­ ÀÛ¼ºÇϱâ
  • ¸î °¡Áö º¯°æÀ» ¼öÇàÇϸ鼭 element¿Í ÄÁÅÙÆ® ó¸®Çϱâ
    • ÅؽºÆ® ÄÁÅÙÆ®¿¡¼­ ¾ÕµÚÀÇ ½ºÆäÀ̽º¸¦ Áö¿î´Ù.
    • °á°ú·Î ³ª¿À´Â ÅؽºÆ® ÄÁÅÙÆ®°¡ ºñ¾î ÀÖÀ¸¸é À̸¦ »èÁ¦ÇÑ´Ù.
    • ±×·¸Áö ¾ÊÀ¸¸é ºÎ¸ð elementÀÇ À̸§ °ø°£¿¡ "text"¶ó´Â À̸§À» °¡Áø »õ·Î¿î element·Î À̸¦ Æ÷ÀåÇÑ´Ù.
  • ¼öÁ¤µÈ ¹®¼­¸¦ Ãâ·Â ½ºÆ®¸²¿¡ ÀÛ¼ºÇÑ´Ù.

ÀÌ ¿¹Á¦µéÀÇ ÄÚµå´Â ³»°¡ ÀÌÀü ±Û¿¡¼­ »ç¿ëÇß´ø º¥Ä¡¸¶Å© ÇÁ·Î±×·¥¿¡ ±â¹ÝÇÏ°í ÀÖÀ¸¸ç, ÀϺΠ´Ü¼øÈ­½ÃÄ×´Ù. º¥Ä¡¸¶Å©ÀÇ Æ÷Ä¿½º´Â °¢ ¸ðµ¨ÀÌ ÃÖ»óÀÇ ¼º´ÉÀ» ³¾ ¶§¸¦ º¸¿© ÁÖ´Â °ÍÀÌ´Ù.; ÀÌ ±Û¿¡¼­ ³ª´Â °¢ ¸ðµ¨¿¡¼­ ÀÛ¾÷À» ¼öÇàÇÏ´Â °¡Àå ½¬¿î ¹æ¹ýµéÀ» º¸¿©ÁÖ°íÀÚ ÇÑ´Ù.

³ª´Â °¢ ¸ðµ¨¿¡ ´ëÇÑ ¿¹Á¦¸¦ µÎ°³ÀÇ °³º°ÀûÀÎ ÄÚµå ºÎºÐÀ¸·Î ±¸¼ºÇÏ¿´´Ù. ù¹ø° ºÎºÐÀº ¹®¼­¸¦ ÀÐ°í ¼öÁ¤ Äڵ带 È£ÃâÇÏ¸ç ¼öÁ¤µÈ ¹®¼­¸¦ ÀÛ¼ºÇϱâ À§ÇÑ Äڵ带 Á¦°øÇÑ´Ù. µÎ ¹ø° ºÎºÐÀº ¹®¼­ÀÇ Ç¥ÇöµéÀ» ½ÇÁ¦·Î ó¸®ÇÏ°í º¯°æÀ» ¼öÇàÇϱâ À§ÇÑ ¹Ýº¹Àû ¸Þ¼ÒµåÀÌ´Ù. È¥¶õÀ» ÇÇÇϱâ À§ÇØ Äڵ忡¼­ ¿¹¿Ü 󸮴 ¹«½ÃÇÏ¿´´Ù.

¿©·¯ºÐÀº ÀÌ ÆäÀÌÁö ¾Æ·¡ÂÊ¿¡ ÀÖ´Â Âü°í ÀÚ·á ºÎºÐ¿¡ ¸µÅ©µÈ ´Ù¿î·Îµå ÆäÀÌÁö¿¡¼­ ¸ðµç »ùÇÿ¡ ´ëÇÑ ¿ÏÀüÇÑ Äڵ带 ¾òÀ» ¼ö ÀÖ´Ù. »ùÇÃÀÇ ´Ù¿î·Îµå ¹öÀüÀº Å×½ºÆ® µå¶óÀ̺긦 Æ÷ÇÔÇÏ°í ÀÖ°í, element, »èÁ¦ ¹× Ãß°¡¸¦ Çì¾Æ¸²À¸·Î½á ´Ù¸¥ ¸ðµ¨ÀÇ ÀÛ¾÷À» üũÇÏ´Â ÀϺΠÄڵ嵵 Ãß°¡µÇ¾ú´Ù.

¿©·¯ºÐÀÌ DOM ±¸ÇöÀ» »ç¿ëÇÒ Àǵµ°¡ ¾ø´Ù ÇÏ´õ¶óµµ DOM ¿ë¹ý¿¡ ´ëÇÑ ¼³¸íÀ» ÈÈ¾î º¸´Â °ÍÀÌ À¯¿ëÇÒ °ÍÀÌ´Ù. DOM ¿¹Á¦´Â µÚ¿¡ ³ª¿À´Â ¸ðµ¨µé¼­º¸´Ù ¿¹Á¦ÀÇ ¸î¸î À̽´¿Í ±¸Á¶¿¡ °üÇØ Á» ´õ »ó¼¼È÷ ¼³¸íÇϱâ À§ÇØ ³»°¡ óÀ½ »ç¿ëÇÏ´Â °ÍÀ̱⠶§¹®ÀÌ´Ù. DOM¿¡ °üÇØ ÀÐ¾î º¸¸é ´Ù¸¥ ¸ðµ¨·Î ¹Ù·Î °¥ °æ¿ì ¿©·¯ºÐÀÌ ³õÄ¡±â ½¬¿î ¸î °¡Áö ¼¼ºÎ »çÇ×µéÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.

DOM

DOM »ç¾çÀº ¹®¼­ÀÇ Ç¥ÇöµéÀ» Á¶ÀÛÇÏ´Â ¸ðµç À¯ÇüÀ» ´Ù·ç°í ÀÖÁö¸¸, ¹®¼­ ºÐ¼®°ú ÅؽºÆ® »êÃâ¹° »ý¼º°ú °°Àº ¹®Á¦´Â ´Ù·çÁö ¾Ê´Â´Ù. ¼º´É Å×½ºÆ®¿¡ Æ÷ÇԵǾú´ø µÎ °¡Áö DOM ±¸Çöµé(Xerces¿Í Crimson)Àº ÀÌ·¯ÇÑ ÀÛ¾÷À» À§ÇØ ¼­·Î ´Ù¸¥ ±â¹ýÀ» »ç¿ëÇÑ´Ù. Listing 1Àº Xerces »óÀ§ ·¹º§ ÄÚµåÀÇ ÇÑ ÇüŸ¦ º¸¿©ÁØ´Ù.

Listing 1. Xerces DOM »óÀ§ ·¹º§ ÄÚµå

 1  // parse the document from input stream ("in")
 2  DOMParser parser = new DOMParser();
 3  parser.setFeature("http://xml.org/sax/features/namespaces", true);
 4  parser.parse(new InputSource(in));
 5  Document doc = parser.getDocument();

 6  // recursively walk and modify document
 7  modifyElement(doc.getDocumentElement());

 8  // write the document to output stream ("out")
 9  OutputFormat format = new OutputFormat(doc);
10  XMLSerializer serializer = new XMLSerializer(out, format);
11  serializer.serialize(doc.getDocumentElement());

³»°¡ ÄÚ¸àÆ®·Î ³ªÅ¸³ÂµíÀÌ, Listing 1¿¡¼­ ÄÚµåÀÇ Ã¹¹ø° ºí·Ï (1-5Çà)Àº ÀÔ·Â ½ºÆ®¸²À» parsingÇÏ¿© ¹®¼­ Ç¥ÇöÀ» ±¸ÃàÇÑ´Ù. DOMParser Ŭ·¡½º´Â Xerces¿¡ ÀÇÇØ Á¤ÀǵǸç Xerces parserÀÇ Ãâ·ÂÀ¸·ÎºÎÅÍ ¹®¼­¸¦ ±¸ÃàÇÑ´Ù. InputSource Ŭ·¡½º´Â SAX »ç¾çÀÇ ÀϺκÐÀÌ°í SAX parser°¡ »ç¿ëÇÒ ¸î °¡Áö ÀÔ·Â À¯Çü Áß ¾î¶² °ÍÀÌ¶óµµ Àû¿ëÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ parsing°ú ¹®¼­ ÀÛ¼ºÀº ÇϳªÀÇ È£Ãâ·Î ¼öÇàµÇ´Âµ¥, ÀÌ°ÍÀÌ ¼º°øÀûÀ¸·Î ¿Ï·áµÇ¸é ÀÛ¼ºµÈ Document´Â ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ °Ë»öµÇ°í »ç¿ëµÉ ¼ö ÀÖ´Ù.

µÎ ¹ø° ÄÚµå ºí·Ï (6-7Çà)Àº ¹®¼­ÀÇ ·çÆ® element¸¦ ³»°¡ °ð ¼³¸íÇÒ ¹Ýº¹Àû ¼öÁ¤ ¸Þ¼Òµå·Î Àü´ÞÇÑ´Ù. ÀÌ ÄÚµå´Â ÀÌ ±Û¿¡ ³ª¿À´Â ¸ðµç ¹®¼­ ¸ðµ¨¿¡¼­ º»ÁúÀûÀ¸·Î µ¿ÀÏÇϱ⠶§¹®¿¡, ³ª¸ÓÁö ¿¹Á¦µé¿¡¼­´Â ¼³¸íÇÏÁö ¾Ê°í ³Ñ¾î°¡µµ·Ï ÇÏ°Ú´Ù.

¼¼ ¹ø° ÄÚµå ºí·Ï(8-11Çà)Àº ÅؽºÆ®·Î µÈ »êÃâ¹° ½ºÆ®¸²À¸·Î ¹®¼­¸¦ ÀÛ¼ºÇÏ´Â ºÎºÐÀ» ó¸®ÇÏ°í ÀÖ´Ù. ¿©±â¿¡¼­, OutputFormat Ŭ·¡½º´Â »ý¼ºµÇ´Â ÅؽºÆ®ÀÇ Æ÷¸ËÆÃÀ» À§ÇÑ ´Ù¾çÇÑ ¼±ÅÃÀ» Á¦°øÇÏ¸ç ¹®¼­¸¦ ¿¡¿ö½Ñ´Ù. XMLSerializer Ŭ·¡½º´Â ½ÇÁ¦ »êÃâ¹° ÅؽºÆ®ÀÇ »ý¼ºÀ» ó¸®ÇÑ´Ù.

Xerces¿¡ ´ëÇÑ ¼öÁ¤ ¸Þ¼Òµå´Â Ç¥ÁØ DOM ÀÎÅÍÆäÀ̽º¸¸ »ç¿ëÇϱ⠶§¹®¿¡, ´Ù¸¥ DOM ±¸Çö°úµµ ȣȯ °¡´ÉÇÏ´Ù. Listing 2¿¡ Äڵ尡 ³ª¿Í ÀÖ´Ù.

isting 2. DOM ¼öÁ¤ ¸Þ¼Òµå


 1  protected void modifyElement(Element element) {

 2    // loop through child nodes
 3    Node child;
 4    Node next = (Node)element.getFirstChild();
 5    while ((child = next) != null) {

 6      // set next before we change anything
 7      next = child.getNextSibling();

 8      // handle child by node type
 9      if (child.getNodeType() == Node.TEXT_NODE) {

10        // trim whitespace from content text
11        String trimmed = child.getNodeValue().trim();
12        if (trimmed.length() == 0) {

13          // delete child if nothing but whitespace
14          element.removeChild(child);

15        } else {

16          // create a "text" element matching parent namespace
17          Document doc = element.getOwnerDocument();
18          String prefix = element.getPrefix();
19          String name = (prefix == null) ? "text" : (prefix + ":text");
20          Element text = 
21            doc.createElementNS(element.getNamespaceURI(), name);

22          // wrap the trimmed content with new element
23          text.appendChild(doc.createTextNode(trimmed));
24          element.replaceChild(text, child);

25        }
26      } else if (child.getNodeType() == Node.ELEMENT_NODE) {

27        // handle child elements with recursive call
28        modifyElement((Element)child);

29      }
30    }
31  }

Listing 2¿¡ ³ª¿Í ÀÖ´Â ¸Þ¼Òµå°¡ »ç¿ëÇÏ´Â ±âº»ÀûÀÎ Á¢±Ù ¹æ½ÄÀº ¸ðµç ¹®¼­ Ç¥Çö¹ý¿¡¼­ µ¿ÀÏÇÏ´Ù. ÀÌ°ÍÀº ÇÑ element¿Í ÇÔ²² È£ÃâµÇ¸ç ±× elementÀÇ ÀÚ½Ä elementµéÀ» ¼ø¼­´ë·Î ó¸®ÇÑ´Ù. ÇϳªÀÇ ÅؽºÆ® ÄÁÅÙÆ® ÀÚ½ÄÀÌ ¹ß°ßµÇ¸é, ÅؽºÆ®´Â »èÁ¦µÇ°Å³ª (°ø¹éÀ¸·Î¸¸ ±¸¼ºµÈ °æ¿ì) Æ÷ÇÔ element¿Í µ¿ÀÏÇÑ À̸§ °ø°£¿¡ 'text"¶ó´Â À̸§À» °¡Áø »õ·Î¿î element·Î µÑ·¯½Î¿©Áø´Ù (°ø¹éÀÌ ¾Æ´Ñ ¹®ÀÚ°¡ ÀÖ´Â °æ¿ì). ¸¸ÀÏ element ÀÚ½ÄÀÌ ¹ß°ßµÇ¸é ¸Þ¼Òµå´Â ÀÚ½Ä element¿Í ÇÔ²² ±× ÀÚ½ÅÀ» ¹Ýº¹ÀûÀ¸·Î È£ÃâÇÑ´Ù.

DOM ±¸Çö¿¡¼­ ³ª´Â child¿Í next¶ó´Â ÇÑ ½ÖÀÇ ÂüÁ¶¸¦ »ç¿ëÇÏ¿© children ¸ñ·Ï¿¡¼­ ³» À§Ä¡¸¦ ÃßÀûÇÑ´Ù. ´ÙÀ½ child ³ëµå¿¡ ´ëÇÑ ÂüÁ¶´Â ÇöÀç child¿¡ ´ëÇÑ ¸ðµç 󸮰¡ ¼öÇàµÇ±â Àü¿¡ ·ÎµùµÈ´Ù. (7Çà) ÀÌ´Â ¸ñ·Ï¿¡¼­ ³» À§Ä¡¸¦ ÀÒ¾î ¹ö¸®Áö ¾Ê°í ÇöÀç child¸¦ »èÁ¦Çϰųª ±³Ã¼ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.

DOM ÀÎÅÍÆäÀ̽º´Â °ø¹éÀÌ ¾Æ´Ñ ÅؽºÆ® ÄÁÅÙÆ® (16-24Çà)¸¦ µÑ·¯ ½Î±â À§ÇØ »õ·Î¿î element¸¦ ¸¸µé ¶§ ¾à°£ È¥¶õ½º·¯¿öÁö±â ½ÃÀÛÇÑ´Ù. element¸¦ ¸¸µé±â À§ÇØ »ç¿ëÇÏ´Â ¸Þ¼Òµå´Â ¹®¼­¿Í ÀüüÀûÀ¸·Î ¿¬°üµÇ¾î Àֱ⠶§¹®¿¡, ³ª´Â ³»°¡ ÇöÀç ó¸®ÇÏ°í ÀÖ´Â element ÀÇ ÁÖÀÎ ¹®¼­¸¦ °Ë»öÇØ¾ß ÇÑ´Ù (17Çà). ³ª´Â »õ·Î¿î element°¡ ±âÁ¸ÀÇ ºÎ¸ð element¿Í µ¿ÀÏÇÑ À̸§ °ø°£¿¡ Àֱ⸦ ¹Ù¶ó°í, DOM¿¡¼­ ÀÌ°ÍÀº ³»°¡ ¿ä°ÇÀ» °®Ãá element À̸§À» ¸¸µé¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù. ÀÌ°ÍÀº À̸§ °ø°£ Á¢µÎ»çÀÇ Á¸Àç ¿©ºÎ (18-19Çà)¿¡ µû¶ó ´Ù¸£°Ô ¼öÇàµÈ´Ù. »õ·Î¿î element¿¡ ´ëÇÑ ¿ä°ÇÀ» °®Ãá À̸§°ú ±âÁ¸ elementÀÇ À̸§ °ø°£ URI¸¦ °¡Áö°í ³ª¸é ³ª´Â »õ·Î¿î element¸¦ ¸¸µé ¼ö ÀÖ´Ù. (20-21Çà)

ÀÏ´Ü »õ·Î¿î element°¡ ¸¸µé¾îÁö¸é ³»¿ë StringÀ» µÑ·¯½Ò ÅؽºÆ® ³ëµå¸¦ ¸¸µé°í Ãß°¡ÇÒ ¼ö ÀÖ°í, ¿ø·¡ ÅؽºÆ® ³ëµå¸¦ »õ·Ó°Ô ¸¸µé¾îÁø element·Î ¹Ù²Ü ¼ö ÀÖ´Ù. (22-24Çà)

Listing 3. Crimson DOM »óÀ§ ·¹º§ ÄÚµå

 1  // parse the document from input stream
 2  System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
 3      "org.apache.crimson.jaxp.DocumentBuilderFactoryImpl");
 4  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 5  dbf.setNamespaceAware(true);
 6  DocumentBuilder builder = dbf.newDocumentBuilder();
 7  Document doc = builder.parse(in);

 8  // recursively walk and modify document
 9  modifyElement(doc.getDocumentElement());

10  // write the document to output stream
11  ((XmlDocument)doc).write(out);

Listing 3¿¡ ³ª¿Í ÀÖ´Â Crimson DOM ¿¹Á¦ ÄÚµå´Â parsingÀ» À§ÇØ JAXP ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ´Ù. JAXP´Â XML ¹®¼­¸¦ parsingÇÏ°í º¯È¯Çϱâ À§ÇÑ Ç¥ÁØÈ­µÈ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. ÀÌ ¿¹Á¦¿¡ ³ª¿Â parsing ÄÚµå´Â ¾Õ¿¡¼­ Á¦½ÃÇÑ Xerces¿¡ ±¹ÇÑµÈ ¿¹Á¦ ÄÚµå ´ë½Å Xerces¿¡¼­µµ »ç¿ëµÉ ¼ö ÀÖ´Ù (¹®¼­ builder Ŭ·¡½º ¸íÀÇ Æ¯¼º ¼³Á¤À» ÀûÀýÇÏ°Ô º¯°æÇØ¾ß ÇÑ´Ù).

ÀÌ ¿¹Á¦¿¡¼­, ³ª´Â ¸ÕÀú ±¸ÃàµÉ DOM Ç¥Çö¹ýÀÇ builder factory Ŭ·¡½º¸¦ ¼±ÅÃÇϱâ À§ÇØ 2-3 Çà¿¡¼­ ½Ã½ºÅÛ Æ¯¼ºÀ» ¼³Á¤ÇÑ´Ù. (JAXP´Â ÀÌ ±Û¿¡¼­ ¼³¸íÇÑ °Íµé Áß DOM Ç¥Çö¹ý ±¸Ãุ Á÷Á¢ Áö¿øÇÑ´Ù.) ÀÌ ´Ü°è´Â JAXP°¡ »ç¿ëÇÒ Æ¯Á¤ DOMÀ» ¼±ÅÃÇÏ°í ½ÍÀ» ¶§¸¸ ÇÊ¿äÇÏ´Ù.; ±×·¸Áö ¾Ê´Ù¸é JAXP´Â ±âº» ±¸ÇöÀ» »ç¿ëÇÑ´Ù. ³ª´Â ¿Ïº®¼ºÀ» À§ÇØ ÀÌ Æ¯¼º ¼³Á¤À» Äڵ忡 Æ÷ÇÔ½ÃÄ×Áö¸¸, JVM ¸í·ÉÇà ¸Å°³º¯¼ö·Î ¼³Á¤ÇÏ´Â °ÍÀÌ ÈξÀ ´õ ÀϹÝÀûÀÌ´Ù.

4-6Çà¿¡¼­ ³ª´Â builder factoryÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏ°í ±× factory ÀνºÅϽº¸¦ »ç¿ëÇØ ±¸ÃàµÈ builder¿¡ ´ëÇÑ À̸§ °ø°£ Áö¿øÀ» °¡´ÉÄÉ ÇÏ¿´À¸¸ç, builder factory·ÎºÎÅÍ ¹®¼­ builder¸¦ »ý¼ºÇÏ¿´´Ù. ¸¶Áö¸·À¸·Î (7Çà) ¹®¼­ builder¸¦ »ç¿ëÇØ ÀÔ·Â ½ºÆ®¸²À» parsingÇÏ°í ¹®¼­ Ç¥ÇöÀ» ±¸ÃàÇÏ¿´´Ù.

¹®¼­ ÀÛ¼ºÀ» À§ÇØ ³ª´Â Crimson¿¡ ³»ºÎÀûÀ¸·Î Á¤ÀÇµÈ ±âº» ¸Þ¼Òµå¸¦ »ç¿ëÇÑ´Ù. ÀÌ ¹æ½ÄÀÌ CrimsonÀÇ ÇâÈÄ ¹öÀü¿¡¼­ Áö¿øµÉÁö´Â º¸ÀåµÇÁö ¾ÊÁö¸¸, ¹®¼­¸¦ Ãâ·ÂÇϱâ À§ÇØ JAXP º¯È¯ Äڵ带 »ç¿ëÇÏ´Â ÂÊÀ» ÅÃÇϸé Xalan°ú °°Àº XSL ÇÁ·Î¼¼¼­°¡ ÇÊ¿äÇÏ´Ù. ÀÌ ºÎºÐÀº ÀÌ ±ÛÀÇ ¹üÀ§¸¦ ³Ñ¾î¼­Áö¸¸, »ó¼¼ »çÇ×À» º¸·Á¸é SunÀÇ JAXP Æ©Å丮¾óÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

JDOM

JDOMÀ» »ç¿ëÇÏ¸é »óÀ§ ·¹º§ Äڵ尡 DOM ±¸Çöº¸´Ù Á¶±Ý ´õ ´Ü¼øÇÏ´Ù. ¹®¼­ Ç¥Çö¹ýÀ» ±¸ÃàÇϱâ À§ÇØ (1-3Çà), ³ª´Â ¸Å°³º¯¼ö °ª¿¡ ÀÇÇØ °ËÁõ ÀÛ¾÷ÀÌ ºñÈ°¼ºÈ­µÇ¾î ÀÖ´Â SAXBuilder¸¦ »ç¿ëÇÑ´Ù. ¼öÁ¤µÈ ¹®¼­¸¦ Ãâ·Â ½ºÆ®¸²¿¡ ÀÛ¼ºÇÏ´Â °Íµµ ¸¶Âù°¡Áö·Î °£´ÜÇѵ¥ (6-8Çà), Á¦°øµÈ XMLOutputter Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù.

Listing 4. JDOM »óÀ§ ·¹º§ ÄÚµå

 1  // parse the document from input stream
 2  SAXBuilder builder = new SAXBuilder(false);
 3  Document doc = builder.build(in);

 4  // recursively walk and modify document
 5  modifyElement(doc.getRootElement());

 6  // write the document to output stream
 7  XMLOutputter outer = new XMLOutputter();
 8  outer.output(doc, out);

Listing 5ÀÇ JDOM¿¡ ´ëÇÑ ¼öÁ¤ ¸Þ¼Òµåµµ DOM¿¡¼­ÀÇ µ¿ÀÏ ¸Þ¼Òµåº¸´Ù °£´ÜÇÏ´Ù. elementÀÇ ¸ðµç ÄÁÅÙÆ® ¸ñ·ÏÀ» ¾ò°í »ìÆì º¸¾Æ ÅؽºÆ® (String °´Ã¼·Î)¿Í element°¡ ÀÖ´ÂÁö üũÇÑ´Ù. ¸ñ·ÏÀº "»ì¾Æ ÀÖ°í", µû¶ó¼­ ³ª´Â ºÎ¸ð element¿¡ ´ëÇÑ ¸Þ¼Òµå¸¦ È£ÃâÇÒ ÇÊ¿ä ¾øÀÌ ¸ñ·ÏÀ» Á÷Á¢ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

Listing 5. JDOM ¼öÁ¤ ¸Þ¼Òµå

 1  protected void modifyElement(Element element) {

 2    // loop through child nodes
 3    List children = element.getContent();
 4    for (int i = 0; i < children.size(); i++) {

 5      // handle child by node type
 6      Object child = children.get(i);
 7      if (child instanceof String) {

 8        // trim whitespace from content text
 9        String trimmed = child.toString().trim();
10        if (trimmed.length() == 0) {

11          // delete child if only whitespace (adjusting index)
12          children.remove(i--);

13        } else {

14          // wrap the trimmed content with new element
15          Element text = new Element("text", element.getNamespace());
16          text.setText(trimmed);
17          children.set(i, text);

18        }
19      } else if (child instanceof Element) {

20        // handle child elements with recursive call
21        modifyElement((Element)child);

22      }
23    }
24  }

»õ·Î¿î element¸¦ ÀÛ¼ºÇÏ´Â ±â¹ý (14-17Çà)Àº ¸Å¿ì °£´ÜÇÏ°í, DOM ¹öÀü°ú ´Þ¸® ºÎ¸ð ¹®¼­·Î Á¢±ÙÇÏÁö ¾Ê¾Æµµ µÈ´Ù.

dom4j

dom4jÀÇ »óÀ§ ·¹º§ ÄÚµå´Â JODMº¸´Ù Á¶±Ý ´õ º¹ÀâÇÏÁö¸¸, ¸Å¿ì °£´ÜÇÑ ÇàÀ» µû¶ó ÀÛµ¿ÇÑ´Ù. ÀÌ ÄÚµåÀÇ ÁÖµÈ Â÷ÀÌÁ¡Àº dom4j ¹®¼­ Ç¥ÇöÀ» ±¸ÃàÇϱâ À§ÇØ »ç¿ëÇÏ´Â DocumentFactory¸¦ ÀúÀåÇÏ°í (5Çà) ¼öÁ¤µÈ ¹®¼­ ÅؽºÆ®ÀÇ °á°ú¸¦ ¸¸µé¾î ³½ ÈÄ writer °´Ã¼ÀÇ flush() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© ³»¿ëÀ» º¸³½´Ù´Â °ÍÀÌ´Ù. (10Çà).

Listing 6. dom4j »óÀ§ ·¹º§ ÄÚµå

 1  // parse the document from input stream
 2  SAXReader reader = new SAXReader(false);
 3  Document doc = reader.read(in);

 4  // recursively walk and modify document
 5  m_factory = reader.getDocumentFactory();
 6  modifyElement(doc.getRootElement());

 7  // write the document to output stream
 8  XMLWriter writer = new XMLWriter(out);
 9  writer.write(doc);
10  writer.flush();

Listing 6¿¡¼­ º¼ ¼ö ÀÖµíÀÌ, dom4j´Â parseÀ¸·ÎºÎÅÍ ±¸ÃàµÈ ¹®¼­ Ç¥Çö¿¡ Æ÷ÇÔµÈ °´Ã¼¸¦ ±¸ÃàÇϱâ À§ÇØ factory ¹æ½ÄÀ» »ç¿ëÇÑ´Ù. °¢ ÄÄÆ÷³ÍÆ® °´Ã¼´Â ÀÎÅÍÆäÀ̽º Ãø¸é¿¡¼­ Á¤Àǵǰí, µû¶ó¼­ ÀÌ ÀÎÅÍÆäÀ̽ºµé Áß Çϳª¸¦ ±¸ÇöÇÏ´Â ¸ðµç °´Ã¼ À¯ÇüÀÌ Ç¥Çö¹ý¿¡ Æ÷Ç﵃ ¼ö ÀÖ´Ù.(ÀÌ´Â ±¸Ã¼ÀûÀΠŬ·¡½º¸¦ »ç¿ëÇÏ´Â JDOM°ú ¹Ý´ëµÈ´Ù.: ÀϺΠ°æ¿ì¿¡ Ŭ·¡½ºµéÀº ÇÏÀ§ Ŭ·¡½º·Î ³ª´©¾îÁ® È®ÀåµÉ ¼ö ÀÖÁö¸¸, ¹®¼­ Ç¥Çö¿¡ »ç¿ëµÇ´Â ¾î¶² Ŭ·¡½º¶óµµ ¿ø JDOM Ŭ·¡½º¿¡ ±â¹ÝÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù.) ¿©·¯ºÐÀº dom4j ¹®¼­ ±¸ÃàÀ» À§ÇØ ´Ù¸¥ factoryµéÀ» »ç¿ëÇÔÀ¸·Î½á ´Ù¸¥ ÄÄÆ÷³ÍÆ® ±ºÀ¸·Î ±¸ÃàµÈ ¹®¼­µéÀ» ¾òÀ» ¼ö ÀÖ´Ù.

»ùÇà ÄÚµå(5Çà)¿¡¼­, ³ª´Â ¹®¼­ ±¸Ãà¿¡ »ç¿ëµÇ´Â (±âº») ¹®¼­ factory¸¦ °Ë»öÇÏ°í À̸¦ ÀνºÅϽº º¯¼ö (m_factory)¿¡ ÀúÀåÇÏ¿© ¼öÁ¤ ¸Þ¼Òµå°¡ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. ÀÌ ´Ü°è´Â ²À ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. -- ´Ù¸¥ factoryµé·ÎºÎÅÍ ¸¸µé¾îÁø ÄÄÆ÷³ÍÆ®µéÀÌ ¹®¼­¿¡¼­ ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ°í, ȤÀº ¿©·¯ºÐÀÌ factory¸¦ ¹«½ÃÇÏ°í ÄÄÆ÷³ÍÆ®µéÀÇ ÀνºÅϽº¸¦ Á÷Á¢ ¸¸µé ¼öµµ ÀÖ´Ù.-- ±×·¯³ª ÀÌ °æ¿ì ³ª´Â ¹®¼­ÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­ »ç¿ëµÇ´Â °Í°ú µ¿ÀÏÇÑ ÄÄÆ÷³ÍÆ® À¯ÇüÀ» ¸¸µé°í ½Í¾îÇÏ°í, µ¿ÀÏÇÑ factory¸¦ »ç¿ëÇϸé À̸¦ º¸ÁõÇÒ ¼ö ÀÖ´Ù.

Listing 7. dom4j ¼öÁ¤ ¸Þ¼Òµå

 1  protected void modifyElement(Element element) {

 2    // loop through child nodes
 3    List children = element.content();
 4    for (int i = 0; i < children.size(); i++) {

 5      // handle child by node type
 6      Node child = (Node)children.get(i);
 7      if (child.getNodeType() == Node.TEXT_NODE) {

 8        // trim whitespace from content text
 9        String trimmed = child.getText().trim();
10        if (trimmed.length() == 0) {

11          // delete child if only whitespace (adjusting index)
12          children.remove(i--);

13        } else {

14          // wrap the trimmed content with new element
15          Element text = m_factory.createElement
16            (QName.get("text", element.getNamespace()));
17          text.addText(trimmed);
18          children.set(i, text);

19        }
20      } else if (child.getNodeType() == Node.ELEMENT_NODE) {

21        // handle child elements with recursive call
22        modifyElement((Element)child);

23      }
24    }
25  }

Listing 7¿¡ ³ª¿Í ÀÖ´Â dom4j ¼öÁ¤ ¸Þ¼Òµå´Â JDOM¿¡¼­ »ç¿ëµÇ´Â °Í°ú ¸Å¿ì ºñ½ÁÇÏ´Ù. instanceof ¿¬»êÀÚ¸¦ »ç¿ëÇØ ÄÁÅÙÆ® ¾ÆÀÌÅÛÀÇ À¯ÇüÀ» üũÇÏ´Â ´ë½Å, ³ª´Â Node ÀÎÅÍÆäÀ̽º ¸Þ¼ÒµåÀÎ getNodeType¸¦ ÅëÇØ À¯Çü Äڵ带 ¾òÀ» ¼ö ÀÖ´Ù. (instanceofµµ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, À¯Çü ÄÚµå ¹æ½ÄÀÌ ´õ ¸íÈ®ÇØ º¸ÀδÙ.) »õ·Î¿î element »ý¼º ±â¹ýÀº (15-16Çà) element¸íÀ» Ç¥½ÃÇϱâ À§ÇØ QName °´Ã¼¸¦ »ç¿ëÇÏ°í ÀúÀåµÈ factoryÀÇ ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© element¸¦ ±¸ÃàÇÑ´Ù´Â Á¡¿¡¼­ Ʋ¸®´Ù.

Electric XML

Listing 8¿¡ ³ª¿Í ÀÖ´Â Electric XML (EXML)ÀÇ top-level ÄÚµå´Â ¿¹Á¦µé Áß °¡Àå °£´ÜÇѵ¥, ¹®¼­ Àбâ¿Í ¾²±â °¢°¢¿¡ ´ëÇØ ÇϳªÀÇ ¸Þ¼Òµå È£ÃâÀ» »ç¿ëÇÑ´Ù.

Listing 8. EXML »óÀ§ ·¹º§ ÄÚµå

 1  // parse the document from input stream
 2  Document doc = new Document(in);

 3  // recursively walk and modify document
 4  modifyElement(doc.getRoot());

 5  // write the document to output stream
 6  doc.write(out);

Listing 9ÀÇ EXML ¼öÁ¤ ¸Þ¼Òµå´Â DOM ¹æ½Ä°ú °¡Àå À¯»çÇÏÁö¸¸, JODM°ú ¸¶Âù°¡Áö·Î instanceof üũ »ç¿ëÀÌ ÇÊ¿äÇÏ´Ù. EXML¿¡¼­´Â À̸§ °ø°£¿¡ À¯È¿ÇÑ À̸§À» °¡Áø element¸¦ »ý¼ºÇÒ ¹æ¹ýÀÌ ¾ø±â ¶§¹®¿¡, ³ª´Â ´ë½Å »õ·Î¿î element¸¦ »ý¼ºÇÏ¿© °°Àº È¿°ú¸¦ ¾òµµ·Ï ±× À̸§À» ¼³Á¤ÇÏ¿´´Ù.

isting 9. EXML ¼öÁ¤ ¸Þ¼Òµå


 1  protected void modifyElement(Element element) {

 2    // loop through child nodes
 3    Child child;
 4    Child next = element.getChildren().first();
 5    while ((child = next) != null) {

 6      // set next before we change anything
 7      next = child.getNextSibling();

 8      // handle child by node type
 9      if (child instanceof Text) {

10        // trim whitespace from content text
11        String trimmed = ((Text)child).getString().trim();
12        if (trimmed.length() == 0) {

13          // delete child if only whitespace
14          child.remove();

15        } else {

16          // wrap the trimmed content with new element
17          Element text = new Element();
18          text.addText(trimmed);
19          child.replaceWith(text);
20          text.setName(element.getPrefix(), "text");

21        }
22      } else if (child instanceof Element) {

23        // handle child elements with recursive call
24        modifyElement((Element)child);

25      }
26    }
27  }

XPP
XPP (Listing 10)ÀÇ »óÀ§ ·¹º§ ÄÚµå´Â ¿¹Á¦µé Áß °¡Àå ±æ°í, ´Ù¸¥ ¸ðµ¨º¸´Ù »ó´çÈ÷ ¸¹Àº ¼³Á¤ÀÌ ÇÊ¿äÇÏ´Ù.

Listing 10. XPP top-level ÄÚµå

 1  // parse the document from input stream
 2  m_parserFactory = XmlPullParserFactory.newInstance();
 3  m_parserFactory.setNamespaceAware(true);
 4  XmlPullParser parser = m_parserFactory.newPullParser();
 5  parser.setInput(new BufferedReader(new InputStreamReader(in)));
 6  parser.next();
 7  XmlNode doc = m_parserFactory.newNode();
 8  parser.readNode(doc);

 9  // recursively walk and modify document
10  modifyElement(doc);

11  // write the document to output stream
12  XmlRecorder recorder = m_parserFactory.newRecorder();
13  Writer writer = new OutputStreamWriter(out);
14  recorder.setOutput(writer);
15  recorder.writeNode(doc);
16  writer.close();

JAXP ÀÎÅÍÆäÀ̽º¿Í ¸¶Âù°¡Áö·Î, ³ª´Â ¸ÕÀú parser factoryÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏ°í À̸§ °ø°£ 󸮸¦ °¡´ÉÇÏ°Ô ÇÑ ÈÄ¿¡ parser ÀνºÅϽº¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù (2-4Çà). ÀÏ´Ü parser ÀνºÅϽº¸¦ °¡Áö°Ô µÇ¸é parser¿¡ ÀԷ»çÇ×À» ¼³Á¤ÇÏ°í ½ÇÁ¦·Î ¹®¼­ Ç¥ÇöÀ» ±¸ÃàÇÒ ¼ö ÀÖÁö¸¸ (5-8Çà), ´Ù¸¥ ¸ðµ¨¿¡¼­º¸´Ù ¸¹Àº ´Ü°è°¡ ÇÊ¿äÇÏ´Ù.

Ãâ·Â ó¸® (11-16Çà) ¶ÇÇÑ ´Ù¸¥ ¸ðµ¨º¸´Ù ¸¹Àº ´Ü°è°¡ ÇÊ¿äÇѵ¥, ÁÖ·Î XPP°¡ Ãâ·Â Ÿ°ÙÀ¸·Î StreamÀ» Á÷Á¢ ¹Þ¾ÆµéÀ̱⺸´Ù´Â Writer¸¦ ¿ä±¸Çϱ⠶§¹®ÀÌ´Ù.

Listing 11ÀÇ XPP ¼öÁ¤ ¸Þ¼Òµå´Â JDOM ¹æ½Ä°ú °¡Àå À¯»çÇÏÁö¸¸, »õ·Î¿î element »ý¼º¿¡ ´õ ¸¹Àº Äڵ尡 ÇÊ¿äÇÏ´Ù(13-21Çà). À̸§°ø°£ 󸮴 Á¶±Ý ¼º°¡½Å Ãø¸éÀÌ´Ù. ¸ÕÀú element¿¡ ´ëÇØ À¯È¿ÇÑ À̸§À» ¸¸µç ÈÄ (15-16Çà) element¸¦ »ý¼ºÇÏ°í ¸¶Áö¸·À¸·Î À̸§°ú À̸§°ø°£ URI¸¦ ³ªÁß¿¡ ¼³Á¤ÇÑ´Ù. (18-21Çà)

Listing 11. XPP ¼öÁ¤ ¸Þ¼Òµå

 1  protected void modifyElement(XmlNode element) throws Exception {

 2    // loop through child nodes
 3    for (int i = 0; i < element.getChildrenCount(); i++) {

 4      // handle child by node type
 5      Object child = element.getChildAt(i);
 6      if (child instanceof String) {

 7        // trim whitespace from content text
 8        String trimmed = child.toString().trim();
 9        if (trimmed.length() == 0) {

10          // delete child if only whitespace (adjusting index)
11          element.removeChildAt(i--);

12        } else {

13          // construct qualified name for wrapper element
15          String prefix = element.getPrefix();
16          String name = (prefix == null) ? "text" : (prefix + ":text");

17          // wrap the trimmed content with new element
18          XmlNode text = m_parserFactory.newNode();
19          text.appendChild(trimmed);
20          element.replaceChildAt(i, text);
21          text.modifyTag(element.getNamespaceUri(), "text", name);

22        }
23      } else if (child instanceof XmlNode) {

24        // handle child elements with recursive call
25        modifyElement((XmlNode)child);

26      }
27    }
28  }

°á·Ð

JDOM, dom4j ¹× Electric XMLÀº ÀÌ ÄÚµå »ùÇõ鿡¼­ ¸ðµÎ »ç¿ë ¿ëÀ̼ºÀÌ °ÅÀÇ ºñ½ÁÇÑ °ÍÀ¸·Î º¸ÀδÙ. ¾Æ¸¶µµ EXMLÀÌ °¡Àå ½±°í dom4j°¡ ´õ ¾î·Æ´Ù°í ÇÒ ¼ö Àִµ¥, ÀÛÀº Â÷ÀÌÀÌ´Ù. DOMÀº ¾ð¾î¿¡ µ¶¸³ÀûÀ̶ó´Â ¸Å¿ì ½ÇÁúÀûÀÎ ÀÌÁ¡À» Á¦°øÇÏÁö¸¸, ¿©·¯ºÐÀÌ ÀÚ¹Ù ÄÚµå·Î¸¸ ÀÛ¾÷ÇÏ°í ÀÖ´Ù¸é ÀÚ¹Ù¿¡ ƯȭµÈ ¸ðµ¨µé°ú ºñ±³ÇßÀ» ¶§ Á¶±Ý ´õ ¼º°¡½Å °Íó·³ º¸ÀδÙ. ³ª´Â ÀÌ Á¡ÀÌ ÀÚ¹Ù Äڵ忡¼­ XML ¹®¼­ 󸮸¦ ´Ü¼øÈ­½ÃŲ´Ù´Â ¸ñÇ¥¸¦ ´Þ¼ºÇϴµ¥ ÀÚ¹Ù¿¡ ƯȭµÈ ¸ðµ¨ÀÌ ÀϹÝÀûÀ¸·Î ´õ ¼º°øÀûÀ̶ó´Â °ÍÀ» º¸¿©ÁØ´Ù°í »ý°¢ÇÑ´Ù.

±âº»À» ³Ñ¾î¼­- ½Ç¼¼°è¿¡¼­ÀÇ »ç¿ëÀÇ ¿ëÀ̼º

ÄÚµå »ùÇÃÀº JDOM°ú EXMLÀÌ ±âº»ÀûÀÎ ¹®¼­ Á¶ÀÛ (element, ¼Ó¼º, ÅؽºÆ®¸¦ »ç¿ëÇÑ ÀÛ¾÷)À» À§ÇÑ °£´ÜÇÏ°í ¸»²ûÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÔÀ» º¸¿©ÁØ´Ù. ³» °æÇè¿¡ µû¸£¸é À̵éÀÇ ¹æ½ÄÀº Àüü ¹®¼­ Ç¥Çö¹ýÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¡¹Ö ÀÛ¾÷¿¡´Â Àß ¸ÂÁö ¾Ê´Â´Ù. ÀÌ·± À¯ÇüÀÇ ÀÛ¾÷¿¡ ´ëÇؼ­´Â ¼Ó¼º¿¡¼­ À̸§°ø°£±îÁö ¸ðµç ¹®¼­ ÄÄÆ÷³ÍÆ®°¡ ¸î °¡Áö °øÅëµÈ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â, DOM°ú dom4jÀÇ ÄÄÆ÷³ÍÆ® ¹æ½ÄÀÌ ÈξÀ ÀûÇÕÇÏ´Ù.

ÀÌ·¯ÇÑ °æ¿ì·Î ³»°¡ ÃÖ±Ù¿¡ JDOM°ú dom4j¿¡ ±¸ÇöÇÑ XML Streaming (XMLS) ÀÎÄÚµùÀ» µé ¼ö ÀÖ´Ù. ÀÌ ÄÚµå´Â Àüü ¹®¼­¿¡ Àû¿ëµÇ°í °¢ ÄÄÆ÷³ÍÆ®¸¦ ÀÎÄÚµùÇÑ´Ù. JDOM ±¸ÇöÀº dom4j ±¸Çöº¸´Ù ÈξÀ ´õ º¹ÀâÇѵ¥, ÀÌ´Â ÁÖ·Î JDOMÀÌ °¢ ÄÄÆ÷³ÍÆ®¸¦ ³ªÅ¸³»´Â °øÅë ÀÎÅÍÆäÀ̽º°¡ ¾ø´Â µ¶Æ¯ÇÑ Å¬·¡½º¸¦ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù.

JDOMÀº °øÅë ÀÎÅÍÆäÀ̽º°¡ ¾ø±â ¶§¹®¿¡ Document °´Ã¼¿Í ÀÛ¾÷Çϱâ À§ÇÑ Äڵ尡 Element °´Ã¼¿Í ÀÛ¾÷Çϱâ À§ÇÑ ÄÚµå¿Í ´Þ¶ó¾ß ÇÑ´Ù. µÑ ´Ù ÀϺΠ°°Àº À¯ÇüÀÇ ÄÄÆ÷³ÍÆ®¸¦ ÀÚ½ÄÀ¸·Î °¡Áú ¼ö ÀÖÁö¸¸ ¸»ÀÌ´Ù.´Ù¸¥ À¯ÇüÀÇ ÀڽĿ¡ ´ëºñÇÏ¿© Namespace ÄÄÆ÷³ÍÆ®¸¦ °Ë»öÇϱâ À§ÇÑ Æ¯¼ö ¸Þ¼Òµå ¿ª½Ã ÇÊ¿äÇÏ´Ù. ÄÁÅÙÆ®·Î °£ÁֵǴ ÀÚ½Ä ÄÄÆ÷³ÍÆ® À¯ÇüÀ» ó¸®ÇÒ ¶§¿¡µµ ¿©·¯ºÐÀº ÄÄÆ÷³ÍÆ® À¯Çü¿¡ ±ò²ûÇÏ°í ºü¸¥ switch ¹® ´ë½Å¿¡ instanceof üũ¸¦ °¡Áø ¿©·¯ °³ÀÇ if ¹®À» »ç¿ëÇØ¾ß ÇÑ´Ù.

JDOMÀÇ ¿ø·¡ ¸ñÇ¥ Áß Çϳª°¡ ÀÎÅÍÆäÀ̽º¿¡ »ó´çÈ÷ ±â¹ÝÇÏ°í ÀÖ´Â ÀÚ¹Ù Collections Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â °ÍÀ̾ú´Ù´Â Á¡ÀÌ ¾Æ´Ï·¯´ÏÄÃÇÏ´Ù. ÀÎÅÍÆäÀ̽º¸¦ ¶óÀ̺귯¸®¿¡ »ç¿ëÇÏ¸é º¹À⼺ÀÌ ¾à°£ Ãß°¡µÇ´Â ´ë½Å À¯¿¬¼ºÀÌ »ó´çÈ÷ ³ô¾ÆÁö°í, ÀÌ°ÍÀº Àç»ç¿ë °¡´ÉÇϵµ·Ï ¼³°èµÈ Äڵ忡¼­´Â ÇÒ¸¸ÇÑ °Å·¡ÀÌ´Ù. ÀÌ Á¡Àº ¶ÇÇÑ dom4j°¡ JDOMº¸´Ù ÈξÀ »¡¸® ¼º¼÷µÇ°í ¾ÈÁ¤µÈ »óÅ¿¡ µµ´ÞÇÏ°Ô Çϴµ¥ »ó´çÈ÷ ±â¿©Çß´Ù.

±×·¯³ª DOMÀº ¿©·¯ ¾ð¾îµé·Î ÀÛ¾÷ÇÏ´Â °³¹ßÀڵ鿡°Ô ¿©ÀüÈ÷ ¸¹ÀÌ ¼±Åõǰí ÀÖ´Ù. DOM ±¸ÇöÀº ´Ù¾çÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾îµé¿¡¼­ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¶ÇÇÑ ¸¹Àº ´Ù¸¥ XML °ü·Ã Ç¥ÁØÀÇ ±âÃÊ°¡ µÇ°í ÀÖ´Ù. µû¶ó¼­ ¿©·¯ºÐÀÌ ÀÚ¹Ù¿¡ ƯȭµÈ ¸ðµ¨À» »ç¿ëÇÏ´õ¶óµµ DOM¿¡ ´ëÇØ Àû¾îµµ °£´ÜÇÏ°Ô³ª¸¶ ¾Ë°í ÀÖ¾î¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÌ´Ù. DOMÀº °ø½ÄÀûÀÎ W3C ±Ç°í¾ÈÀ̱⠶§¹®¿¡ (´Ù¸¥ ºñÇ¥ÁØ ÀÚ¹Ù ¸ðµ¨°ú ´Þ¸®) ƯÁ¤ À¯ÇüÀÇ ÇÁ·ÎÁ§Æ®¿¡¼­ ¿ä±¸µÇ±âµµ ÇÑ´Ù.

»ç¿ëÀÇ ¿ëÀ̼º Ä«Å×°í¸®¿¡¼­ °æÀïÇÏ´Â ¼¼ ¸ðµ¨ Áß¿¡ dom4j´Â ¿©·¯ °èÃþÀ¸·Î µÈ »ó¼ÓÀ» °¡Áø ÀÎÅÍÆäÀ̽º ±â¹ÝÀÇ ¹æ½ÄÀ» »ç¿ëÇÑ´Ù´Â Á¡¿¡¼­ ³ª¸ÓÁö °Íµé°ú ´Ù¸£´Ù. ÀÌ Á¡Àº API JavaDocs¸¦ µû¸£´Â °ÍÀ» Á» ´õ ¾î·Æ°Ô ¸¸µé ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ¿©·¯ºÐÀÌ Ã£°í ÀÖ´Â ¸Þ¼Òµå (¿ì¸®ÀÇ dom4j ¼öÁ¤ ¸Þ¼Òµå ¿¹Á¦ÀÇ 3Çà¿¡ »ç¿ëµÈ content()¿Í °°Àº)´Â Element ÀÎÅÍÆäÀ̽º ÀÚüÀÇ ºÎºÐÀ̶ó±âº¸´Ù Element°¡ È®ÀåÇÏ´Â Branch ÀÎÅÍÆäÀ̽ºÀÇ ºÎºÐÀÏ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º ±â¹Ý ¼³°è´Â ¸¹Àº À¯¿¬¼ºÀ» ´õÇØÁØ´Ù (º¸Á¶ ÀÚ·á ±âº»À» ³Ñ¾î¼­ : ½Ç¼¼°è¿¡¼­ÀÇ »ç¿ëÀÇ ¿ëÀ̼º ÂüÁ¶). dom4jÀÇ ¼º´É, ¾ÈÁ¤¼º, ±â´É¸é¿¡¼­ÀÇ ÀÌÁ¡À» º¼ ¶§ ¿©·¯ºÐÀº À̸¦ ´ëºÎºÐÀÇ ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ °­·ÂÇÑ È帷Π°í·ÁÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

JDOMÀº ÀÚ¹Ù¿¡ ƯȭµÈ ¹®¼­ ¸ðµ¨ Áß ¾Æ¸¶µµ °¡Àå Å« »ç¿ëÀÚ ÃþÀ» °¡Áö°í ÀÖ°í ºÐ¸íÈ÷ »ç¿ëÀÌ °¡Àå ½¬¿î °Í Áß ÇϳªÀÏ °ÍÀÌ´Ù. ±×·¯³ª ÇÁ·ÎÁ§Æ® °³¹ß¿ëÀ¸·Î ¼±Á¤µÉ ¶§ JDOMÀº ¾ÆÁ÷ À¯µ¿ÀûÀÌ°í ¹öÀü¸¶´Ù º¯È­°¡ Å« API¸¦ °¡Áö°í ÀÖ´Ù´Â Á¡ ¶§¹®¿¡ ºÒ¸®ÇÏ´Ù. ¶ÇÇÑ ¼º´É ºñ±³¿¡¼­µµ ³·Àº Á¡¼ö¸¦ ¹Þ¾Ò´Ù. ÇöÀç ³ª¿Í ÀÖ´Â ±¸ÇöÀ¸·Î º¼ ¶§ ³ª´Â »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ ½ÃÀÛÇÏ´Â »ç¶÷µé¿¡°Ô JDOMº¸´Ù´Â dom4j¸¦ ±ÇÇÑ´Ù.

XPP¸¦ Á¦¿ÜÇÏ°í´Â ´Ù¸¥ ¸ðµ¨µéº¸´Ù ÈξÀ ÀûÀº ÀÚ¿øÀ» ÇÊ¿ä·Î ÇÏ°í ÈǸ¢ÇÑ »ç¿ë ¿ëÀ̼ºÀ» Á¦°øÇÏ´Â EXMLÀÇ ÀÌÁ¡À» »ý°¢ÇÒ ¶§ ¿©·¯ºÐÀº ºÐ¸íÈ÷ jar ÆÄÀÏ »çÀÌÁî°¡ Áß¿äÇÑ ¿ä¼ÒÀÎ ¾ÖÇø®ÄÉÀ̼ǿ¡ EXMLÀÇ »ç¿ëÀ» °í·ÁÇØ¾ß ÇÑ´Ù. ±×·¯³ª EXMLÀÇ XML Áö¿ø ±â´ÉÀÇ ÇÑ°è¿Í Á¦ÇÑµÈ ¶óÀ̼±½º´Â ´ë´ÜÀ§ ÆÄÀÏ¿¡¼­ÀÇ »ó´ëÀûÀ¸·Î ³·Àº ¼º´É°ú ÇÔ²² ¸¹Àº ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ EXMLÀ» ºÒ¸®ÇÏ°Ô ¸¸µå´Â ¿äÀÎÀÌ µÇ°í ÀÖ´Ù.

XPP´Â parsing¿Í ÅؽºÆ® ¹®¼­ ÀÛ¼º, À̸§ °ø°£ ÀÛ¾÷¿¡ ¸¹Àº ´Ü°è°¡ ÇÊ¿äÇÏ´Ù´Â Á¡ ¶§¹®¿¡ ºÒ¸®ÇÏ´Ù. XPP°¡ ÀÌ·¯ÇÑ ¸î °¡Áö ÀϹÝÀûÀÎ »çÇ×µéÀ» ó¸®Çϴµ¥ Á» ´õ Æí¸®ÇÑ ¹æ¹ýÀ» Ãß°¡ÇÑ´Ù¸é ¾Æ¸¶µµ ºñ±³¿¡¼­ ´õ ³ªÀº Æò°¡¸¦ ¹ÞÀ» °ÍÀÌ´Ù. ÇöÀç·Î½á´Â Áö³­¹ø ±Û¿¡¼­ ¼º´ÉÀÇ ¼±µÎ ÁÖÀÚ¿´Áö¸¸ À̹ø ±ÛÀÇ »ç¿ë ¿ëÀ̼º ºÐ¾ß¿¡¼­´Â ÆÐÀÚ°¡ µÇ¾ú´Ù. ±×·¯³ª ¼º´É»óÀÇ ÀÌÁ¡À» °í·ÁÇÒ ¶§ ÀûÀº jar ÆÄÀÏ »çÀÌÁî°¡ ÇÊ¿äÇÑ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ EXML¿¡ ´ëÇÑ ´ë¾ÈÀ¸·Î ¿©ÀüÈ÷ °í·ÁÇØ º¼¸¸ÇÏ´Ù.

´ÙÀ½ ȸ¿¡´Â...

Áö±Ý±îÁö µÎ ÆíÀÇ ±Û¿¡¼­ ³ª´Â ÀÚ¹Ù·Î µÈ XML ¹®¼­ ¸ðµ¨µéÀÇ ¼º´É°ú »ç¿ë ¿ëÀ̼ºÀ» ´Ù·ç¾ú´Ù. ÀÌ ½Ã¸®ÁîÀÇ ´ÙÀ½ µÎ ±Û¿¡¼­ ³ª´Â ÀÚ¹Ù ±â¼ú¿¡¼­ÀÇ XML µ¥ÀÌÅÍ ¹ÙÀεù ¹æ½ÄµéÀ» »ìÆ캸°Ú´Ù. À̵éÀº ¹®¼­ ¸ðµ¨ ¹æ½Ä°ú ¸¹Àº À¯»çÁ¡À» °¡Áö°í ÀÖÁö¸¸, XML ¹®¼­¸¦ ½ÇÁ¦ ¾ÖÇø®ÄÉÀÌ¼Ç µ¥ÀÌÅÍ ±¸Á¶·Î ¸ÅÇνÃÅ´À¸·Î½á ÇÑ ´Ü°è ´õ ³ª¾Æ°£´Ù. ¿ì¸®´Â À̵éÀÌ »ç¿ë ¿ëÀ̼º°ú ¼º´É ºÐ¾ß¿¡¼­ ¾ó¸¶³ª Àß ¼º°ú¸¦ ¿Ã¸®´ÂÁö »ìÆ캼 °ÍÀÌ´Ù.

developerWorks¸¦ üũÇÏ¿© ÀÚ¹Ù Äڵ忡 XML µ¥ÀÌÅ͸¦ ¹ÙÀεù½ÃÅ°´Â °Í¿¡ °üÇÑ ±ÛµéÀ» º¸±â ¹Ù¶õ´Ù.

Âü°í ÀÚ·á

¸ñ Â÷:
ÄÚµå ºñ±³
DOM
JDOM
dom4j
Electric XML
XPP
°á·Ð
´ÙÀ½ ȸ¿¡´Â...
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
ÀÚ¹Ù¿¡¼­ XML ¹®¼­ ¸ðµ¨ÀÇ ¼º´É
Effective DOM with Java
DOM ÀÌÇØÇϱâ Æ©Å丮¾ó
ÀÚ¹Ù¿¡¼­ÀÇ XML ÇÁ·Î±×·¡¹Ö Æ©Å丮¾ó
Subscribe to the developerWorks newsletter
US ¿ø¹® Àбâ
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
ÇÊÀÚ¼Ò°³
author photo -- Dennis Sosnosky Dennis Sosnoski´Â Seattle ¼ÒÀç ÀÚ¹Ù ÄÁ¼³Æà ¾÷üÀÎ Sosnoski Software Solutions, IncÀÇ Ã¢¾÷ÀÚÀÌÀÚ ¼ö¼® ÄÁ¼³ÅÏÆ®ÀÌ´Ù. ±×ÀÇ Àü¹®ÀûÀÎ ¼ÒÇÁÆ®¿þ¾î °³¹ß °æÇèÀº 30³âÀÌ ³Ñ°í, Áö³­ 7³â°£Àº servlets, Enterprise JavaBeans ¹× XMLÀ» Æ÷ÇÔÇÑ ¼­¹öÃø ÀÚ¹Ù ±â¼ú¿¡ Æ÷Ä¿½º¸¦ ¸ÂÃß¾î ¿Ô´Ù. ±×´Â ÀÚ¹ÙÀÇ ¼º´É °ü·Ã »çÇ×µé°ú ¼­¹öÃø ÀÚ¹Ù ±â¼ú¿¡ ´ëÇÑ ¸¹Àº ÇÁ¸®Á¨Å×À̼ÇÀ» ¼öÇàÇÏ¿´°í, Seattle Java-XML SIGÀÇ ÀÇÀåÀ̱⵵ ÇÏ´Ù.
ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ
odifyElement(Element element) {