|
|
|
| [Æß] XML - SAX °ú DOM API »ç¿ë |
2007-03-08 22:48:37 |
|
À̸§ : ¹æÇѹΠ(210.115.¢½.¢½) Á¶È¸ : 2105 |
|
º» ÀÚ·á´Â http://www.javastudy.co.kr/ ¿¡¼ ÆÛ¿Â±ÛÀÔ´Ï´Ù.
¹Ú Çü ÁØ [hjpark@shift.co.kr]
ÀÚ¹Ù½ºÅ͵ð ³×Æ®¿öÅ© [http://javastudy.co.kr]
XMLÀÇ ¼Ò°³
Extensible Markup Language (XML)Àº À¥ ºê¶ó¿ìÁ®¸¦ ÅëÇØ ÇÑ ÆäÀÌÁöÀÇ ³»¿ë ¿ä¼ÒµéÀ» ±¸ºÐÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. XMLÀÇ ¹®¹ýÀº HTML°ú ºñ½ÁÇÕ´Ï´Ù. »ç½Ç, XMLÀº HTMLÀÌ ¾²ÀÌ´Â ¿©·¯ °÷¿¡¼ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡¿¡ ¿¹°¡ ÀÖ½À´Ï´Ù. JDC Tech TipÀÇ ¸ñÂ÷°¡ HTMLÀÌ ¾Æ´Ï¶ó XML·Î ÀúÀåµÇ¾î ÀÖ´Ù°í °¡Á¤ÇսôÙ. ¾Æ·¡¿Í °°Àº HTML ÄÚµå ´ë½Å
<html>
<body>
<h1>JDC Tech Tip Index</h1>
<ol><li>
<a
href="http://developer.java.sun.com/developer/TechTips/2000/tt0509.html#tip1">
Random Access for Files
</a>
</li></ol>
</body>
</html>
¾Æ·¡¿Í °°ÀÌ ³ªÅ¸³³´Ï´Ù.
<?xml version="1.0" encoding="UTF-8"?>
<tips>
<author id="glen" fullName="Glen McCluskey"/>
<tip title="Random Access for Files"
author="glen"
htmlURL="http://developer.java.sun.com/developer/TechTips/2000/tt0509.html#tip1"
textURL="http://developer.java.sun.com/developer/TechTips/txtarchive/May00_GlenM.txt">
</tip>
</tips>
XML°ú HTMLÀÇ ÄÚµå »çÀÌÀÇ À¯»ç¼ºÀ» º¸½Ê½Ã¿À. µÎ°¡Áö ¸ðµÎ ¹®¼°¡ °èÃþÀû ¿¤¸®¸ÕÆ®·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç, ¾ó·¹¸ÕÆ®´Â ²ªÀ½ °ýÈ£·Î ±¸ºÐµÇ¾î ÀÖ½À´Ï´Ù.HTML ¿¤¸®¸ÕÆ®°¡ °ÅÀÇ ±×·¸µíÀÌ, XML ¿¤¸®¸ÕÆ®´Â ½ÃÀÛ ÅÂ±×¿Í ±× µÚ¿¡ ³ªÅ¸³ª´Â µ¥ÀÌÅÍ, ±×¸®°í ³¡ ű׷Π±¸¼ºµÇ¾î ÀÖ½À´Ï´Ù.
<element>element data</element>
¿ª½Ã HTML°ú ¸¶Âù°¡Áö·Î, XML ¿¤¸®¸ÕÆ®´Â ¼Ó¼ºÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ XMLÀÇ ¿¹¿¡¼, °¢ <tip> ¿¤¸®¸ÕÆ®´Â ¸î°³ÀÇ ¼Ó¼ºÀ» °®°í ÀÖ½À´Ï´Ù. 'title' ¼Ó¼ºÀº ÆÁÀÇ À̸§À» ³ªÅ¸³»¸ç, 'author' ¼Ó¼ºÀº ÀúÀÚÀÇ À̸§À» ³ªÅ¸³À´Ï´Ù. ±×¸®°í 'htmlURL'°ú 'textURL' ¼Ó¼ºÀº µÎ°¡ÁöÀÇ ´Ù¸¥ Çü½ÄÀ¸·Î ÀúÀåµÈ ÆÁÀÇ ¸µÅ©¸¦ ³ªÅ¸³À´Ï´Ù.
µÎ°³ÀÇ ¸¶Å©¾÷ ¾ð¾î »çÀÌÀÇ À¯»çÁ¡Àº HTML¿¡¼ XML·Î ¿Å°Ü°¡´Âµ¥ ¾ÆÁÖ Áß¿äÇÑ ÀåÁ¡ÀÔ´Ï´Ù. ¾î·Æ°Ô ½ÀµæÇÑ HTML ±â¼úµéÀ» ±×´ë·Î ÀÌ¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ±×·¯³ª, "¿Ö XML·Î ¹Ù²Ù¶ó°í ÇØ¼ °í»ýÇÏ°Ô ¸¸µéÁö?"¶ó´Â Àǹ®ÀÌ µé°ÍÀÔ´Ï´Ù. ÀÌ Àǹ®¿¡ ´ëÇÑ ´ë´äÀ¸·Î, À§ÀÇ XML ¿¹¸¦ ´Ù½Ã Çѹø º¸½Ê½Ã¿À. ±×¸®°í ¹®¹ýÀûÀÎ Ãø¸éÀÌ ¾Æ´Ï¶ó ÀǹÌÀûÀÎ Ãø¸é¿¡¼ »ìÆìº¸½Ê½Ã¿À. HTMLÀº ¹®¼¸¦ ¾î¶»°Ô Çü½ÄÈÇÏ´ÂÁö¸¦ ¸»ÇØÁÖÁö¸¸, XMLÀº ¹®¼ÀÇ ³»¿ë¿¡ ´ëÇØ ¸»ÇØÁÝ´Ï´Ù. ÀÌ ´É·ÂÀº ¸Å¿ì °·ÂÇÑ °ÍÀÔ´Ï´Ù. XML¿¡¼, Ŭ¶óÀÌ¾ðÆ®´Â ±× µ¥ÀÌÅ͸¦ Àڽſ¡°Ô °¡Àå ÀûÇÕÇÑ Çü½ÄÀ¸·Î À籸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼¹ö°¡ Á¦°øÇÏ´Â Ãâ·Â ¾ç½Ä¿¡ ±¸¾Ö¹ÞÁö ¾Ê½À´Ï´Ù. Áß¿äÇѰÍÀº, XML Çü½ÄÀº °¡µ¶¼ºÀ» Èñ»ý½ÃŰÁö ¾ÊÀ¸¸é¼µµ ÆÄ¼ÀÇ ÆíÀǸ¦ À§ÇØ ¼³°èµÇ¾ú´Ù´Â °ÍÀÔ´Ï´Ù. XMLÀº ¹®¼ÀÇ ±¸Á¶¿¡ ´ëÇØ ¹Ýµå½Ã ÁöÄÑ¾ß ÇÒ ¾à¼ÓÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ¸î°¡Áö¸¦ º¸ÀÚ¸é, ½ÃÀÛ Å±״ ¾ðÁ¦³ª ³¡ ű׸¦ °¡Áö°í ÀÖ¾î¾ß Çϸç, ¿¤¸®¸ÕÆ®´Â Á¤È®È÷ ³»Æ÷°ü°è¸¦ °¡Á®¾ß Çϰí, ¸ðµç ¼Ó¼ºÀº °ªÀ» °¡Á®¾ß ÇÕ´Ï´Ù. ÀÌ·± ¾ö°ÝÇÔÀº XML ¹®¼ÀÇ ÆÄ½Ì°ú º¯È¯À» HTMLÀÇ º¯È¯¿¡ ºñÇØ¼ ³ôÀº ½Å·Ú¼ºÀ» °®°Ô ÇÕ´Ï´Ù.
XML°ú HTMLÀÇ À¯»ç¼ºÀº ±× ½ÃÀÛÀÌ °®±â ¶§¹®¿¡ »ý±é´Ï´Ù. HTMLÀº °·ÂÇÑ ¸¶Å©¾÷ ¾ð¾îÀÎ SGMLÀ» °£·«ÈÇÑ °ÍÀÔ´Ï´Ù. SGMLÀº °³¹ßÀÚ°¡ ÀڽŸ¸ÀÇ ¾îÈÖ, Áï ¹®¹ý/ÅÂ±× µîÀ» ¸¸µé¾î³¾ ¼öµµ ÀÖ´Â, °ÅÀÇ ¹«¾ùÀ̵çÁö ÇÒ ¼ö ÀÖ´Â "ÁÖ¹æÀÇ ½ÌÅ©´ë"°°Àº ¸¶Å©¾÷ ¾ð¾îÀÔ´Ï´Ù. HTMLÀº ¹Ì¸® Á¤ÀÇµÈ ¾îÈÖ¸¦ °¡Áø, SGML¿¡ ´ëÇÑ ¾ÆÁÖ ÀÛÀº ºÎºÐÀÔ´Ï´Ù. µû¶ó¼ HTMLÀº ´ë·« 1992³â °æ¿¡³ª ¾µ¸¸Çß´ø, Ç¥ÇöÀ» À§ÇÑ ¿ä¼ÒµéÀÔ´Ï´Ù. SGML°ú HTMLÀº ¸ðµÎ ¹®Á¦°¡ ÀÖ½À´Ï´Ù. SGMLÀº ¸ðµç°ÍÀ» ÇÕ´Ï´Ù. ±×·¡¼ ¾ÆÁÖ º¹ÀâÇÕ´Ï´Ù. HTMLÀº °£´ÜÇÕ´Ï´Ù. ±×·¯³ª ÆÄ½Ì ±ÔÄ¢ÀÌ ¾û¼ºÇϰí, ¾îÈÖ´Â È®ÀåÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ¿¡ ºñÇØ XMLÀº SGMLÀ» ÇÕ¸®ÀûÀ¸·Î °£·«ÈÇß½À´Ï´Ù. À̰ÍÀÇ ¸ñÀûÀº º¹ÀâÇÏÁö ¾ÊÀ¸¸é¼µµ SGMLÀÇ Áß¿äÇÑ ¸ñÀûÀ» ¸ðµÎ Áö¿øÇÕ´Ï´Ù. SGMLÀÌ "ÁÖ¹æÀÇ ½ÌÅ©´ë"¶ó¸é XMLÀº "½ºÀ§½º ¾Æ¹Ì ³ªÀÌÇÁ-¸Æ°¡À̹öÄ®... -_-" ÀÔ´Ï´Ù.
ÀÌ·± ÀåÁ¡ ¶§¹®¿¡, XMLÀº ¸î°¡Áö ÀÀ¿ë ºÐ¾ß¿¡¼´Â HTMLÀ» ´ëüÇÏ´Â°Í ÀÌ»óÀÇ ÀÏÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº SGMLÀ» ´ëüÇÒ ¼öµµ ÀÖÀ¸¸ç, SGMLÀÇ º¹À⼺ ¶§¹®¿¡ Àû¿ëÀÌ ºÒ°¡´ÉÇß´ø ºÐ¾ß¿¡ ´ëÇÑ »õ·Î¿î ¹æ¹ýÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. XMLÀ» ¾îµð¿¡ ¾µ °ÍÀÎÁö¿¡ °ü°è¾øÀÌ, ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â ÀÚ¹Ù¸¦ ÀÌ¿ëÇÒ °ÍÀÔ´Ï´Ù. ÀÚ¹Ù ¾ð¾î´Â Simple API for XML (SAX)¿Í Document Object Model (DOM) ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ¿© XML ¹®¼¸¦ ÆÄ½ÌÇϱâ À§ÇÑ °í¼öÁØÀÇ µµ±¸¸¦ Á¦°øÇϱ⠶§¹®¿¡, XMLÀ» Á÷Á¢ ÆÄ½ÌÇϱâ À§ÇÑ ÀڽŸ¸ÀÇ Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. SAX¿Í DOM ÆÄ¼´Â ´Ù¸¥ ¸î°¡Áö ¾ð¾î¿¡¼µµ ±¸ÇöÇÑ Ç¥ÁØÀÔ´Ï´Ù. ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼, Java(tm) API for XML Parsing (JAXP)¸¦ ÀÌ¿ëÇØ¼ ÀÌ·± ÆÄ¼µéÀ» ÀνºÅϽºÈ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ ÆÁÀÇ Äڵ带 ½ÇÇàÇÏ·Á¸é, http://java.sun.com/xml/download.html¿¡¼ JAXP¿Í SAX/DOM ÆÄ¼¸¦ ´Ù¿î·Îµå ¹Þ¾Æ¾ß ÇÕ´Ï´Ù. ±×¸®°í http://www.megginson.com/SAX/Java¿¡¼ SAX 2.0µµ ´Ù¿î·Îµå ¹Þ¾Æ¾ß ÇÕ´Ï´Ù. ±×¸®°í classpath¸¦ jaxp, ÆÄ¼, ±×¸®°í sax2ÀÇ JAR ÆÄÀÏÀ» Æ÷ÇÔÇϵµ·Ï °íÄ¡´Â °ÍÀ» ÀØÁö ¸¶½Ê½Ã¿À.
¡¡
--------------------------------------------------------------------------------
¡¡
SAX APIÀÇ ÀÌ¿ë
SAX API´Â XML ¹®¼¸¦ ´Ù·ç±â À§ÇÑ Á÷·Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÕ´Ï´Ù. À̰ÍÀº XML-DEV ¸ÞÀϸµ ¸®½ºÆ®ÀÇ ¸â¹öµé¿¡ ÀÇÇØ ¼·Î ´Ù¸¥ º¥´õµéÀÌ ±¸ÇöÇÒ ¼ö Àִ ǥÁØ ÀÎÅÍÆäÀ̽ºÀÇ ÁýÇÕÀ¸·Î °³¹ßµÇ¾ú½À´Ï´Ù. SAX ¸ðµ¨Àº ÆÄ¼°¡ ¹®¼¸¦ Àо°¡¸é¼ ¸¶Å©¾÷À» ¸¸³ª¸é À̺¥Æ® Çڵ鷯¸¦ È£ÃâÇÏ´Â Çü½ÄÀ¸·Î ÆÄ½ÌÇϵµ·Ï ÇÕ´Ï´Ù. SAXÀÇ Ã¹¹øÂ° ±¸ÇöÀº 1998³â 5¿ù¿¡ ³ª¿Ô½À´Ï´Ù. ±×¸®°í SAX 2.0Àº 2000³â 5¿ù¿¡ ³ª¿Ô½À´Ï´Ù. (ÀÌ ÆÁ¿¡¼ »ç¿ëµÈ ÄÚµåµéÀº SAX2¿ëÀÔ´Ï´Ù.)
¸¶Å©¾÷ ¹ß»ý¿¡ ´ëÇÑ ½ÅÈ£¸¦ À§ÇØ SAX2¸¦ »ç¿ëÇÒ ¶§ ÇÒ ÀÏÀº, ¸î°³ÀÇ ¸Þ¼Òµå¿Í ÀÎÅÍÆäÀ̽º¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽ºµé¿¡¼ ContentHandler ÀÎÅÍÆäÀ̽º°¡ °¡Àå Áß¿äÇÕ´Ï´Ù. À̰ÍÀº XML ¹®¼¸¦ ÆÄ½ÌÇϱâ À§ÇÑ °¢°¢ÀÇ ´Ü°èµéÀ» À§ÇÑ ¸î°³ÀÇ ¸Þ¼Òµå¸¦ ¼±¾ðÇÕ´Ï´Ù. ¸¹Àº °æ¿ì, ÀÌ·± ¸Þ¼Òµå Áß¿¡¼ ¸î°³¸¸ ÀÌ¿ëÇÏ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î, ¾Æ·¡ÀÇ ÄÚµå´Â ÇϳªÀÇ ContentHandler ¸Þ¼Òµå (startElement)¸¸À» ÀÌ¿ëÇϸç, À̰ÍÀ» ÀÌ¿ëÇÏ¿© XML Tech Tip ¸ñ·Ï¿¡¼ HTML ÆäÀÌÁö¸¦ »ý¼ºÇÕ´Ï´Ù.
import java.io.*;
import java.net.*;
import java.util.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
/**
* ÆÁÀÇ Á¦¸ñµéÀÇ ¸ñ·ÏÀ» º¸¿©ÁÖ°í ÀÌ¿¡ ´ëÇÑ HTML°ú text ¹öÁ¯ÀÇ ¹®¼¿¡
* ¿¬°áÇÏ´Â °£´ÜÇÑ HTML ÆäÀÌÁö¸¦ »ý¼ºÇÑ´Ù.
*/
public class UseSAX2 extends DefaultHandler
{
StringBuffer htmlOut;
public String toString()
{
if (htmlOut != null)
return htmlOut.toString();
return super.toString();
}
public void startElement(String namespace, String localName, String qName, Attributes atts)
{
if (localName.equals("tip"))
{
String title = atts.getValue("title");
String html = atts.getValue("htmlURL");
String text = atts.getValue("textURL");
htmlOut.append("<br>");
htmlOut.append("<A HREF=");
htmlOut.append(html);
htmlOut.append(">HTML</A> <A HREF=");
htmlOut.append(text);
htmlOut.append(">TEXT</A> ");
htmlOut.append(title);
}
}
public void processWithSAX(String urlString) throws Exception
{
System.out.println("Processing URL " + urlString);
htmlOut = new StringBuffer("<HTML><BODY><H1>JDC Tech Tips Archive</H1>");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
ParserAdapter pa = new ParserAdapter(sp.getParser());
pa.setContentHandler(this);
pa.parse(urlString);
htmlOut.append("</BODY></HTML>");
}
public static void main(String[] args)
{
try
{
UseSAX2 us = new UseSAX2();
us.processWithSAX(args[0]);
String output = us.toString();
System.out.println("Saving result to " + args[1]);
FileWriter fw = new FileWriter(args[1]);
fw.write(output, 0, output.length());
fw.flush();
}
catch (Throwable t)
{
t.printStackTrace();
}
}
}
ÀÌ ÇÁ·Î±×·¥À» Å×½ºÆ®Çϱâ À§ÇØ, ÀÌ ÆÁÀÇ ¾ÕºÎºÐÀÇ XMLÀÇ ¼Ò°³¿¡ ÀÖ´Â XML ¹®¼¸¦ ÀÌ¿ëÇϰųª, http://staff.develop.com/halloway/TechTips/TechTipArchive.xml¿¡ ÀÖ´Â Á¶±Ý ´õ ±ä ¹®¼¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ¹ÞÀº XML ¹®¼¸¦ ÄÄÇ»ÅÍÀÇ ·ÎÄà µð·ºÅ丮¿¡ TechtipArchive.xml·Î ÀúÀåÇϽʽÿÀ. ¾Æ·¡¿Í °°Àº ¸í·É¾î·Î HTML ¹®¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
java UseSAX2 file:TechTipArchive.xml SimpleList.html
±×¸®°í SimpleList.htmlÀ» À¥ºê¶ó¿ìÁ®¸¦ ÅëÇØ¼ º¸°í, ÃÖ±Ù ÆÁÀÇ ÅØ½ºÆ® ¹öÁ¯°ú HTML ¹öÁ¯ÀÇ ¸µÅ©¸¦ µû¶ó°¡ º¸½Ê½Ã¿À. (½ÇÁ¦ ½Ã³ª¸®¿À´Â À§ÀÇ Äڵ带 Ŭ¶óÀ̾ðÆ®ÀÇ ºê¶ó¿ìÁ®³ª ¼¹öÀÇ ¼ºí¸´/jsp ¾È¿¡ ÇÕÃÄ ³Ö¾î¾ß ÇÒ°ÍÀÔ´Ï´Ù.)
À§ Äڵ忡´Â ¸î°¡Áö Èï¹Ì·Î¿î ºÎºÐÀÌ ÀÖ½À´Ï´Ù. ÆÄ¼¸¦ »ý¼ºÇÏ´Â ºÎºÐÀ» º¸½Ê½Ã¿À.
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
JAXP¿¡¼, SAXParser Ŭ·¡½º´Â Á÷Á¢ »ý¼ºÇÏÁö ¾Ê°í, factory ¸Þ¼ÒµåÀÎ newSAXParser()¸¦ ÀÌ¿ëÇÕ´Ï´Ù. À̰ÍÀº ¼·Î ´Ù¸£°Ô ±¸ÇöµÈ ÄÚµåµéÀÌ ¼Ò½ºÄÚµåÀÇ º¯°æ ¾øÀÌ ³¢¿ö³Ö±â°¡ °¡´ÉÇϵµ·Ï Çϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. factory´Â ÀÌ ¿Ü¿¡µµ namespaceÀÇ Áö¿ø, ÀÎÁõ µîÀÇ Çâ»óµÈ ÆÄ½Ì ¿ä¼ÒµéÀ» Áö¿øÇÕ´Ï´Ù.JAXP ÆÄ¼ÀÇ ÀνºÅϽº¸¦ °¡Áø µÚ¿¡¶óµµ, ¾ÆÁ÷Àº ÆÄ½ÌÇÒ Áغñ°¡ µÇÁö ¾Ê¾Ò½À´Ï´Ù. ÇöÀçÀÇ JAXP ÆÄ¼´Â SAX 1.0¸¸ Áö¿øÇÕ´Ï´Ù. SAX 2.0À» Áö¿øÇϵµ·Ï Çϱâ À§Çؼ, ÆÄ¼¸¦ ParserAdapter·Î °¨½Î¾ß ÇÕ´Ï´Ù.
ParserAdapter pa = new ParserAdapter(sp.getParser());
ParserAdapter Ŭ·¡½º´Â SAX2 ´Ù¿î·ÎµåÀÇ ÀϺκÐÀ̸ç, Áö±Ý ÀÖ´Â SAX1 ÆÄ¼¿¡ SAX2ÀÇ ±â´ÉÀ» Ãß°¡ÇÕ´Ï´Ù.
ContentHandler ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â ´ë½Å, UseSAX´Â DefaultHandler Ŭ·¡½º¸¦ »ó¼Ó¹Þ½À´Ï´Ù. DefaultHandler´Â ¸ðµç ContentHandlerÀÇ ¸Þ¼Òµå¿¡ ´ëÇØ ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â ºñ¾îÀÖ´Â ±¸ÇöÀ» Á¦°øÇÏ´Â ¾î´ðÅÍ Å¬·¡½ºÀÔ´Ï´Ù. µû¶ó¼ ¿À¹ö¶óÀ̵å Çϰí½ÍÀº ¸Þ¼Òµå¸¸ ±¸ÇöÇÏ¸é µË´Ï´Ù.
startElement() ¸Þ¼Òµå°¡ ½ÇÁ¦ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. ÇÁ·Î±×·¥Àº ÆÁÀ» Á¦¸ñ ¸ñ·ÏÀ» º¸¿©ÁÖ¸é µÇ±â ¶§¹®¿¡, <tip> ¿¤¸®¸ÕÆ®¸¸ ÀÖÀ¸¸é µÇ¸ç, <tips>, <author> ¿¤¸®¸ÕÆ®´Â ¹«½ÃÇÕ´Ï´Ù. startElement ¸Þ¼Òµå´Â ¿¤¸®¸ÕÆ®ÀÇ À̸§À» üũÇϰí ÇöÀç ¿¤¸®¸ÕÆ®°¡ <tip>ÀÏ ¶§¿¡¸¸ °è¼ÓÇØ¼ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. ¶Ç ÀÌ ¸Þ¼Òµå´Â ¿¤¸®¸ÕÆ®ÀÇ ¼Ó¼ºÀ» Attributes ·¹ÆÛ·±½º¸¦ ÅëÇØ Á¢±ÙÇϵµ·Ï ÇÕ´Ï´Ù. µû¶ó¼ ÆÁÀÇ À̸§°ú name, htmlURL, textURLÀ» ÃßÃâÇÏ´Â °ÍÀÌ ½±½À´Ï´Ù.
ÀÌ ¿¹ÀÇ °á°ú´Â ÃÖ±ÙÀÇ Tech TipsÀÇ ¸ñ·ÏÀ» º¸¿©ÁÖ´Â HTML ¹®¼ÀÔ´Ï´Ù. HTMLÀ» Á÷Á¢ ¸¸µé¾îµµ µË´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀ» XML·Î Çϰí, SAX Äڵ带 ÀÛ¼ºÇϸé Ãß°¡ÀûÀÎ À¯¿¬¼ºÀ» Á¦°øÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¥ ´©±º°¡ Tech TipÀ» ³¯Â¥º°·Î, ÀúÀÚº°·Î Á¤·ÄÇϰųª ¸î°¡Áö Á¦¾à»çÇ×À» °¡Áö°í ÇÊÅ͸µÀ» ÇϰíÀÚ ÇÑ´Ù¸é, °¢°¢¿¡ ´ëÇÑ ÆÄ½Ì Äڵ带 ÀÌ¿ëÇÏ¿© ÇϳªÀÇ XML ¹®¼¿¡¼ ÇØ´ç ¹®¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
ºÒÇàÈ÷µµ, XML µ¥ÀÌÅͰ¡ º¹ÀâÇØÁü¿¡ µû¶ó, À§ÀÇ »ùÇõµ Á¡Á¡ ÄÚµùÇÏ°í ¼öÁ¤ÇϱⰡ ¾î·Á¿öÁý´Ï´Ù. À§ÀÇ ¿¹´Â µÎ°¡Áö ¹®Á¦¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. ù¹øÂ°´Â, HTML ¹®¼¸¦ »ý¼ºÇϱâ À§ÇÑ Äڵ尡 ´ÜÁö ¹®ÀÚ¿À» Á¶ÀÛÇÏ´Â °Í »ÓÀ̰í, µû¶ó¼ ¾îµò°¡¿¡ ÀÖÀ» '>', '/'¸¦ ³õÁö°Ô µÈ´Ù´Â °ÍÀÔ´Ï´Ù. µÎ¹øÂ°·Î, SAX API´Â ¸¹Àº °ÍÀ» ±â¾ïÇÏÁö ¸øÇÕ´Ï´Ù. Áï, ¾ÕÀÇ ¾îµò°¡¿¡ ÀÖ¾ú´ø ¿¤¸®¸ÕÆ®¸¦ ÂüÁ¶ÇϰíÀÚ ÇÑ´Ù¸é, ¾Õ¿¡¼ ÆÄ½ÌÇÑ ¿¤¸®¸ÕÆ®¸¦ ÀúÀåÇϱâ À§ÇÑ ÀڽŸ¸ÀÇ state machineÀ» ¸¸µé¾î¾ß ÇÑ´Ù´Â ¶æÀÔ´Ï´Ù.
Document Object Model (DOM) API°¡ ÀÌ µÎ°¡Áö ¹®Á¦Á¡À» ÇØ°áÇÕ´Ï´Ù.
¡¡
--------------------------------------------------------------------------------
¡¡
DOM APIÀÇ ÀÌ¿ë
DOM API´Â SAX API¿Í´Â ¿ÏÀüÈ÷ ´Ù¸¥ ¹®¼ ó¸® ¸ðµ¨À» ±â¹ÝÀ¸·Î Çϰí ÀÖ½À´Ï´Ù. (SAX¿Í °°ÀÌ) Çѹø¿¡ ¹®¼ÀÇ ÇÑ ºÎºÐÀ» Àд ´ë½Å, DOM ÆÄ¼´Â ¹®¼ Àüü¸¦ ÀнÀ´Ï´Ù. ±×¸®°í ÀÐ°í ¼öÁ¤ÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥ Äڵ带 ¸¸µé ¼ö ÀÖµµ·Ï ¹®¼ Àüü¸¦ Æ®¸® ±¸Á¶·Î ¸¸µì´Ï´Ù. SAX¿Í DOMÀÇ Â÷ÀÌÁ¡À» °£´ÜÈ÷ ¸»ÇÏÀÚ¸é, ¼øÂ÷Àû/Àбâ Àü¿ë Á¢±Ù°ú ÀÓÀÇ/Àбâ/¾²±â Á¢±ÙÀÇ Â÷ÀÌÀÔ´Ï´Ù.
DOM APIÀÇ ÇÙ½ÉÀº Document¿Í Node ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. Document´Â XML ¹®¼¸¦ ³ªÅ¸³»´Â ÃÖ»óÀ§ °´Ã¼ÀÔ´Ï´Ù. Document´Â µ¥ÀÌÅ͸¦ NodeÀÇ Æ®¸® ÇüÅ·ΠÀúÀåÇϰí ÀÖÀ¸¸ç, Node´Â element, attribute, ¶Ç´Â ´Ù¸¥ ÇüÅÂÀÇ ³»¿ë¹°À» ÀúÀåÇÏ´Â ±âº» ŸÀÔÀÔ´Ï´Ù. ¶Ç, Document´Â »õ·Î¿î Node¸¦ »ý¼ºÇϱâ À§ÇÑ factory·Îµµ µ¿ÀÛÇÕ´Ï´Ù. Node´Â Æ®¸®¿¡¼ÀÇ ÇϳªÀÇ µ¥ÀÌÅ͸¦ Ç¥ÇöÇϸç, Æ®¸®¿¡ ÀÖ¾î¼ÀÇ ÇÊ¿äÇÑ µ¿ÀÛÀ» Á¦°øÇÕ´Ï´Ù. ³ëµå¿¡ ´ëÇØ ±× ºÎ¸ð/ÇüÁ¦/ÀÚ½Ä ³ëµå¸¦ ãÀ» ¼ö ÀÖ½À´Ï´Ù. ¶Ç Node¸¦ Ãß°¡/»èÁ¦ÇÔÀ¸·Î½á ¹®¼¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
DOM APIÀÇ ¿¹Á¦¸¦ º¸±â À§ÇØ, À§ÀÇ SAX¿¡¼ º¸¿©Á³´ø XML ¹®¼¸¦ ó¸®ÇØ º¾½Ã´Ù. À̹ø¿¡´Â ÀúÀÚº°·Î ¹¾î¼ Ãâ·ÂÇÕ´Ï´Ù. À̰ÍÀº ¸î°¡ÁöÀÇ ÀÛ¾÷À» ´õ ÇØ¾ß ÇÕ´Ï´Ù. ¾Æ·¡¿¡ Äڵ尡 ÀÖ½À´Ï´Ù.
//UseDOM.java
import java.io.*;
import java.net.*;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class UseDOM
{
private Document outputDoc;
private Element body;
private Element html;
private HashMap authors = new HashMap ();
public String toString ()
{
if (html != null)
{
return html.toString ();
}
return super.toString();
}
public void processWithDOM (String urlString)
throws Exception
{
System.out.println ("Processing URL " + urlString);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
DocumentBuilder db = dbf.newDocumentBuilder ();
Document doc = db.parse (urlString);
Element elem = doc.getDocumentElement ();
NodeList nl = elem.getElementsByTagName ("author");
for (int n=0; n<nl.getLength (); n++)
{
Element author = (Element)nl.item (n);
String id = author.getAttribute ("id");
String fullName = author.getAttribute ("fullName");
Element h2 = outputDoc.createElement ("H2");
body.appendChild (h2);
h2.appendChild (outputDoc.createTextNode ("by " + fullName));
Element list = outputDoc.createElement ("OL");
body.appendChild (list);
authors.put (id, list);
}
NodeList nlTips = elem.getElementsByTagName ("tip");
for (int i=0; <nlTips.getLength (); i++)
{
Element tip = (Element)nlTips.item (i);
String title = tip.getAttribute ("title");
String htmlURL = tip.getAttribute ("htmlURL");
String author = tip.getAttribute ("author");
Node list = (Node) authors.get (author);
Node item = list.appendChild (outputDoc.createElement ("LI"));
Element a = outputDoc.createElement ("A");
item.appendChild (a);
a.appendChild(outputDoc.createTextNode (title));
a.setAttribute ("HREF", htmlURL);
}
}
public void createHTMLDoc (String heading)
throws ParserConfigurationException
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
DocumentBuilder db = dbf.newDocumentBuilder ();
outputDoc = db.newDocument ();
html = outputDoc.createElement ("HTML");
outputDoc.appendChild (html);
body = outputDoc.createElement ("BODY");
html.appendChild (body);
Element h1 = outputDoc.createElement ("H1");
body.appendChild (h1);
h1.appendChild (outputDoc.createTextNode (heading));
}
public static void main (String[] args)
{
try
{
UseDOM ud = new UseDOM ();
ud.createHTMLDoc ("JDC Tech Tips Archive");
ud.processWithDOM (args[0]);
String htmlOut = ud.toString ();
System.out.println ("Saving result to " + args[1]);
FileWriter fw = new FileWriter (args[1]);
fw.write (htmlOut, 0, htmlOut.length ());
fw.flush ();
}
catch (Throwable t)
{
t.printStackTrace ();
}
}
}
XMLÀ» TechTipArchive.xml·Î ÀúÀåÇß´Ù°í °¡Á¤ÇսôÙ. ¾Æ·¡¿Í °°Àº ¸í·É¾î·Î Äڵ带 ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.
java UseDOM file:TechTipArchive.xml ListByAuthor.html
±×¸®°í À¥ºê¶ó¿ìÁ®·Î ListByAuthor.htmlÀ» ¿¾î¼ ÀúÀÚº°·Î ±¸¼ºµÈ ÆÁÀÇ ¸ñ·ÏÀ» º¾´Ï´Ù.
Äڵ尡 µ¿ÀÛÇÏ´Â ¹æ¹ýÀ» ¾Ë±â À§ÇØ, createHTMLDoc ¸Þ¼ÒµåºÎÅÍ »ìÆìº¾½Ã´Ù. ÀÌ ¸Þ¼Òµå´Â outputDoc Document¸¦ »ý¼ºÇÕ´Ï´Ù. À̰ÍÀº ³ªÁß¿¡ HTML Ãâ·ÂÀ» ¸¸µå´Âµ¥ ÀÌ¿ëµË´Ï´Ù. SAX¿Í ¸¶Âù°¡Áö·Î, ÆÄ¼´Â factory ¸Þ¼Òµå¸¦ ÅëÇØ »ý¼ºµË´Ï´Ù. ±×·¯³ª ¿©±â¼´Â factory ¸Þ¼Òµå°¡ DocumentBuilderFactory Ŭ·¡½º¿¡ ÀÖ½À´Ï´Ù. createHTMLDocÀÇ ¾Æ·¡ÂÊ ¹ÝÀº HTMLÀÇ ±âº»ÀûÀÎ ¿ä¼ÒµéÀ» »ý¼ºÇÕ´Ï´Ù.
outputDoc.appendChild (html);
body = outputDoc.createElement ("BODY");
html.appendChild (body);
Element h1 = outputDoc.createElement ("H1");
body.appendChild (h1);
h1.appendChild (outputDoc.createTextNode (heading));
ÀÌ Äڵ带 SAX ¿¹Á¦¿¡ ÀÖ´Â HTMLÀÇ ¿ä¼Ò¸¦ »ý¼ºÇÏ´Â ÄÚµå¿Í ºñ±³ÇØ º¸½Ê½Ã¿À.
//direct string manipulation from SAX example
htmlOut = new StringBuffer ("<HTML><BODY><H1>JDC Tech Tips Archive</H1>");
DOM API¸¦ ÀÌ¿ëÇÏ¿© ¹®¼¸¦ »ý¼ºÇÏ´Â °ÍÀº ¹®ÀÚ¿À» Á÷Á¢ ´Ù·ç´Â °Í¸¸Å °£´ÜÇϰųª ºü¸£Áö ¾Ê½À´Ï´Ù. ±×·¯³ª (ƯÈ÷ Å« ¹®¼¿¡ ´ëÇØ¼) ¿¡·¯ÀÇ ¹ß»ýÀÌ Àû½À´Ï´Ù.
useDOM ¿¹Á¦¿¡¼ °¡Àå Áß¿äÇÑ ºÎºÐÀº processWithDOM ¸Þ¼ÒµåÀÔ´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â µÎ°¡Áö ÀÏÀ» ÇÕ´Ï´Ù. (1) ÀúÀÚ ¿¤¸®¸ÕÆ®¸¦ ã°í À̰ÍÀ» Ãâ·ÂÀ¸·Î Á¦°øÇÕ´Ï´Ù. (2) ÆÁÀ» ã°í ÀúÀÚº°·Î ±¸ºÐÇÏ¿© Ãâ·ÂÀ¸·Î Á¦°øÇÕ´Ï´Ù. ÀÌ ´Ü°èµéÀº °¢°¢ ¹®¼ÀÇ ÃÖ»óÀ§ ¿¤¸®¸ÕÆ®¿¡ Á¢±ÙÇÒ ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù. À̰ÍÀº getDocumentElement () ¸Þ¼Òµå¸¦ ÅëÇØ ¼öÇàµË´Ï´Ù. ÀúÀÚ Á¤º¸´Â <author> ¿¤¸®¸ÕÆ®¿¡ µé¾îÀÖ½À´Ï´Ù. ÀÌ·± ¿¤¸®¸ÕÆ®´Â ÃÖ»óÀ§ ·¹º§¿¡¼ getElementsByTagName ("author") ¸Þ¼Òµå¸¦ È£ÃâÇϸé ãÀ» ¼ö ÀÖ½À´Ï´Ù. getElementsByTagName ¸Þ¼Òµå´Â NodeList¸¦ ¸®ÅÏÇÕ´Ï´Ù. À̰ÍÀº °£´ÜÇÑ NodeÀÇ Ä÷º¼ÇÀÔ´Ï´Ù. ±×¸®°í °¢°¢ÀÇ Node´Â getAttribute ¸Þ¼Òµå¸¦ È£ÃâÇϱâ À§ÇØ Element·Î Çüº¯È¯µË´Ï´Ù. getAttribute ¸Þ¼Òµå´Â ÀúÀÚÀÇ ¾ÆÀ̵ð¿Í À̸§À» ÀÔ·ÂÀ¸·Î ¹Þ½À´Ï´Ù. °¢°¢ÀÇ ÀúÀÚ´Â 2¼öÁØÀÇ ¸Ó¸®¸»·Î ¸ñ·ÏÀÌ ¸¸µé¾îÁý´Ï´Ù. Ãâ·Â ¹®¼´Â ÀúÀÚÀÇ À̸§À» ´ã°í ÀÖ´Â <H2> ¿ä¼Ò¸¦ »ý¼ºÇØ ³À´Ï´Ù. Node¸¦ Ãß°¡Çϱâ À§Çؼ´Â 2°³ÀÇ ´Ü°è°¡ ÇÊ¿äÇÕ´Ï´Ù. ù¹øÂ°·Î Ãâ·Â ¹®¼¿¡¼ createElement¿Í °°Àº factory ¸Þ¼Òµå¸¦ ÅëÇØ Node¸¦ »ý¼ºÇÕ´Ï´Ù. ´ÙÀ½À¸·Î ³ëµå°¡ appendChild ¸Þ¼Òµå¸¦ ÅëÇØ Ãß°¡µË´Ï´Ù. ³ëµå´Â ÀÚ½ÅÀ» »ý¼ºÇÑ ¹®¼¿¡¸¸ Ãß°¡µÉ ¼ö ÀÖ½À´Ï´Ù.
ÀúÀÚ ¸Ó¸®¸»ÀÌ Á¦ À§Ä¡¿¡ ³õÀÌ°Ô µÇ¸é, °¢°¢ÀÇ ÆÁ¿¡ ¸µÅ©¸¦ »ý¼ºÇÒ Â÷·ÊÀÔ´Ï´Ù. <tip> ¿ä¼Ò¸¦ <author> ¿¤¸®¸ÕÆ®¸¦ ãÀ»¶§¿Í °°Àº ¹æ¹ýÀ¸·Î getElementsByTagNameÀ» ÀÌ¿ëÇØ ã½À´Ï´Ù. ÆÁ ¼Ó¼ºÀ» ÃßÃâÇÏ´Â ¹æ¹ýµµ ºñ½ÁÇÕ´Ï´Ù. ÇѰ¡Áö Â÷ÀÌÁ¡Àº ³ëµå¸¦ ¾îµð¿¡ Ãß°¡ÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÏ´Â °ÍÀÔ´Ï´Ù. ÀúÀÚ°¡ ´Ù¸£¸é ´Ù¸¥ ¸ñ·Ï¿¡ Ãß°¡µÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ ÀÛ¾÷À» À§ÇÑ ±âÃÊ ÀÛ¾÷À¸·Î ÀúÀÚ ¿¤¸®¸ÕÆ®¸¦ ó¸®ÇÒ ¶§¿¡ <OL> ³ëµå¸¦ Ãß°¡Çϰí ÀúÀÚÀÇ ¾ÆÀ̵ð·Î HashMap À妽ÌÀ» Çß½À´Ï´Ù. ÀÌÁ¦, ÆÁÀÇ ÀúÀÚ ¾ÆÀ̵ð ¼Ó¼ºÀ» ÆÁÀÌ Ãß°¡µÉ Àû´çÇÑ <OL> ³ëµå¸¦ ã´Âµ¥ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
XML¿¡ ´ëÇØ ´õ ±íÀÌ ´Ù·é ³»¿ëÀ» º¸½Ã·Á¸é, 2000³â¿¡ Addison-Wesley¿¡¼ ÃâÆÇÇÑ Neil BradleyÀÇ The XML CompanionÀ» Âü°íÇϽʽÿÀ. JAXP¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â http://java.sun.com/xml/index.htmlÀÇ Java(tm) Technology¿Í XML ÆäÀÌÁö¸¦ Âü°íÇϽʽÿÀ. SAX2¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â http://www.megginson.com/SAX/index.htmlÀ» Âü°íÇϽʽÿÀ. DOM Ç¥ÁØÀº http://www.w3.org/TR/REC-DOM-Level-1¿¡ ÀÖ½À´Ï´Ù.
|
|
|
|