vidkid
|
2004-04-27 13:33:22, Á¶È¸ : 10,339, Ãßõ : 571 |
- Download #1 : sax.zip (2.1 KB), Download : 93

[À¥¼¹ö¿ÍÀÇ ¸¸³² #5] SAX ÆÄ¼¸¦ ÀÌ¿ëÇÑ XML µ¥ÀÌÅÍ ºÐ¼®
¾È³çÇϼ¼¿ä.
vidkid ÀÔ´Ï´Ù.
À̹ø °Á´ À¥¼¹ö¿ÍÀÇ ¸¸³² º¸³Ê½º °Á·ΠSAX ÆÄ¼¸¦ ÀÌ¿ëÇØ¼
XML µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ¾Æ º¸°Ú½À´Ï´Ù.
- XMLÀ» ó¸®ÇÏ´Â 2°¡Áö ¹æ½Ä
ÀϹÝÀûÀ¸·Î XML µ¥ÀÌÅ͸¦ ó¸®Çϴµ¥´Â DOM °ú SAX 2°¡Áö ¹æ½ÄÀÌ ÀÖ½À´Ï´Ù.
ÀÚ¼¼ÇÑ ¼³¸íÀº XML °ü·Ã ¹®¼¸¦ ÂüÁ¶½Ã°í ¿©±â¼´Â °£´ÜÇÏ°Ô Àå´ÜÁ¡¸¸
¤°í ³Ñ¾î°¡°Ú½À´Ï´Ù.
DOM (Document Object Model) Àº XML ¹®¼¸¦ ÇѲ¨¹ø¿¡ ÀÐ¾î¼ Æ®¸®ÇüÅ·Πó¸®ÇÕ´Ï´Ù.
¹®¼ ÀüüÀÇ ±¸Á¶°¡ ¸¸µé¾î Áö±â ¶§¹®¿¡ ¼öÁ¤°ú »èÁ¦, Ãß°¡°¡ ½±½À´Ï´Ù.
±×·¯³ª ¹®¼°¡ Å©´Ù¸é ´ç¿¬È÷ ½Ã°£°ú °ø°£(¸Þ¸ð¸®)°¡ ¸¹ÀÌ µé¾î°¡°ÚÁÒ.
SAX (Simple API for XML) ´Â ¼øÂ÷ÀûÀ¸·Î ¹®¼¸¦ ÀÐÀ¸¸é¼ °¢ ű׸¶´Ù À̺¥Æ®¸¦
¹ß»ý½ÃŰ´Â ¹æ½ÄÀ¸·Î Àбâ Àü¿ëÀ¸·Î »ç¿ëÇÕ´Ï´Ù. ¹®¼ÀÇ Ãß°¡/¼öÁ¤Àº Èûµé¸ç ÀüüÀûÀÎ
±¸Á¶¸¦ ¾Ë±â¿¡µµ ¹«¸®°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª ºü¸£°Ô ¹®¼ ±¸Á¶¸¦ ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù.
¹®¼ÀÇ °èÃþ ±¸Á¶¸¦ ¾Ë¾Æ¾ß ÇÏ°í ¹®¼ÀÇ Àб⠾²±â°¡ °¡´ÉÇØ¾ß ÇÑ´Ù¸é DOM ¹æ½ÄÀ»
»ç¿ëÇÏ°í ºü¸£°Ô ¹®¼¸¦ Àоî¾ß ÇÑ´Ù¸é SAX ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ È¿À²ÀûÀÔ´Ï´Ù.
¾ÆÁÖ °£´ÜÇÏ°Ô Àå´ÜÁ¡À» ¾Ë¾ÆºÃ´Âµ¥.. ÀÚ¼¼ÇÑ ³»¿ëÀº ²À °ü·Ã ¹®¼¸¦ º¸±â¹Ù¶ø´Ï´Ù.
- Äÿ¡¼ SAX ÀÌ¿ëÇϱâ
ÄÃÀÇ SAX API ´Â Java-SAX 2.0 API ¿¡ ¸ÅÇεǾîÀÖ½À´Ï´Ù. ÀÚ¹Ù¿¡ Àͼ÷ÇϽŠºÐµéÀº ½±°Ô »ç¿ëÇϽǼö
ÀÖÀ» °ÍÀÔ´Ï´Ù.
¿©·¯ºÐÀÇ ¾ÖÇø´ ÆÄÀÏ¿¡¼ SAX ¸¦ »ç¿ëÇϽ÷Á¸é
CURL.XML.SAX.PARSER
ÆÐŰÁö¸¦ ÀÓÆ÷Æ® ½ÃÄÑ¾ß ÇÕ´Ï´Ù.
±×·³ ÀÌÁ¦ºÎÅÍ ½ÇÁ¦·Î ÄÚµùÀ» ÇØº¸°Ú½À´Ï´Ù.
Áö±Ý ºÎÅÍÀÇ ³»¿ëÀº µµ¿ò¸»¿¡ ÀÖ´Â [Using the SAX XML Interface] ¸¦ ÂüÁ¶·ÎÇØ¼ ¼³¸íÇϰڽÀ´Ï´Ù.
-----------------------------------------------------------------------
{curl 3.0 applet}
{import * from CURL.XML.SAX.PARSER}
{define-class public MySAXApp {inherits DefaultHandler}
|| ÆÄ½ÌÇÑ °á°ú¸¦ ³ÖÀ» VBox
field private output:VBox
|| count element nesting for indenting parse output
field private nesting-depth:int
{constructor public {default parse-output:VBox}
set self.output = parse-output
{construct-super}
}
}
-----------------------------------------------------------------------
¿ì¼± ù¹øÂ° ÇØ¾ßµÉ ÀÏÀº DefaultHandler ·Î ºÎÅÍ ÀÚ½ÅÀÇ Çڵ鷯¸¦ »ó¼Ó¹Þ¾Æ¾ß ÇÕ´Ï´Ù.
À§ÀÇ ¼Ò½º´Â MySAXApp ¶ó´Â Ŭ·¡½º·Î »ó¼ÓÀ» ¹Þ¾Ò½À´Ï´Ù. ±×¸®°í °á°ú¸¦ ¹Þ±âÀ§ÇØ
VBox ¸¦ constructor ¿¡¼ ¹Þ½À´Ï´Ù.
-------------------------------------------------------------------------
{let xr:XMLReader = {SAXParser}}
{let parse-output:VBox = {VBox}}
{let handler:MySAXApp = {MySAXApp parse-output}}
{xr.set-content-handler handler}
{xr.set-error-handler handler}
--------------------------------------------------------------------------
´ÙÀ½À¸·Î SAXParser ¸¦ Çϳª »ý¼ºÇß½À´Ï´Ù.
{let xr:XMLReader = {SAXParser}}
±×¸®°í Çڵ鷯µµ Çϳª »ý¼ºÇß½À´Ï´Ù.
{let handler:MySAXApp = {MySAXApp parse-output}}
»ý¼ºÇÑ SAXParser ¿¡ ¿ì¸®°¡ Á¤ÀÇÇÑ Çڵ鷯¸¦ µî·Ï½ÃÄ×½À´Ï´Ù.
{xr.set-content-handler handler}
{xr.set-error-handler handler}
¼Ò½º°¡ ¿©·¯ÁÙÀ̱ä ÇÏÁö¸¸ ½ÇÁ¦ ÇÏ´ÂÀÏÀº
1. ÆÄ¼¸¦ Çϳª»ý¼ºÇϰí
2. ÆÄ¼¸¦ ¼öÇàÇÒ¶§ »ç¿ëÇÒ Çڵ鷯¸¦ »ý¼ºÇϰí
3. ÆÄ¼¿¡ Çڵ鷯¸¦ µî·Ï
À§ÀÇ 3´Ü°è¸¦ ÇØÁÖ¸é ÆÄ¼°¡ ¿Ï¼ºÀÌ µË´Ï´Ù.
±×·³ ÆÄ¼¸¦ ¾î¶»°Ô È£ÃâÇÏ´ÂÁö º¸°Ú½À´Ï´Ù.
--------------------------------------------------------------------------
{define-proc {parse-and-display input-name:Url}:void
{parse-output.clear}
{try
{xr.parse {InputSource system-id = input-name.name}}
catch file-exception:IOException do
{parse-output.add
{text color="red",
A problem occurred while reading the file:
{value file-exception}
}
}
catch parse-exception:SAXParseException do
{parse-output.add
{text color="red",
A problem occurred parsing the XML file:
{error-message parse-exception}
}
}
}
}
--------------------------------------------------------------------------
parse-and-display ¶ó´Â ÇÁ·Î½ÃÁ®¸¦ »ý¼ºÇß½À´Ï´Ù.
½ÇÁ¦·Î ÆÄ½ÌÀÇ ¼öÇàÀº
{xr.parse }
¸¦ ÀÌ¿ëÇØ¼ ÇÕ´Ï´Ù.
³ª¸ÓÁö´Â ¿¹¿Ü ó¸®ÀÔ´Ï´Ù.
IOException Àº ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø´Â »óÅ¿¡ ¹ß»ýÇϱ¸¿ä.
SAXParseException Àº XML ¹®¹ý¿¡ ¿¡·¯°¡ ÀÖ´Â °æ¿ì ¹ß»ýÇÕ´Ï´Ù.
--------------------------------------------------------------------------
{let command:CommandButton =
{CommandButton
label = "Choose File",
{on Action do
{parse-and-display {url "brillig.xml"}}
}
}
}
{VBox width=600px,
{heading XML Example},
command,
{hrule},
{ScrollBox height=4.5in, parse-output}
}
--------------------------------------------------------------------------
½ÇÁ¦ ¿¹Á¦¿¡¼´Â ÀÌ·¸°Ô ¾È ªÀºµ¥..
Á¦°¡ ¸¹ÀÌ ÁÙ¿´½À´Ï´Ù. ±×³É °£´ÜÇÏ°Ô ¹öư ´©¸£¸é ÆÄ½ÌÀ» ¼öÇàÇÏ´Â ³»¿ëÀÔ´Ï´Ù.
°°Àº µð·ºÅ丮¿¡´Â brillig.xml ÀÌ Á¸ÀçÇØ¾ß µË´Ï´Ù.
¿©±â ±îÁö°¡ Àüü ¼Ò½º ³»¿ëÀ» º» °ÍÀ̱¸¿ä..
½ÇÁ¦ ¿ì¸®°¡ ÆÄ½ÌÀ» ÇÒ¶§ ¾î¶² À̺¥Æ®¸¦ ¾î¶»°Ô ó¸®ÇØ¾ß µÉÁö´Â º¸Áö ¸øÇß½À´Ï´Ù.
¹Ù·Î
{define-class public MySAXApp {inherits DefaultHandler}
...
}
¿©±â¿¡¼ Ãß°¡¸¦ ÇØÁà¾ß ÇÕ´Ï´Ù.
¾î¶² À̺¥Æ®°¡ ¹ßÇàÇÏ´ÂÁö´Â DefaultHandler ¸¦ ÂüÁ¶ÇϽøé ÀÚ¼¼ÇÏ°Ô ³ª¿É´Ï´Ù.
¿©±â¼´Â ±âº»ÀûÀ̸鼵µ ÀüºÎÀÎ...
À̺¥Æ®µéÀ» ¾Ë¾Æº¸°Ú½À´Ï´Ù.
--------------------------------------------------------------------------
start-document : ¹®¼ÀÇ ½ÃÀÛÀ» ¸¸³µÀ» ¶§ È£ÃâµÈ´Ù.
end-document : ¹®¼ÀÇ ³¡À» ¸¸³µÀ» ¶§ È£ÃâµÈ´Ù.
start-element : ±¸¼º¿ä¼ÒÀÇ ½ÃÀÛ Å±׸¦ ¸¸³µÀ»¶§ È£ÃâµÈ´Ù.
end-element : ±¸¼º¿ä¼ÒÀÇ Á¾·á ű׸¦ ¸¸³µÀ»¶§ È£ÃâµÈ´Ù.
characters : XML ÆÄ¼¿¡¼ ÅØ½ºÆ® ¹®ÀÚ¿À» ¹ß°ßÇÒ ¶§ È£ÃâµÈ´Ù.
(*XML ÇÁ·Î±×·¡¹ÖÀÇ ¼û°ÜÁø Áø½Ç-XML ÀÔ¹® À̶õ Ã¥À» ÀοëÇß½À´Ï´Ù.)
--------------------------------------------------------------------------
XML À» ¾Æ½Ã´Â ºÐµéÀº ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
±Ùµ¥ Ȥ½Ã ¸ð¸£´Â ºÐµéÀ» À§Çؼ
start-document ´Â ¹®¼°¡ ½ÃÀ۵ɶ§ ¹ß»ýÇÕ´Ï´Ù.
ÆÄ½ÌÇϴµ¿¾È Çѹø ¹ß»ýÇϰÚÁÒ..
end-document ´Â ¸¶Âù°¡Áö·Î ¹®¼°¡ ³¡³µÀ»¶§ Çѹø ¹ßÇàÇÕ´Ï´Ù.
start-element ´Â űװ¡ ½ÃÀ۵Ȱæ¿ì Áï, <MyTAG> ÀÌ·± űװ¡ ½ÃÀÛµÈ °æ¿ìÀ̰í¿ä
end-element ´Â </MyTAG> ÀÌ·± ½ÄÀ¸·Î űװ¡ ³¡³°æ¿ì ¹ß»ýÇÕ´Ï´Ù.
characters ´Â ±× ¿ÜÀÇ ¸ðµç °æ¿ì .. ¹®ÀÚ¿ÀÌ ³ª¿Â °æ¿ì ¹ß»ýÇÕ´Ï´Ù.
ÀÚ¼¼ÇÑ ¼³¸íÀÌ ¾Æ´Ï°ÚÁö¸¸ ´ëÃæ ÀÌÇØÇÏ½Ç ¼ö ÀÖ°ÚÁÒ?
¼Ò½º¸¦ º¸¸é¼ ´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸ÁÒ.
--------------------------------------------------------------------------
{method public {start-document}:void
set self.nesting-depth = 0
{self.output.add
{text color="purple", Start document}
}
}
{method public {end-document}:void
{self.output.add
{text color="purple",End document}
}
}
--------------------------------------------------------------------------
À§´Â start-document ¿Í end-document ¸¦ ¿À¹ö¶óÀ̵ù(overriding) Çß½À´Ï´Ù.
³»¿ëÀº netsting-depth ¸¦ ÃʱâÈ ÇÏ´Â ºÎºÐÇϰí.
½ÃÀÛ°ú ³¡À» Ãâ·ÂÇÏ´Â ºÎºÐÀÌ ÀÖ½À´Ï´Ù.
¿©±â¼ netsting-depth ´Â Æ®¸®±¸Á¶·Î º»´Ù¸é ±íÀÌ(depth, ·¹º§) À̶ó°í º¸½Ã¸é µË´Ï´Ù.
--------------------------------------------------------------------------
{method public {start-element
uri:String,
name:String,
qname:String,
atts:Attributes
}:void
set self.nesting-depth = self.nesting-depth + 1
{self.output.add
{HBox
{Fill width = self.nesting-depth * 0.5in},
{text color="navy", Start element: },
{text color="fuchsia",
{if uri != ""
then
"[" & uri & "]"
else
""
}
},
{text color="fuchsia", {value name}}
}
}
}
--------------------------------------------------------------------------
À̹ø¿£ start-element ¸¦ º¸°Ú½À´Ï´Ù.
start-element ´Â 4°³ÀÇ argument ¸¦ ¹Þ½À´Ï´Ù.
¿©±â¼
name : ű׸í
atts : Attributes ·Î °¢ ¼Ó¼º°ªµéÀÌ µé¾î°©´Ï´Ù.
<TAG code=1234 value=1234>
ÀÌ·± ű׸¦ ¿¹·Î µç´Ù¸é
name = TAG
atts ´Â code=1234 value=1234 ³»¿ëÀÌ µé¾î°¡°Ô µË´Ï´Ù.
µµ¿ò¸»À» È®ÀÎÇØ º¸¸é °ªÀ» °¡Á®¿Ã ¼ö ÀÖ´Â ¿©·¯°¡Áö ¸Þ¼Òµå°¡ Á¸ÀçÇÕ´Ï´Ù.
--------------------------------------------------------------------------
{method public {end-element
uri:String,
name:String,
qname:String
}:void
{self.output.add
{HBox
{Fill width = self.nesting-depth * 0.5in},
{text color="navy", End element: },
{text color="fuchsia",
{if uri != ""
then
"[" & uri & "]"
else
""
}
},
{text color="fuchsia", {value name}}
}
}
set self.nesting-depth = self.nesting-depth - 1
}
--------------------------------------------------------------------------
end-element µµ ¸¶Âù°¡Áö·Î À§¿Í °°Àº ÇÔ¼ö·Î ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
end-element ´Â attributes °¡ ¾ø±â ¶§¹®¿¡ 3°³ÀÇ arguments ¸¸ ¹Þ½À´Ï´Ù.
--------------------------------------------------------------------------
{method public {characters
ch:StringBuf,
start:int,
length:int
}:void
{self.output.add
{HBox
{Fill width = self.nesting-depth * 0.5in},
{text color="teal", Characters: },
{text color="lime", {ch.substr start, length}}
}
}
}
--------------------------------------------------------------------------
¸¶Áö¸·À¸·Î characters ´Â ű׿¡ Æ÷ÇÔÀÌ µÇ¾îÀÖÁö ¾Ê´Â ¹®ÀÚ¿À» ¸»ÇÕ´Ï´Ù.
<A>°¡³ª´Ù¶ó</A>
¶ó´Â A űװ¡ ÀÖ´Ù¸é "°¡³ª´Ù¶ó" ´Â characters ¸Þ¼Òµå¿¡ ³Ñ¾î¿À°Ô µË´Ï´Ù.
characters ´Â 3°³ÀÇ arguments ¸¦ ¹Þ½À´Ï´Ù.
--------------------------------------------------------------------------
{method public {error exception:SAXParseException}:void
{throw exception}
}
{method public {fatal-error exception:SAXParseException}:void
{throw exception}
}
{method public {warning exception:SAXParseException}:void
{throw exception}
}
--------------------------------------------------------------------------
¿¹¿Ü 󸮸¦ À§ÇÑ 3°³ÀÇ ¸Þ¼Òµå°¡ ÀÖ½À´Ï´Ù.
¸Þ¼Òµå À̸§¿¡¼ ´ë°ÀÇ ¶æÀ» ¾Ë ¼ö ÀÖÀ¸¹Ç·Î ¼³¸íÀº »ý·«Çϱâ·Î Çϰí..
´õ ÀÚ¼¼ÇÑ ³»¿ëÀº µµ¿ò¸»À» ÂüÁ¶ÇØ Áֽñ⠹ٶø´Ï´Ù.
½ÇÁ¦ ó¸®ÇÒ brilling.xml ÆÄÀÏÀÇ ³»¿ëÀÔ´Ï´Ù.
--------------------------------------------------------------------------
<?xml version="1.0"?>
<poem xmlns="http://www.megginson.com/ns/exp/poetry">
<title>Jabberwocky</title>
<l>Twas brillig and the slithy toves</l>
<l>Did gyre and gimble in the wabe</l>
<l>All mimsy were the borogoves</l>
<l>And the mome raths outgrabe.</l>
</poem>
--------------------------------------------------------------------------
ÀÌÁ¦ ÇÁ·ÎÁ§Æ®¸¦ ½ÇÇà½ÃÄÑ º¾½Ã´Ù.
(**ÇÁ·ÎÁ§Æ® ÆÄÀÏÀº ÀÌ °Á¿¡ ÷ºÎµÇ¾îÀÖ½À´Ï´Ù.)
½ÇÇàÇÑÈÄ ¹öưÀ» ´©¸£¸é ¾Æ·¡¿Í °°Àº ȸéÀÌ ³ªÅ¸³³´Ï´Ù.

À§ÀÇ È¸éÀ» º¸¸é
Start docuemnt ÀÌ ÈÄ·Î
¾Æ·¡¿¡ poem À̶õ űװ¡ ³ª¿À°í ±× poem ¾È¿¡ ÀÖ´Â titile À̳ª I ű׵éÀÌ ³ª¿É´Ï´Ù.
nesting-depth ¿¡ ¸Â°Ô µé¿©¾²±â°¡ µÇ¾îÀÖ½À´Ï´Ù.
Characters ¿¡´Â °¢ ÅÂ±×µé »çÀÌÀÇ ¹®ÀÚ¿ÀÌ ³ª¿Ô½À´Ï´Ù.
ªÀº ¿¹Á¦ Çϳª·Î ¸ðµç °ÍÀ» ´Ù ¾Ë±â´Â ¾î·Æ°ÚÁö¸¸..
°£´ÜÇÏ°Ô SAX ¸¦ ÀÌ¿ëÇØ¼ XML ¹®¼¸¦ ºÐ¼®ÇÏ´Â ÇÁ·Î±×·¥À» º¸¾Ò½À´Ï´Ù.
¿©±â¼´Â ÆÄÀÏÀ» »ç¿ëÇߴµ¥..
´ÙÀ½ °Á¿¡¼´Â ¹®ÀÚ¿À» »ç¿ëÇØ¼ ÆÄ½ÌÇϵµ·Ï ÇØº¸°Ú½À´Ï´Ù.
±×·³..
|
|
|