»óÀÌÇÑ ÀÚ¹Ù 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 µ¥ÀÌÅ͸¦ ¹ÙÀεù½ÃÅ°´Â °Í¿¡ °üÇÑ ±ÛµéÀ» º¸±â
¹Ù¶õ´Ù.
Âü°í ÀÚ·á
|