vidkid
|
2004-04-27 18:01:05, Á¶È¸ : 2,369, Ãßõ : 372 |
- Download #1 : sax2.zip (3.7 KB), Download : 65

[À¥¼¹ö¿ÍÀÇ ¸¸³² #6] XML µ¥ÀÌÅ͸¦ RecordSet À¸·Î ¹Þ±â
¾È³çÇϼ¼¿ä.
vidkidÀÔ´Ï´Ù.
À̹ø °Á´ ¼¹ö¿¡¼ µ¥ÀÌÅ͸¦ , ·Î ºÐ¸®Çؼ º¸³»´Â°Ô ¾Æ´Ï¶ó XML ÇüÅ·Πµ¥ÀÌÅ͸¦ º¸³»¸é
±×°ÍÀ» RecordSet À¸·Î ³Ö¾î º¸°Ú½À´Ï´Ù.
±âÁ¸¿¡ ÇÏ´ø ¹æ½Ä°ú ¹Ù·Î Àü °Á¸¦ º¸¸é ½±°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.
±×·±µ¥ SAX ¿¡ ´ëÇØ¼ Çì±ò¸®½Å ºÐµéÀÌ ÀÖÀ¸½Ç Å×´Ï..
¶Ç ÇϳªÀÇ SAX ¿¹Á¦°â ÇØ¼.. ¸¸µé¾î º¸°Ú½À´Ï´Ù.
¿©±â¼ ÇѰ¡Áö ¾Ë¾ÆµÎ½Ç °Å´Â XML ÆÄ¼¸¦ ¼öÇàÇÒ¶§ ÆÄÀÏÀÌ ¾Æ´Ñ ¹®ÀÚ¿À» ³Ö¾î Áشٴ °ÍÀÔ´Ï´Ù.
{xl.parse ...}
ÇÔ¼ö¿¡¼ ¹Ù·Î Àü °Á´ ÆÄÀÏÀÇ url À» ³Ö¾îÁá´Ù´Â ¾ê±âÁö¿ä..
ÀÚ¼¼ÇÑ ³»¿ëÀº °Á¸¦ º¸¸é¼ ¼³¸íÇϱâ·Î ÇϰڽÀ´Ï´Ù.
- µ¥ÀÌÅÍ ±¸Á¶ Á¤ÀÇ
action.do ÆÄÀÏ
-----------------------------------------------------------------------
<?xml version="1.0" encoding="euc-kr"?>
<RecordSet>
<Fields>
<Field name="mid" domain="String" />
<Field name="mname" domain="String" />
<Field name="mcodes" domain="String" />
</Fields>
<Record mid="hong1234" mname="È«±æµ¿" mcodes="123456-1234351" />
<Record mid="cham1234" mname="Âü±â¸§" mcodes="222222-1234351" />
<Record mid="ggae1234" mname="±ú¼Ò±Ý" mcodes="452312-1234351" />
<Record mid="hongdukke" mname="È«µÎ±ú" mcodes="000000-1234351" />
</RecordSet>
-----------------------------------------------------------------------
¼¹ö´Â À§¿Í °°Àº Çü½ÄÀÇ µ¥ÀÌÅ͸¦ Ŭ¶óÀÌ¾ðÆ®·Î º¸³À´Ï´Ù.
¿©±â¼´Â ÆÄÀϷΠó¸®ÇßÀ¸¸ç À̸§Àº action.do ·Î Çß½À´Ï´Ù. ÀÚ¹Ù »ç¿ëÀÚ´Â Àͼ÷ÇϰÚÁÒ?
<RecordSet></RecordSet>
Àüü ·¹ÄÚµå¼ÂÀº À§ÀÇ RecordSet ű׿¡ ¾È¿¡ ÀÖ½À´Ï´Ù.
±×¸®°í Çʵå Á¤ÀÇ´Â <Fields></Fields> ÅÂ±× ¾È¿¡ Á¤ÀÇ µÇ¾îÀÖ°í
°¢ Çʵå´Â <Field /> ¸¦ ½á¼ Á¤ÀÇ Çß½À´Ï´Ù.
¸¶Áö¸·À¸·Î °¢ ·¹ÄÚµå´Â <Record /> ű׸¦ »ç¿ëÇß½À´Ï´Ù.
<Record> ÅÂ±× ¾È¿¡´Â Çʵå¸í=Çʵ尪 ÇüÅ·Π, ¾øÀÌ Çʵ带 ³ª¿ÇÕ´Ï´Ù.
- ÄÃ ÀÛ¾÷..
ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» ´Ù¿î¹Þ¾Æ º¸½Ã¸é 2°³ÀÇ scurl ÆÄÀÏÀ» include Çß½À´Ï´Ù.
httplib.scurl ÆÄÀÏÀº ¾ÕÂÊÀÇ °Á¿¡¼ ¾ð±ÞÇÑ ³»¿ëÀ¸·Î GET / POST ¸Þ¼Òµå ÇÔ¼ö°¡ µé¾îÀÖ½À´Ï´Ù.
¿©±â¼´Â {gfGetMethod} ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù.
GET ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ °¡Á® ¿À´Â ÇÔ¼öÀÔ´Ï´Ù.
MySaxApp.scurl Àº ¾Æ·¡ °ÁÂÀÇ DefaultHandler ¿¡¼ »ó¼Ó¹Þ¾Æ Çڵ鷯¸¦ ÀÛ¼ºÇÑ Å¬·¡½º·Î
³»¿ëÀº Á¶±Ý ÈÄ¿¡ »ìÆìº¸°Ú½À´Ï´Ù.
¿ì¼± start.curl ÆÄÀÏÀº º¸°Ú½À´Ï´Ù.
start.curl ÆÄÀÏ
-----------------------------------------------------------------------
{curl 3.0 applet}
{curl-file-attributes character-encoding = "euc-kr"}
{applet manifest = "manifest.mcurl"}
{import * from CURL.XML.SAX.PARSER}
{include "httplib.scurl"}
{include "MySaxApp.scurl"}
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|| XML ½ºÆ®¸µÀ¸·ÎºÎÅÍ ·¹ÄÚµå¼ÂÀ» ¸®ÅÏÇÑ´Ù.
{define-proc public {gfXML2RecordSet xml : String} : #RecordSet
let rs : #RecordSet = null
let xr:XMLReader = {SAXParser}
let handler:MySaxApp = {MySaxApp}
{xr.set-content-handler handler}
{xr.set-error-handler handler}
{try
{xr.parse {InputSource character-stream = {{StringBuf xml}.to-InputStream}}}
set rs = {handler.get-recordset}
catch file-exception:IOException do
{popup-message {value file-exception}}
catch parse-exception:SAXParseException do
{popup-message {gfGetErrorMessage parse-exception}}
}
{return rs}
}
{let command:CommandButton =
{CommandButton
label = "´·¯ÁÖ¼¼¿ä",
{on Action do
let (xml : String, error?:bool) =
{gfGetMethod
{url "action.do"},
{get-character-encoding-by-name "euc-kr"}
}
||{popup-message xml}
let rs : #RecordSet = {gfXML2RecordSet xml}
{popup-message
{RecordGrid record-source=rs}
}
}
}
}
{VBox width=600px,
command
}
-----------------------------------------------------------------------
ȸ鿡´Â CommandButton Çϳª°¡ Ãâ·ÂµÇ°í ¹öưÀ» ´©¸£¸é À̺¥Æ®°¡ È£ÃâµË´Ï´Ù.
¹öư À̺¥Æ®ÀÇ ³»¿ëÀ» º¸¸é ¿ì¼±..
{gfGetMethod } ÇÔ¼ö¸¦ »ç¿ëÇØ¼ action.do ÆÄÀÏÀ» Àоî¿É´Ï´Ù.
±×¸®°í
let rs : #RecordSet = {gfXML2RecordSet xml}
{gfXML2RecordSet} ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¹Þ¾Æ¿Â xml String ÀÇ ³»¿ëÀ» argument ÁÖ°í
RecordSet À» ¸®ÅÏ ¹Þ½À´Ï´Ù.
¸¶Áö¸·À¸·Î RecordGrid ¸¦ ÀÌ¿ëÇØ¼ ȸ鿡 Ç¥½ÃÇÕ´Ï´Ù.
´ëºÎºÐÀÌ gfXML2RecordSet ÇÔ¼ö¿¡ ±¸ÇöµÇ¾î ÀÖÀ¸´Ï ÇÔ¼ö ³»¿ëÀ» Çϳª¾¿ È®ÀÎÇØ º¸ÁÒ.
-----------------------------------------------------------------------
let xr:XMLReader = {SAXParser}
let handler:MySaxApp = {MySaxApp}
{xr.set-content-handler handler}
{xr.set-error-handler handler}
-----------------------------------------------------------------------
ÀÌ ºÎºÐÀº ¹Ù·Î Àü °Á¿¡¼µµ ³ª¿Â SAX ÆÄ¼¸¦ »ç¿ëÇϱâ À§ÇÑ Áغñ ÀÛ¾÷ÀÔ´Ï´Ù.
-----------------------------------------------------------------------
{try
{xr.parse {InputSource character-stream = {{StringBuf xml}.to-InputStream}}}
set rs = {handler.get-recordset}
...
}
-----------------------------------------------------------------------
±×¸®°í
{xr.parse {InputSource character-stream = {{StringBuf xml}.to-InputStream}}}
{xr.parse} ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¼ ÆÄ½Ì ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù.
¿©±â¼ ´Ù¸¥Á¡Àº ÀÌÀü °Á¿¡¼´Â {InputSource } °¡ url À̾ú´Âµ¥ À̹ø¿¡´Â stream À̶õ °ÍÀÔ´Ï´Ù.
±× ´ÙÀ½ ÁÙ·Î ÆÄ½ÌÀÌ ³¡³ª¸é {handler.get-recordset} ¸¦ ÀÌ¿ëÇØ¼ ·¹ÄÚµå¼ÂÀ» ¹Þ½À´Ï´Ù.
set rs = {handler.get-recordset}
¹°·Ð, ¿ì¸®°¡ Á¤ÀÇÇÑ Çڵ鷯¿¡ {handler.get-recordset} ¸Þ¼Òµå°¡ Á¸ÀçÇØ¾ß ÇÕ´Ï´Ù.
ÀÌÁ¨ Çڵ鷯¸¦ ¾î¶»°Ô ¸¸µé¾ú´ÂÁö¸¸ º¸¸é µÇ°Ú±º¿ä..^^
MySaxApp.scurl ÆÄÀÏ
-----------------------------------------------------------------------
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|| TSaxApp
{define-class public MySaxApp {inherits DefaultHandler}
field public rs : #RecordSet
field public rf : #RecordFields
field public rfs : {Array-of RecordField} = {{Array-of RecordField}}
{constructor public {default}
{construct-super}
}
{method public {get-recordset}:#RecordSet
{return self.rs}
}
{method public {start-document}:void}
{method public {end-document}:void}
{method public {start-element
uri:String,
name:String,
qname:String,
atts:Attributes
}:void
{if name == "Fields" then
{self.rfs.clear}
elseif name == "Field" then
let sname : #String = {atts.get-value {atts.get-index-by-qname "name"}}
let sdomain : #String = {atts.get-value {atts.get-index-by-qname "domain"}}
let dm : Domain = {Domain.from-type String}
{if sdomain == "int" then
set dm = {Domain.from-type int}
elseif sdomain == "double" then
set dm = {Domain.from-type double}
}
{self.rfs.append
{RecordField
sname asa String,
domain = dm
}
}
elseif name == "Record" then
let r : #RecordData = {RecordData}
{for i:int=0 below {atts.get-length} do
let lname : #String = {atts.get-local-name i}
let lvalue : #String = {atts.get-value i}
{if lname != null and lvalue != null then
set r[lname asa String] = lvalue
}
}
{self.rs.append r}
}
}
{method public {end-element
uri:String,
name:String,
qname:String
}:void
{if name == "Fields" then
set self.rf = {RecordFields {splice self.rfs}}
set self.rs = {RecordSet self.rf asa RecordFields}
}
}
{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}
}
}
-----------------------------------------------------------------------
À½ ¼Ò½º°¡ ¹«Ã´ ±é´Ï´Ù.
ÇÏÁö¸¸ ³»¿ëÀ» »ìÆìº¸¸é ¿ª½Ã ¾Æ¹«°Íµµ ¾Æ´ÏÁÒ.
¿©±â¼ Áß¿äÇÑ°Ç µé¾î¿À´Â ÅÂ±× Á¤º¸¿¡ µû¶ó Á÷Á¢ RecordSet À» »ý¼ºÇÑ´Ù °ÍÀÔ´Ï´Ù.
ÀÚ ±×·³ Çϳª¾¿ È®ÀÎÇØ º¼±î¿ä..
-----------------------------------------------------------------------
field public rs : #RecordSet
field public rf : #RecordFields
field public rfs : {Array-of RecordField} = {{Array-of RecordField}}
-----------------------------------------------------------------------
rs ´Â »ý¼ºÇÒ RecordSetÀ̱¸¿ä.. rf ´Â RecordFields ÀÔ´Ï´Ù.
rfs ´Â RecordField ¸¦ ±¸¼ºÇÒ ¹è¿ÀÔ´Ï´Ù.
-----------------------------------------------------------------------
{method public {get-recordset}:#RecordSet
{return self.rs}
}
-----------------------------------------------------------------------
constructor, start-document, end-document ´Â º°·Î ÇÏ´ÂÀÏ ¾ø½À´Ï´Ù.
get-recordset Àº ¸¸µé¾îÁø RecordSet À» ¸®ÅÏÇÕ´Ï´Ù.
±×·³ º»°ÝÀûÀ¸·Î .. ÇÊµå ¸¸µå´Â ºÎºÐÀ» º¸°Ú½À´Ï´Ù.
¿©±â¼ ÇÊµå ¸¸µå´Â ¹æ¹ýÀº
start-element ÀÇ Å±װ¡ Fields À̸é Çʵå Á¤Àǰ¡ ÀÌÁ¦ ºÎÅÍ ³ª¿À¹Ç·Î
{self.rfs.clear} ¸¦ È£ÃâÇØ¼ ÇÊµå ¹è¿À» ºñ¿öµÓ´Ï´Ù.
±×¸®°í Field űװ¡ ³ªÅ¸³ª¸é °¢ attributes °ªµéÁß¿¡¼ name, domain ¸¸ °¡Á®´Ù°¡
Çʵ带 ±¸¼ºÇÑÈÄ rfs ¿¡ Ãß°¡ÇÕ´Ï´Ù.
±×¸®°í Field ±¸¼ºÀÌ ´Ù ³¡³ª¸é
end-element ¿¡¼ űװ¡ Fields °¡ ³ª¿À°Ô µË´Ï´Ù.
À̶§´Â ÇÊµå ±¸¼ºÀÌ ¿ÏÀüÈ÷ ³¡³ °ÍÀ̹ǷÎ
-----------------------------------------------------------------------
{method public {end-element
uri:String,
name:String,
qname:String
}:void
{if name == "Fields" then
set self.rf = {RecordFields {splice self.rfs}}
set self.rs = {RecordSet self.rf asa RecordFields}
}
}
-----------------------------------------------------------------------
·¹ÄÚµå¼ÂÀ» »ý¼ºÇÕ´Ï´Ù.
**ÄÃÀÇ RecordSet Àº Çʵ尡 ¾øÀ¸¸é »ý¼ºÀÌ ¾ÈµÇ¹Ç·Î ÇÊµå ±¸¼ºÀÌ ¿ÏÀüÈ÷ ³¡³ÈÄ¿¡ »ý¼ºÇÕ´Ï´Ù.
±×¸®°í °¢ Record ¸¦ ±¸¼ºÇÕ´Ï´Ù.
¿ª½Ã start-element ¿¡¼ ű׸íÀÌ Record ÀΰÍÀ» °ñ¶ó³»¸é µÇ°ÚÁÒ..
À̹ø¿£ ÀÛ¾÷À» ½±°ÔÇϱâÀ§Çؼ
<Record mid="hong1234" mname="È«±æµ¿" mcodes="123456-1234351" />
À§ ó·³ ·¹Äڵ带 ±¸¼ºÇß½À´Ï´Ù. ¸ðµÎ start-element ¿¡¼ attributes ¸¸ ÀÐÀ¸¸é ÇÑ ·¹Äڵ带 ±¸¼ºÇÒ
¼ö ÀÖ½À´Ï´Ù. end-element ¸¦ ÂüÁ¶ÇÒ Çʿ䰡 ¾ø´Â °ÍÀÌÁÒ..
-----------------------------------------------------------------------
let r : #RecordData = {RecordData}
{for i:int=0 below {atts.get-length} do
let lname : #String = {atts.get-local-name i}
let lvalue : #String = {atts.get-value i}
{if lname != null and lvalue != null then
set r[lname asa String] = lvalue
}
}
{self.rs.append r}
-----------------------------------------------------------------------
À§¿Í °°Àº ÀÛ¾÷À¸·Î Record ¸¦ Ãß°¡Çß½À´Ï´Ù.
¾î·ÆÁö ¾ÊÀº ³»¿ëÀÌ´Ï ¼³¸íÀº »ý·«ÇÕ´Ï´Ù.
ÀßÀÌÇØ°¡ ¾ÈµÇ½Ã¸é ¾ÕÂÊÀÇ °Á¸¦ Àо¼¼¿ä..
¸¶Áö¸·À¸·Î ¿¹¿Ü ó¸®Àä..
-----------------------------------------------------------------------
{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}
}
-----------------------------------------------------------------------
À§¿Í °°ÀÌ fatal-error ¿¡·¯°¡ ¾Æ´Ñ°æ¿ì´Â ³Ñ¾î°¡°Ô Çß½À´Ï´Ù.
µÕ±Û°Ô »ì¾Æ¾ßÁÒ.. ³Ê¹« ºýºýÇϸé Èûµå´Ï±ñ¿ä ^^;;
¼Ò½º¿¡ ´ëÇØ ÀÚ¼¼È÷´Â ¼³¸íÀº ¾ÈÇßÁö¸¸ ¾î·ÆÁö ¾ÊÀ¸´Ï Çѹø¾¿ ½ÇÇàÇØ º¸¸é ½±°Ô ÀÌÇØ°¡½Ç °ÍÀÔ´Ï´Ù.
À̹ø °Á¸¦ ¸¶Áö¸·À¸·Î ÁøÂ¥·Î À¥¼¹ö¿ÍÀÇ ¸¸³²À» ¸¶Ä¡°Ú½À´Ï´Ù.
±×·³~~
|
|
|