출처 : http://www.topxml.com/sql/articles/adoforxml/
Using VB and ADO to return and update Record Set based XML

by: Sean Grimaldi, Serious Consulting LLC.

This article is about making the most of ADO and XML until the complete Visual Basic.net, including ADO.net, becomes available.  This article is focused on how you, as a developer, can use ADO and XML today; and get valuable skills that apply to Visual Basic.net.  I also want to show how you can use ADO, XML, and XSL today, to improve the quality of your development.

 I am taken aback almost daily, at the slow adoption many standards-based technologies face.  XSLT is a fine example.  XSLT reached candidate recommendation, meaning the w3c considered it stable and encouraged implementation, in November 2000.   I am writing this article six months later, in a room packed with developers working for a worldwide software company.  Not one of these developers, that I am aware of, has ever used XSLT in a production environment.

 Part of the blame must go to how Microsoft spoiled us with Visual Basic.  As a development tool, it is unparalleled.  Think how simple it is to get an ADO Recordset; Visual Basic will even assist you in debugging the SQL query.

Unfortunately, at this time the situation is not at all the same with XSLT.  Microsoft does not currently make a powerful IDE that includes a powerful XML editor.  Visual Interdev, for example, mangles XSL. The best XML IDE available from Microsoft is XML Notepad (http://msdn.microsoft.com/xml/NOTEPAD/download.asp). As Visual Basic developers expecting features like statement completion, this is a tremendous loss.

We all suspect Visual Basic.net will provide us with the tools to make the use of these technologies simple, but until then, I would like to offer a few pointers to flatten the learning curve.

As an example of coming XML tools, Microsoft includes a XML Designer with color codes and statement and tag completion in Visual Studio.net.

Figure 1. Color-Coded XML Designer with Statement and Tag Completion

Since most developers prefer code samples to help illustrate technologies with which they are unfamiliar, this article loosely follows a sample. The sample scenario is simple and something you will likely run into frequently.  I am interested in improvements you may make or ways in which you extend it to be more useful.  Please email me your comments at my website, http://www.SeriousConsulting.com.

ADO

Every Visual Basic developer sooner or later becomes quite strong with ADO, because it is comparatively simple and allows access to every data source the developer is likely to encounter.

The disconnected Recordset is the staple of Microsoft web development.  It is most likely the single programming practice that can increase the scalability of a Visual Basic and/or ASP driven web site more than any other.  ADO makes it almost effortless.  A disconnected Recordset is simply a Recordset that no longer has a live connection to the server.  To disconnect a recordset, set it's ActiveConnection property equal to nothing. At this point it is safe to close the ADO connection object as well.  In ADO.net by default the data set is disconnected.

'declare variables

Dim objConn as new ADODB.Connection

Dim objRS as new ADODB.Recorset

Dim strConnectionString as String

Dim strSQL as String

'open Connection

objConn.open strConnectionString

'optimize record set properties

objRS.CursorLocation = AdUseClient

objRS.CursorType = adOpenStatic

objRS.LockType = adLockBatchOptimistic

'open the record set

objRS.open strSQL , objConn

'disconnect the record set and close Connection

Set objRS.ActiveConnection = Nothing

ObjConn.Close

'use the recordset

While NOT objRS.eof

'do something

Wend

In a couple of lines data can be retrieved from almost any data source a developer is likely to encounter, including text files and many spreadsheets.

XML

XML is the future for almost all data transmission and data manipulation.  Notice that I did not say anything about the Internet; XML is that huge!

Microsoft, IBM, and Sun support XML-based standards, which include SOAP and UDDI.  These two XML based technologies promise interoperability at the method level across languages, domains, and platforms.  This interoperability allows the RAD abilities of Visual Basic to be felt everywhere, ensuring Visual Basics' place as the most popular development language for years to come.

SOAP is a platform independent protocol, in this sense like HTTP, for exchanging messages in a decentralized, distributed-environment using XML.  SOAP is more standards-based and platform-neutral than previous technologies like CIS, RDS, and Remote Scripting.

The Universal Discovery Description and Integration (UDDI) specifications define a way to publish and discover information about Web Services using XML.  Since a major portion of new development will be Web Services based, UDDI is extremely important because it allows the appropriate functionality to be found on the Internet and utilized.

Best of all, this major shift to platform-independent Web Services as a new industry-wide software model, is fairly simple, all thanks to XML.

Although you can hand-code XML, as you can with HTML, it is easier to have the application do the work. Although this is really BizTalk's forte, here is an example of SQL Server 2000 doing the work, using the very handy FOR XML clause.

SELECT TOP 10 FirstName

FROM Employees

FOR XML AUTO

Results in:

<Employees FirstName="Nancy" EmployeeID="1"/>

<Employees FirstName="Andrew" EmployeeID="2"/>

<Employees FirstName="Janet" EmployeeID="3"/>

<Employees FirstName="Margaret" EmployeeID="4"/>

<Employees FirstName="Steven" EmployeeID="5"/>

<Employees FirstName="Michael" EmployeeID="6"/>

<Employees FirstName="Robert" EmployeeID="7"/>

<Employees FirstName="Laura" EmployeeID="8"/>

<Employees FirstName="Anne" EmployeeID="9"/>

Unfortunately, the FOR XML AUTO clause does not support all SQL statements.  It currently does not even support GROUP BY, for example, which is fairly common.

An alternative to the FOR XML clause is executing SQL statements using the URL.  Although this sounds like the dream of every ASP developer, after all it takes the form of a URL with a SQL statement in the query string, URL access does not allow you to easily write generic Visual Basic functions that return XML from any data source.

http://IISServer/Nwind?sql=SELECT+top+10+FirstName+FROM+Employees +FOR+XML+RAW&root=ROOT

How can you write a generic Visual Basic function that accepts standard SQL statements?  You can not just tack FOR XML AUTO on the end of a regular SQL statement or stick it in the URL.

Even worse, you rely on other database vendors supporting FOR XML or SQL access using HTTP in exactly the same manner.  

ADO equals effortless XML

Fortunately plain ADO does allow you to easily retrieve XML, today.

You can write a generic Visual Basic function, or even one in VB Script, based on the model of a SQL Select query as a parameter and a return value of a XML string.  Furthermore it allows you to easily retrieve the XML, use it, and update it back to the database.  This is functionality you are likely to use again and again, so it is valuable to put the functionality in a data access class.

Since there are so many interesting options available while writing this class, each worthy of its own article, I broke it down into three parts.  Perhaps in future articles, I will explore each part in more depth.

Get the XML from ADO

Call this class ClsDataAccess so it is clear what we intend to use it for.  The most obvious way to implement the class using a simple method GetRS, is still fairly awkward to use.

 Public Function GetRS(ByVal strSQL as String,ByVal strConnectionString as String) as ADODB.Recordset

The awkwardness comes from having the ConnectionStringproperty exposed to the developer, especially if the password is reasonably secure.

"provider=SQLOLEDB; data source=db3x.seriousconsulting.com; initial catalog=Pubs; UID=mtsusr01; PWD=38710z2c7993F82"

How secure can a password be if every developer, designer, content manager, and QA team member has access to a username and password with full read and write permissions on the production server?  Furthermore, changing values within the connection string does not allow the connection to be pooled as efficiently, reducing scalability.

A solution that simplifies reuse and increases security is to set the connection strings as enumerated constants.  Here I provide constants for only two database connections, but in practice, there may often be several.

'the db connectionstrings constants

Public Enum eCONNECTIONSTRING

   CS_Pubs = 0

   CS_NorthWind= 1

End Enum

A simple private function in ClsDataAccess that applies values to the enumerated constants may look like this:

Private Function EvalEnumCS(ConnectionString)

'this is a helper function used by the methods to evaluate the enum value

     If ConnectionString =  CS_ Pubs Then

          EvalEnumCS =  "provider=SQLOLEDB; data source = db3x.seriouscons

ulting.com; initial catalog = Pubs; UID = mtscsusr01; PWD =1eer5130q82F"

     ElseIf ConnectionString = CS_ NorthWind Then

          EvalEnumCS =  "provide r=SQLOLEDB; data source=db2x.ohgolly.com; initial catalog = NorthWind; UID = mtscsusr02; PWD = c4883H55433"

     End If

 Exit Function

By using enumerated constants the method is simpler to use; and by using a function to process the values of the constants, access can be changed in one place for the whole site.  Additionally developers do not need to know any passwords, they create an object from the ClsDataAccess class, pass in a SQL query as a parameter and pick a constant.

Figure 2. Using Enumerated Constants for Database Access

A subtle point that you may have missed is that the connection strings are using a DNS as the datasource property.  This allows the compiled component to be deployed to a development server, QA server, or a production server and hit the correct database without being recompiled.  This is perhaps the best way  to get around the serious shortcoming of having to recompile the class to access a different database in development versus production without having to pass the server name or DSN as an argument of the method.  Remember, passing the Connection String or a DSN as a parameter does not make the GetRS method especially useful.

Here is the GetRS method of the ClsDataAccess, with the enumerated constants and a function to evaluate the constants incorporated into the class.

Public Function GetRS(ByVal strSQL As String,ByVal ConnectionString As eCONNECTIONSTRING = CS_Pubs)

As ADODB.Recordset

'declare variables

Dim objConn as new ADODB.Connection

Dim objRS as new ADODB.Recorset

Dim strConnectionString as String

'set the connection string = to the value of the constant

strConnectionString = CStr(EvalEnumCS(ConnectionString))

'open Connection

objConn.open strConnectionString

'open the record

   'continue as before

This GetRS method is pretty good as a demonstrator, but it returns an ADO Recordset rather than XML. You may want to add error handling and keep it as a method in your data access class, adding a separate method to return XML.

Using Microsoft XML Parser (MSXML) 3.0 there are a couple of ways to get a XML document from the Recordset.  Since the goal is to get XML, and XML is a string, I save the Recordset object to an ADO stream object as XML.

'once the record set is open

objRS.save objADOStream, 1 'adPersistXML

Set objRS.ActiveConnection = Nothing

Conn.Close

' Put the Recordset Stream into a string variable.

strXML = objADOStream.ReadText(-1)  '-1=adReadAll

'return the XML string rather than the record set object

With ADO 2.5 and later, Recordset objects can be persisted into any object that implements the IStream interface. The obvious choice is the ADO Stream object, although the ASP response object also implements IStream.

I use the ADO stream object, which is regrettably infrequently used, so the XML does not have to be saved as a document before we can work with it.  The Recordset can also be saved directly into the XML DOM object. This is more scalable, as it skips having to save the Recordset into an ADO Stream and then loading the ADO Stream into the DOM object.   For demonstration purposes, it is clearer to do the extra step.   Now, you have a usable function that returns XML as a string in a standard ADO Recordset definition.  ADO even allows persistence of hierarchical Recordsets into XML, so you are not especially limited.

Get HTML from the XML

Just to give you an idea of the many uses of XML, lets display the XML as HTML on a web page. Since XML is just data in a text format, you have to transform it with a presentation style before it can be displayed as HTML.  If you write out the raw XML string to a web page the user's browser will not display anything. However, the XML is shown in Source View.

It may not be clear to you what you are seeing in the page source. The source is broken into two sections, a schema section followed by a data section.

The XML document starts with a definition of the record set schema and some additional Meta information. The simplest way to think of a schema is to think of the document as an instance of the schema in the same way an object is an instance of a class.

The actual Recordset data is contained in elements that look like this:

<z:row FirstName='Sean' LastName='Grimaldi' />

If you try working with the XML and experience unexpected problems remember that ADO, and almost all of Windows, is UTF-8 format, where as Java and XML are Unicode.

The Presentation = XML + XSL

In this instance we are using only using simple XSL, although you could also display the XML using Cascading Style Sheets (CSS).  

XSL becomes complex quickly, so it may be useful to keep it basic at first.  There are many excellent code samples and articles on XSL on the Internet, even if there are currently no tools as simple as Visual Basic for working with XSL.

It may be simpler to use a generic XSL style sheet since it will work on any ADO DB Recordset; and modify the XSL as the situation calls for.  An excellent example of a generic XSL style sheet can be in Michele Vivoda topxml.com article http://www.topxml.com/xsl/articles/xsl_ado/.

An ASP page that combines the XML and the XSL could be very short.

'get the XSL style sheet

styleFile = Server.MapPath("Genericxsl.xsl")

'create an XML DOM object, an XSL Dom object, and your Data Access object

Set XMLDoc = Server.CreateObject("Microsoft.XMLDOM")

Set XSLDoc = Server.CreateObject("Microsoft.XMLDOM")

Set DataAccess = server.CreateObject("ProDataAccess.ClsDataAccess")

XMLDoc.async = false

 'load the XML returned from your GetRS method into the XML object XMLDoc.loadXML(DataAccess.GetRs(strSQL,1))

 XSLDoc.async = false

'load the XSL stylesheet into the XSL object

XSLDoc.load(styleFile)

 'write our the HTML result of combining the two

Response.Write XMLDoc.transformNode(XSLDoc)

Combining the XML returning GetRS method with the XSL style sheet results in a plain little HTML table.  Since XSL is much more powerful than what the example has demonstrated, please remember that you could do much, much, more with the XML.  Microsoft Biztalk Server excels at generating XSL so one XML schema can be mapped to a different XML schema.  This means that if you can map fields from one XML document to fields in a generic XML document, you can write more abstract code that deals with one generic case.  This results in more code reuse, faster development, centralized error handling, and more maintainable code.

Get ADORS from the XML

Since you now know that XSL can transform one XML document into an XML document with a different schema, you may have realized that you can transform a very dissimilar XML document into an XML document that is valid to the ADO Recordset schema.  This means you could convert the ADO schema based XML document back into a Recordset, which could be updated to the server/Database.  This uses the source parameter of the ADO Recordset object.

' Open the Stream back into a RecordsetObject.

objRs.open  ADOStream

Almost Done

As I stated, this article is about making the most of ADO and XML until the full-blown Visual Basic.net becomes available.  It covers the Stream object, which is unfortunately commonly ignored.  The sample began showing how ADO could be used to get an XML document from the database.  Secondly the sample demonstrated how the XML document could be used to display records in an HTML table using XSLT.  Lastly, the sample showed how to get the XML into a Recordset object so that the database could be updated.

Obviously this example could be extended quite a bit.  As mentioned, to increase scalability the Stream object could be eliminated from the class. Other extensions, such as more sophisticated XSLT combined with CSS would be valuable in real-world situations.

I hope you reuse the concepts in this article often and to good measure.

Here are some resources you may find useful:

MSDN ADO Stream
http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/dasdk/mdao1ajx.htm

UDDI.org
http://www.uddi.org/

W3C SOAP
http://www.w3.org/TR/SOAP/

W3C XSL
http://www.w3.org/Style/XSL/

TopXML
http://www.topxml.com/xsl/

Posted by 나비:D
:

xml 변환

2008. 1. 14. 13:53

Private Sub test()

Dim oXML As New Xml.XmlDocument

Dim oNode As Xml.XmlNodeList

Dim sRoot As String

Dim sFile As String

Try

sRoot = System.Windows.Forms.Application.StartupPath

sFile = "Test.xml"

oXML.Load(sRoot & "" & sFile)

oNode = oXML.SelectNodes("Test/SubTest[@value=""AttValue01""]")

For Each oEle As System.Xml.XmlElement In oNode

MsgBox(oEle.OuterXml)

Next

Catch ex As Exception

MsgBox(ex.ToString)

Finally

oXML = Nothing

oNode = Nothing

End Try

End Sub

<
Posted by 나비:D
:
1. Oracle Client를 설치하고, 연결할 Oracle을 에 대한 설정을 한다.

2. DB connect Function(여기서 XXX 부분에 Oracle Client에서 설정한 값을 입력한다.)
  - DB 연결이 필요한 부분에 아래 function을 호출한다.

Private Sub ConnectDB()
    Set adoOraCon = New ADODB.Connection
   
    With adoOraCon
        .ConnectionString = "Provider=MSDAORA.1;Data Source=XXX;User ID=XXX;Password=XXX;Persist Security Info=True"
        .ConnectionTimeout = 60
        .Open
    End With
End Sub

3. 모듈에  다음 function을 입력한다.
Option Explicit
Public adoOraCon As ADODB.Connection

'   Procedure : GetRecordSet
' Description : 인자로 넘어오는 쿼리를 실행하고, 결과값을 RecordSet으로 반환
'   Parameter : szSql(쿼리)
'Return Value : Recordset
Public Function GetRecordSet(ByVal szSql As String) As ADODB.Recordset
   
    Dim adoRs As ADODB.Recordset
   
    Set adoRs = New ADODB.Recordset
   
    adoRs.Open szSql, adoOraCon, adOpenKeyset, adLockBatchOptimistic
       
    'Recordset 반환
    Set GetRecordSet = adoRs

    Set adoRs = Nothing
       
End Function

'   Procedure : ExecuteQuery
' Description : 인자로 넘어오는 쿼리를 실행하고 성공여부를 반환
'   Parameter : szSql(쿼리)
'Return Value : True/False
Public Function ExecuteQuery(szSql As String) As Boolean
   
    On Error GoTo ErrHandler
   
    adoOraCon.Execute szSql
   
    ExecuteQuery = True
   
    Exit Function
   
ErrHandler:
    If Err.Number <> 0 Then
        MsgBox Err.Source & vbCrLf & Err.Description, vbExclamation, "쿼리 수행 오류"
        ExecuteQuery = False
        Err.Clear
    End If
End Function

4. 원하는 쿼리를 만들어 모듈의 function을 실행한다.
  - 일반적으로 값을 가지고 오는 Select Query이면, GetRecordSet를 실행하고,
  - insert, delete와 같은 데이터 조작 쿼리인 경우에는 ExecuteQuery를 실행한다.

  예) SELECT Query
    Dim strSQL As String
    Dim adoRs As ADODB.Recordset
   
    '//IMPORTANT : 조회 쿼리 생성
    strSQL = "SELECT * FROM TEST_TAB ORDER BY A_COL"
   
    Set adoRs = GetRecordSet(strSQL)

    While Not adoRs.EOF
        '//IMPORTANT : 가지고 온 결과를 처리하는 부분
        adoRs.MoveNext
    Wend
   
    adoRs.Close
    Set adoRs = Nothing

  예) Execute Query
  Dim strSQL As String
  strSQL = "INSERT INTO TEST_TAB(a_col, b_col, c_col, d_col) VALUES ('" & strName & "', '" & strKorean & "', '" & strMath & "', '" & strEnglish & "')"
       
  If ExecuteQuery(strSQL) = False Then
      Msgbox "실패"
  Else
      Msgbox "성공"
  End If
Posted by 나비:D
:

vb oracle 연결

2008. 1. 14. 09:51
1.OracleClient를설치하고,연결할Oracle을에대한설정을한다.

2.DBconnectFunction(여기서XXX부분에OracleClient에서설정한값을입력한다.)
-DB연결이필요한부분에아래function을호출한다.

PrivateSubConnectDB()
SetadoOraCon=NewADODB.Connection

WithadoOraCon
.ConnectionString="Provider=MSDAORA.1;DataSource=XXX;UserID=XXX;Password=XXX;PersistSecurityInfo=True"
.ConnectionTimeout=60
.Open
EndWith
EndSub

3.모듈에다음function을입력한다.
OptionExplicit
PublicadoOraConAsADODB.Connection

'Procedure:GetRecordSet
'Description:인자로넘어오는쿼리를실행하고,결과값을RecordSet으로반환
'Parameter:szSql(쿼리)
'ReturnValue:Recordset
PublicFunctionGetRecordSet(ByValszSqlAsString)AsADODB.Recordset

DimadoRsAsADODB.Recordset

SetadoRs=NewADODB.Recordset

adoRs.OpenszSql,adoOraCon,adOpenKeyset,adLockBatchOptimistic

'Recordset반환
SetGetRecordSet=adoRs

SetadoRs=Nothing

EndFunction

'Procedure:ExecuteQuery
'Description:인자로넘어오는쿼리를실행하고성공여부를반환
'Parameter:szSql(쿼리)
'ReturnValue:True/False
PublicFunctionExecuteQuery(szSqlAsString)AsBoolean

OnErrorGoToErrHandler

adoOraCon.ExecuteszSql

ExecuteQuery=True

ExitFunction

ErrHandler:
IfErr.Number<>0Then
MsgBoxErr.Source&vbCrLf&Err.Description,vbExclamation,"쿼리수행오류"
ExecuteQuery=False
Err.Clear
EndIf
EndFunction

4.원하는쿼리를만들어모듈의function을실행한다.
-일반적으로값을가지고오는SelectQuery이면,GetRecordSet를실행하고,
-insert,delete와같은데이터조작쿼리인경우에는ExecuteQuery를실행한다.

예)SELECTQuery
DimstrSQLAsString
DimadoRsAsADODB.Recordset

'//IMPORTANT:조회쿼리생성
strSQL="SELECT*FROMTEST_TABORDERBYA_COL"

SetadoRs=GetRecordSet(strSQL)

WhileNotadoRs.EOF
'//IMPORTANT:가지고온결과를처리하는부분
adoRs.MoveNext
Wend

adoRs.Close
SetadoRs=Nothing

예)ExecuteQuery
DimstrSQLAsString
strSQL="INSERTINTOTEST_TAB(a_col,b_col,c_col,d_col)VALUES('"&strName&"','"&strKorean&"','"&strMath&"','"&strEnglish&"')"

IfExecuteQuery(strSQL)=FalseThen
Msgbox"실패"
Else
Msgbox"성공"
EndIf
<
Posted by 나비:D
:
출처 : http://cafe.naver.com/eclipseplugin.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1503

이클립스에 포함된 클래스의 양이 많아지다 보니 클래스를 로딩하는 공간인
Permanant Heap이 모자라서 튕기곤 합니다.

이클립스 실행시 -vmargs -XX:MaxPermSize=256m -Xms128m -Xmx512m 옵션을 붙여서 실행하세요. (참고)

저는 리눅스를 써서 몰랐는데 최근 윈도우 XP를 쓰면서 1G 이상은 메모리가 안 잡혀서
한참 삽질하였습니다. (아마 32비트 버전의 제약이겠죠??)
-Xmx는 그냥 검소하게 512 정도로 사용해야겠네요.

3.3이후로는 eclipse.ini에 아예 PermSize 옵션이 있는데도
우리가 주로 사용하는 Sun JVM에는 적용되지 않는다고 합니다. (참고)

ologist님의 지적에 따르면 이클립스 뿐만 아니라 WAS에서도 AOP 등으로 인해
요즘 dynamic class generation이 많이 발생해서 PermSize가 모자란 경우가 많다고 합니다.
다만 이클립스의 경우는 dynamic class generation 보다는 XML(plugin.xml)에 의한
static class의 dynamic binding이기 때문에 실행하면서 무한히 용량이 늘어나는 경우는
없을 듯 합니다.
Posted by 나비:D
:

일 대 다 관계의 테이블이 있습니다.

이것을 쿼리 해서 화면에 표현해 주려하는데요.

1.조인 쿼리후 레코드셋으로 받아 루프돌며 찍는 방법

2. 마스터 테이블을 쿼리후 루프돌며 디테일 테이블을 쿼리하는 방법

대략 이렇게 많이 쓰게됩니다. (뭐 2번째는 거의 안쓰겠죠. ^^)

그런데 이번 작업을 하다보니 왠지 쓸데없는 낭비가 많은것 같아

다른 방법으로 처리해 보았습니다.

아래와 같은 일 대 다 관계의 테이블을 준비합니다.

각각의 테이블에 데이터를 입력해 보죠.

< tb_books >

< tb_subscriber >

이제 조인을 걸어 데이터를 얻어보겠습니다.

물론 여기까지는 원하는 대로(?) 잘 나옵니다.

저것을 레코드셋으로 받아 처리하면 되겠지요.

하지만 자세히 보면 낭비되는 부분들이 있습니다.

마스터 데이터 들이 반복되는 점이죠.

해서~ 이렇게 반복되는 부분을 없앨 방법을 고민하다 찾은 것이 바로

XML을 이용하는 것이었습니다.

XML로 아래와 같이 데이터를 받는다면 반복되는 많은 양이 줄어들며,

XMLDOM을 이용하여 node tracking을 한다면 데이터 처리도 간편할 것이고,

데이터를 DOM에 담는 즉시 데이터 베이스와의 커넥션을 끊으면 될것이기에 이래 저래 이득이라 생각했습니다.

XML로 받는다면 아래와 같이 받아야 할것입니다.

이제XML로 데이터를 어떻게 받아내면 될까요??

for xml 이라는 구문으로 쿼리를 하면 바로 XML 데이터를 받아낼 수 있습니다. 빙고~

SELECTa.idx,a.bookname,a.price,b.name
FROM
tb_booksASaINNERJOIN
tb_subscriberASbONa.idx=b.book_idx
ORDERBYa.idx
forxmlauto
for xml 의 옵션으로는 raw 도 있지만 이것은 그냥 레코드형식으로만 출력되므로 패스합니다.

for xml auto, elements 옵션을 사용하게되면 모든 컬럼이 element로 바뀌게 됩니다.

사용하는데 문제는 없지만 보기가 좀 어렵군요. ^^

자... SQL에서는 이제 XML로 데이터를 넘겨줄 준비를 완료 하였습니다.

다음은 ASP 단에서 어떻게 처리해야할지 알아보겠습니다.

ASP단에는 일단 쿼리를 위한 ADODB.Command 객체와 결과를 담을 XMLDOM 객체를 준비하여 아래와 같이 코딩합니다.

SetxmlDom=Server.CreateObject("Microsoft.xmldom")
xmlDom.setProperty
"SelectionLanguage","XPath"

setcmd=server.createObject("ADODB.Command")
withcmd
.ActiveConnection
="Database 커넥션'
.CommandText
="여기에는 쿼리를"
.CommandType
=adCmdText

.Properties(
"XMLRoot")="root"
.Properties("OutputStream")=xmlDom
.Execute,,
1024
endwith
set
cmd=Nothing

이렇게 하면 XMLDOM에 결과가 root라는 root 엘리먼트를 가진 xml 데이터가 로드됩니다.

이제는 단순히 XMLDOM node tracking을 하면서 데이터를 뿌려주면 됩니다.

Setitems=xmlDom.selectNodes("*/a")

foreachiteminitems
WithResponse
.Write
""&item.getAttribute("bookname")&"
"
foreachsubscriberinitem.selectNodes("./b")
.Writesubscriber.getAttribute(
"name")&"
"
next
EndWith
next
<
Posted by 나비:D
:
 
장점
- 직관적인 사용법: Ctrl+/ 주석 처리와 기본 인코딩 지원(최대 강점)
- 높은 버전: 안정성을 기대할 수 있다.
단점
- 도움말이 없다.


주석처리 지원과 인코딩 변환이면 핵심 기능은 다 있는 것이다.
Preferences 설정을 통해서 키 중복을 막을 수도 있다.
 
ResourceBundle Editor
장점
- 막강한 기능: i18n 지원, 프로퍼티 Tree view 제공, 마법사 기능
단점
- 도움말이 없다.
- 복잡한 사용법(최대 약점)
- 조악한 UI

 
뭔가 그럴싸하지만, 적응이 필요한 화면이다.
정작 에디터에선 Ctrl+/ 로 주석처리가 안된다.ㅡㅡ;
 
i18n을 많이 써야 하는 다국어 지원 솔루션 개발자들에게는 유용할 것 같다.

일반적인 정보시스템, 웹 개발, 단일어 어플리케이션 개발에는 Properties가 더 나은 듯..
Posted by 나비:D
:

XML 기본지식

2008. 1. 4. 14:09

XML(Extensible Markup Language)
 - 구조를 갖는 텍스트
 - 데이터 표준 포맷
 - 모든 컴퓨터와 사람이 동시에 이해할 수 있는 정보 표현 방법
 - 어플리케이션 간의 데이터 교환
 - HTML(표현 중심), XML(내용, 구조 중심)

 - 필요 환경
  - IE 6.0(MSXML 3.0 파서 내장
  - XML 지원 브라우저(IE 6.0)

1. XML
2. DTD
3. Schema
4. CSS
5. XSL(XPath)
6. DOM

WellFormed Document 규칙
 - 모든 요소가 XML 스펙을 준수 할때 그 문서를 WellFormed 하다고 간주한다.
 - http://www.w3c.org/xml
 - http://www.trio.co.kr

 - Element
 - Attribute
 - Data
 - Entity

 1. XML 선언문를 시작으로 한다.
  - <xml version="1.0" ?>

 2. 다른 모든 엘리먼트를 포함하고 있는 하나의 루트 엘리먼트를 가져야 한다.

 3. 데이터를 포함하고 있는 엘리먼트는 시작태그와 끝태그를 가지고 있어야 한다. 태그는 대소문자를 구분한다.

 4. 데이터를 포함하고 있지 않고 하나의 태그만 을 사용하는 엘리먼트는 /> 로 끝나야 한다.

 5. 엘리먼트가 다른 엘리먼트에 포함될 수는 있지만 중첩은 안된다.

 6. 속성값을 따옴표로 표현한다.

 7. <,&는 태그에만 사용가능하고 데이터로 사용 불가능 하다. 사용하려면 Enter를 이용한다.

 8. XML의 주석은 <!-- -->를 사용한다.

 9. 태그명은 공백 사용이 불가능하다.

 10. 태그명은 문자, 숫자, 언더바, 하이퍼만 가능하고 첫문자는 문자 or 언더바


DTD
 - XML 설계도
 - XML 문서에서 사용될 태그, 속성의 종류나 제한 조건등을 기술
 - 일종의 프로토콜 개념, 저장 구조 개념
 - 구성 요소의 종류, 갯수, 순서 등을 명시
 - DTD 조건에 일치하는 문서 -> Valid XML Document

DTD 선언 형태
 1. DTD 구성요소
  - 요소 선언(<!ELEMENT ..>)
  - 속성리스트 선언(<!ATTLIST..>)
  - 엔티티선언(<!ENTITY..>)
 2. DTD 타입
  - 내부 DTD(XML 문서 내에 기술)
   : xml과 dtd를 따로 보관할 필요X, 한장으로 가능, 이동이 자유롭다, 처리시간이 빠르다
  - 외부 DTD(별도의 DTD 문서 *.dtd)
   : 재사용, 외부 지역에 있어도 통신이 가능하면 활용 가능
  - 겹치면 내부 우선
 3. 공개 DTD
  - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  - <!DOCTYPE 루트엘리먼트 공개유무(PUBLIC|SYSTEM) "조직명//데이터종류//언어코드">


ELEMENT 선언
 - XML 문서의 요소(태그)의 이름, 출현 횟수, 순서등을 정의

선언 형태
 - <!ELEMENT 요소명(요소형)>
 - 요소명 : 태그명
 - 요소형
  : 태그의 형태(요소내용 | 혼합 내용 | 빈요소(Empty) | 텍스트데이터)
 - ex) <!ELEMENT 이름 (#PCDATA)>

 1. 요소 내용
  - 자식의 대상이 요소로만 구성되는 경우. 텍스트X
  - 자식요소의 출현 횟수와 순서등을 결정

 2. 혼합 내용
  - 자식의 대상으로 요소와 텍스트가 둘다 나오는 경우

 3. 빈요소
  - 자식이 되는 구성 요소가 없는 경우
  - EMPTY
  - 단독태그
 
 4. 텍스트 데이터
  - 더 이상 자식 요소가 없고 텍스트 데이터만 가질 경우
  - #PCDATA
  - 말단 노드, 터미널 노드, 최하위 노드

<!-- dtdEX04.xml -->
<!-- dtdEX05.xml -->
순서 지정
 1. () : 같은 출현횟수를 가지는 요소를 묶을때...
 2. , : 나열된 요소들이 명시된 순서대로 나올때...
 3. | : 대체 가능한 요소들을 구분

<!-- dtdEX06~09.xml -->
출현횟수
 4. 표시없음 : 출현 횟수가 1, 생략불가, 중복불가
 5. ? : 출현횟수가 0 또는 1, 생략가능, 중복불가
 6. + : 출현횟수가 1이상, 생략불가, 중복가능
 7. * : 출현횟수가 0 또는 1 이상, 생략가능, 중복가능

DTD에서의 속성 선언[속성리스트 선언]
 - 엘리먼트를 설명하는 속성에 대한 정의
 - <!ATTLIST 태그명 속성명 타입  값>

속성타입
 - CDATA : 속성값으로 문자열사용
 - ENTITY : DTD에서 선언한 엔티티 참조
 - ID : 유일값
 - IDREF : ID 값 참조
 - 열거형 : 열거값

값표시방법
 - #REQUIRED : 필수
 - #IMPLIED : 생략가능
 - #FIXED : 고정값 사용
 - 기본값 : 생략하면 기본값 사용 auto (Y|N) "Y"

Entity
 -DTD와 XML Document에서 대치 가능한 컨텐츠 생성

1. General Entity
 - 모든 XML Document에서 사용 가능, Parsed Entity와 Unparsed Entity 로 나뉨
2. Parameter Entity
 - 외부 DTD에서 사용

General Entity
 - <!ENTITY 엔티티명 "대치할 내용"> : 선언시(DTD내에서..)
 - &엔티티명;:사용시(XML Document내에서..)

Built-in Entity(미리약속된)
 - &lt; &gt; &quot; &apos; &amp;
 - &#문자코드; ex) &#38; &#x26;

외부 Entity
 - 엔티티 내용만 독립파일로 생성해서 호출 가능
 - !<ENTITY 이름 SYSTEM "파일명">

Parameter Entity
 - 엔티티 선언시에만 사용 가능하고, 외부 DTD에서만 사용 가능하다.
 - !<ENTITY % 엔티티명 "대치할 내용"> : 선언시(외부 DTD내에서..)
 - %엔티티명;:사용시(엔티티 선언시..)

Schema
 - DTD의 단점을 보완, 기능 강화
 - 유효한 데이터 검증
 - DTD에서 표현하지 못하는 데이터 표시 가능
 - 사용자 정의 데이터 타입 생성 가능
 - 기존의 엘리먼트, 어트리뷰트를 상속받아 확장, 제한이 가능
 - 대체 엘리먼트 가능, 상황에 따른 구조 변경 가능
 - 데이터 모델 (XML 문서 구조) & 데이터 타입(데이터 형식 정의)

Schema 선언
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <!-- 스키마 내용 -->
 <!-- xmlns = XML NameSpace -->
  <xsd:element>
 </xsd:schema>

Schema 호출
 <루트엘리먼트 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="스키마파일.xsd">
  <!-- XML 내용 -->
 </루트엘리먼트>


CSS & XML
 - XML 데이터를 브라우저 환경에 시각적으로 표시
 - <?xml-stylesheet href="CSS파일명" type="text/css"?>


XSL(eXtensible Stylesheet Language)
 - XSLT(XSL Transformation) : XML문서를 또다른 XML문서나 비XML문서로 변환

XSL 선언문
 - <xsl:stylesheet version="1.0" xmlns:xsl="http://ww.w3.org/1999/XSL/Transform" xmlsn:fo="http://www.w3.org/1999/XSL/Format"> (표준선언문)
 - <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> (비표준선언문)

XSL 기본형(*.xsl)
 <?xml version="1.0" encoding="euc-kr"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  <xsl:template match="/">
   XSL 처리내용 기술
  </xsl:template>
 </xsl:stylesheet>

적용 XML 문서(*.xml)
 <?xml version="1.0" encoding="euc-kr"?>
 <?xml-stylesheet href="XSL파일" type="text/xsl"?>
 <root>
 </root>

XPath
 - XML문서의 노드 접근 표현식
 - XPath 표현식에선 가상의 최상위 엘리먼트 존재 -> "/"

 ex) match="표현식"
 1. /
  - 가상의 루트 노드
 2. *
  - 노드 전체
 3. .
  - 노드 자기 자신
 4. /a/b/c
  - 루트노드에서 출발해서.. a자식, b자식, c노드
 5. a
  - a노드자신(상대경로), 이전 표현식에서 /로 시작하는 표현식이 1회이상 출현
  - /a 와는 다른 표현
 6. //a
  - 전체 노드 중 a를 이름으로 갖는 노드
  - 처음 a노드를 만나면 탐색 중단
 7. a[b]
  - [] 조건
  - b노드를 자식으로 갖는 a노드
  - a/b
 8. a[b='c']
  - c텍스트데이터를 갖는 b노드를 자식으로 갖는 a노드
 9. a[b='c']/d
  - c텍스트데이터를 갖는 b노드를 자식으로 갖는 a노드의
    자식 노드인 d노드
 10. a/@b
  - a노드의 속성중 b라는 속성
 11. a[@b]
  - b라는 속성을 갖는 a노드 ex) <a b="">data</a>
 12. a[@b='c']
  - b속성값이 c인 a노드 ex) <a b="c">data</a>
 13. a[@b='c']/d
  -b속성값이 c인 a노드의 자식 노드d
 14. a/@*
  - a의 모든 속성
 15. a/*
  - a의 모든 자식엘리먼트
 16. a[@b &gt;= c and @b &lt;= d]
  - a[@b >= c and @b <= d]

XPath 함수
 - name() - 노드명 반환
 - text() - PCDATA 반환(단, 순수 자신의 PCDATA만)
 - position() - 노드의 위치를 지정 ex) //회원[position()=2]
 - last() - 노드집합의 마지막 노드 위치 반환
 - count() - 노드집합의 갯수 반환
 - sum() - 노드집합의 모든 합 반환
 - contains() - 문자열 안에 특정 문자열 포함 유무 확인
 - starts-width() - 문자열이 특정 문자열로 시작하는지 유무

Axis 표현
 1. self::*  - 자기 자신
 2. attribute::* - 속성
 3. parent::* - 부모 노드(단일)
 4. child::* - 자식 노드(집합O)
 5. ancestor::* - 직계 조상 노드(집합O)
 6. ancestor-or-self::* - 자신을 포함한 직계 조상 노드
 7. descendant::* - 자손 노드
 8. descendant-or-self::* - 자신을 포함한 자손 노드
 9. following::* - 자손을 제외하고 자신보다 하위에 표기된 노드 전체
 10. following-sibling::* - 자신보다 하위에 표기된 형제 노드
 11. preceding::* - 직계 조상을 제외하고 자신보다 상위에 표기된 노드 전체
 12. preceding-sibling::* - 자신보다 상위에 표기된 형제 노드

XSL 표현
 1. <xsl:template match="XPath표현"></xsl:template>
  - XML 문서 내용을 템플릿 지정 형태로 변환
  - 템플릿의 기본 형식은 HTML
  - 템플릿은 패턴부와 액션부 나뉜다

 2. <xsl:apply-template select="XPath표현"</xsl:template>
  - 특정 템플릿을 이 위치에서 적용하겠다..

 3. <xsl:value-of select="XPath표현"/>
  - 특정 노드의 값 출력(텍스트)

 4. <xsl:for-each select="XPath표현">
   반복 실행 구문
  </xsl:for-each>
  - 같은 태그가 반복될 경우 반복 실행

 5. <xsl:sort select="XPath표현" data-type="number|text" order="ascending|descending"/>
  - 노드값에 의한 정렬
 
 6. <xsl:if test="조건식">실행문</xsl:if>
  - 조건식
  - 조건식 부정 -> not()함수
 
 7. <xsl:choose>
   <xsl:when test="조건식1"></xsl:when>
   <xsl:when test="조건식2"></xsl:when>
   <xsl:when test="조건식3"></xsl:when>
   <xsl:otherwise></xsl:otherwise>
  </xsl:choose>
  - 다중 조건문
 
 8. <xsl:element name="요소명">요소값</xsl:element>
  - 엘리먼트 동적 생성
 
 9. <xsl:attribute name="속성명">속성값</xsl:attribute>
  - 속성 동적 생성

 10. <xsl:comment></xsl:comment>
  - 주석 동적 생성
 
 11. <xsl:text></xsl:text>
  - 텍스트 노드 동적 생성

DOM(Document Object Model)
 -객체지향 프로그래밍 언어에서 XML 문서의 내용을 쉽게 다룰 수 있도록 제작한  API의 표준 스펙
 -플랫품과 언어에 독립적
 -XML 문서와 문서의 일부를 생성하고, 문서를 탐색하고, 문서의 부분을 이동, 복사, 제거하거나 속성을 추가, 수정, 제거할 수 있다.

DOM 인터페이스
 - 기초 인터페이스
  1. Node
  2. Document
  3. Nodelist
  4. Element
  5. Attr
  6. Text
  7. Comment
 - 확장 인터페이스
  1. CDATASection
  2. ProcessingInstruction
  3. Entity

XML 접근방식
 1. DOM(Object)
 2. SAX(Stream)

XML 닷넷 지원 클래스
 - System.XML
 - DOM : XmlDataDocument
 - SAX : XmlReader, XmlWriter
 - System.Xml.XPath
 - System.Xml.Xsl

XMLTextReader/XmlTextWriter
 - 처리 속도가 빠르다
 - 메모리 효율이 높다(버퍼 사용X)
 - 커서 이동이 단순 전진
 - 수정, 삭제가 어렵다
 - 유효성 검사를 추가로 해야 한다.

XmlDocument(DOM)
 - 문서 구조를 유연하게 접근 가능(트리구조)
 - 다른 언어의 접근 방식과 유사(DOM)
 - 수정, 삭제가 용이
 - XPath 표현에서의 접근 속도가 느리고, 오버헤드가 크다
 - 메모리 효율이 낮다(버퍼 사용O)

XmlDocument
 - Document 객체
XmlNode
 - 노드(엘리먼트, 속성, PCDATA...)
XmlNodeList
 - 노드 집합(검색)
XmlElement
 - 엘리먼트
XmlAttribute
 - 속성
 
XPath 클래스
 - XPath 표현식을 이용한 노드 접근 방식 제공
 - DOM 접근방법보다 빠른 검색 속도
 - 단순 검색, 편집 기능X

Posted by 나비:D
:

출처 : http://miriam.tistory.com/209

<?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE Computer [
<!ELEMENT Computer (CPU, Memory, GraphicCard)>
<!ELEMENT CPU (#PCDATA)>
<!ELEMENT Memory (#PCDATA)>
<!ELEMENT GraphicCard (#PCDATA)>
]>

XML 문서의 DTD 선언문(Document Type Declaration)
    => XML의 구조가 DTD에 의해 정의되어 있다는 것을 명시하기 위한 구문
       1) <!DOCTYPE 문서타입이름 SYSTEM "DTD 파일이름">
       2) <!DOCTYPE 문서타입이름 [ DTD 정의 ]>
       3) 엘리먼트 선언 방법
   <!ELEMENT 엘리먼트 이름 엘리먼트 내용>
       4) 하위 엘리먼트를 갖는 엘리먼트 선언
   <!ELEMENT Book (Title, Author, PubDate)>
       5) 값을 갖는 엘리먼트 선언
   <!ELEMENT Title (#PCDATA)>
       6) 빈 엘리먼트 선언
   <!ELEMENT PubDate EMPTY>
 
<!DOCTYPE BookList [
<!ELEMENT BookList (Book)>
<!ELEMENT Book (Title, Author, PubDate)>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Author (#PCDATA)>
<!ELEMENT PubDate (#PCDATA)>
]>

엘리먼트의 연결자
    => , : and 의 의미로 엘리먼트가 순차적으로 발생함  <!ELEMENT A (B, C)>
       | : or 의 의미로 엘리먼트가 선택적으로 발생함   <!ELEMENT A (B | C)>

<xml version="1.0" encoding="euc-kr">
<!DOCTYPE BookList [
<!ELEMENT BookList (Book)>
<!ELEMENT Book (Title, Author, (PubDate | Author))>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Author (#PCDATA)>
<!ELEMENT PubDate EMPTY>
<!ELEMENT Date EMPTY>

엘리먼트의 발생 지시자
    => <!ELEMENT BookList (Book)> : 반드시 한번 사용된다
       <!ELEMENT BookList (Book?)> : 사용되지 않거나 한 번 사용된다
       <!ELEMENT BookList (Book+)> : 한번 이상 사용된다
       <!ELEMENT BookList (Book*)> : 사용되지 않거나 여러 번 사용된다

<!DOCTYPE BookList [
<!ELEMENT BookList (Book+)>
<!ELEMENT Book (Title, Author*, (PubDate | Date)?)>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Author (#PCDATA)>
<!ELEMENT PubDate EMPTY>
<!ELEMENT Date EMPTY>
]>

어트리뷰트의 형
    => CDATA : 일반적인 값을 갖는 어트리뷰트
       <!ATTLIST Date year CDATA #REQUIRED>
    => 열거형 : 열거된 값 중 하나를 선택적으로 갖는 어트리뷰트
       <!ATTLIST Price unit (원 | 달러 | 엔) #REQUIRED>
    => ID 형 : XML 문서 내에 유일한 값을 갖는 어트리뷰트 선언

<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE BookList [
<!ELEMENT BookList (Book+)>
<!ELEMENT Book (Title, Author*, Price, (PubDate | Date)?)>
<!ATTLIST Book ISBN ID #REQUIRED>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Author (#PCDATA)>
<!ELEMENT Price (#PCDATA)>
<!ATTLIST Price unit (원 | 달러 | 엔) #REQUIRED>
<!ELEMENT PubDate EMPTY>
<!ATTLIST PubDate year CDATA #REQUIRED month CDATA #REQUIRED>
<!ELEMENT Date EMPTY>
]>

어트리뷰트의 디폴트 값
    => #REQUIRED : 반드시 사용되어야 하는 어트리뷰트 선언
       <!ATTLIST Book ISBN ID #REQUIRED>
    => #IMPLIED : 어트리뷰트가 사용될 수도 있고, 사용되지 않을 수도 있다
       <!ATTLIST Date year CDATA #IMPLIED>
    => #FIXED "어트리뷰트 값" : 어트리뷰트가 사용될 경우에는 반드시 선언된
       값으로 사용해야 함
       <!ATTLIST Price unit CDATA #FIXED "won">
 
******* 54 Page 참고 ********

<?xml version="1.0"?>
<!DOCTYPE Person [
<!ELEMENT Person (#PCDATA)>
<!ENTITY name "이명진">
]>

<Person> &name </Person>

<?xml version="1.0"?>
<!DOCTYPE Person [
<!ELEMENT Person (#PCDATA)>
<!ENTITY name SYSTEM name.txt>
]>

<Person> &name </Person>



<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE BookList [
<!ELEMENT BookList (Book+)>
<!ELEMENT Book (#PCDATA)>
<!ENTITY name "XML 프로그래밍">
<!ENTITY bookContent SYSTEM "book.xml">
]>

<?xml version="1.0" encoding="euc-kr"?>
<com:Computer xmlns:com="
http://www.computer.com">
 <com:CPU>Pentium 2.0</com:CPU>
 <com:Memory>512MB</com:Memory>
 <com:GraphicCard>Radeon 9200</com:GraphicCard>
</com:Computer>

<lan:name xmlns:lan="http://www.sun.com">Java</lan:name>
<food:name xmlns:food="
http://www.food.net">Java</food:nae>

<Computer xmlns="http://www.computer.com">

<!ELEMENT title (#PCDATA)> :: <xsd:element name="title" type="xsd:string" />
<!ELEMENT number (#PCDATA)> :: <xsd:element name="number" type="xsd:integer" />
<!ELEMENT date (#PCDATA)> :: <xsd:element name="title" type="xsd:date" />


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema xmlns:xsd="http//www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <xsd:element name="car">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="name" type="xsd:string" />
    <xsd:element name="CC" type="xsd:integer" />
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>

<?xml version="1.0" encoding="UTF-8" standalone="yes?>
<xsd:schema xmlns:xsd="
http://www.w3.org/2001/XMLSchema" elementFormDefault="qualifed">
<xsd:element name="car">
 <xsd:complexType>
  <xsd:sequence>
   <xsd:element name="name" type="xsd:string" />
   <xsd:element name="CC" type="xsd:integer" />
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>
</xsd:schema>


<!ELEMENT book (name, author?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT authors (#PCDATA)>

<xsd:element name="book">
 <xsd:complexType>
  <xsd:sequence>
   <xsd:element name="name" type="xsd:string" />
   <xsd:element name="authors" type="xsd:string" minOccurs="0" maxOccurs="1">
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="
http://www.w3.org/2001/XMLSchema">
  <xsd:element name="booklist">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="book" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="name" type="xsd:string" />
              <xsd:element name="author" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="page" type="xsd:integer" />
              <xsd:element name="price" type="xsd:integer" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>


기본적으로 제공되는 데이터 타입
=> string / boolean / decimal / time / date / duration
   integer / ID

Complex Type - <xsd:complexType>
=> <xsd:element> 엘리먼트의 하위 요소
   엘리먼트가 하위 엘리먼트나 어트리뷰트를 갖을 경우에 사용

<element name="page">
    <simpleType>
        <restriction base="xsd:string">
            <minInclusive value="100" />
            <maxInclusive value="200" />
 </restriction>
    </simpleType>
</element>

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="booklist">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="book" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="part">
                <xsd:simpleType>
                  <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="XML" />
                    <xsd:enumeration value="XSLT" />
                    <xsd:enumeration value="Schema" />
                  </xsd:restriction>
                </xsd:simpleType>
              </xsd:element>
              <xsd:element name="name" type="xsd:string" />
              <xsd:element name="page">
                <xsd:simpleType>
                  <xsd:restriction base="xsd:integer">
                    <xsd:minInclusive value="1" />
                    <xsd:maxInclusive value="1500" />
                  </xsd:restriction>
                </xsd:simpleType>
              </xsd:element>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>


Contents Model : 엘리먼트가 갖는 하위 엘리먼트들의 발생 관계를 나타낸다.
=> <xsd:sequence> : 각 엘리먼트들이 순서대로 발생
   <xsd:all> : 순서에 상관없이 한 번씩 발생
   <xsd:choice>

********* 88 / 89 페이지 ************

SAX의 7가지 이벤트 핸들러
=> ContentHandler / ErrorHandler / DTDHandler / EntityResolver
   DeclHandler / LexicalHandler / DefaultHandler


class ImplHandler implements ContentHandler {
 void startDocument() {
  System.out.println("XML Document Start");
 }
 void endDocument() {
  System.out.println("XML Document End");
 }
}

ErrorHandler : XML 문서 처리 도중 오류 발생시 호출되는 이벤트
=> fatalError(SAXParseException exception)
   error(SAXParseException exception)
   warning(SAXParseException exception)

ImplHandler errorHandler = new ImplHandler();
xmlReader.setErrorHandler(errorHandler);

SAX 파서 사용 예제
=> SAXParserFactory factory = SAXParserFactory.newInstance();
   SAXParser parser = factory.newSAXParser();
   parser.parse(filename, new DefaultHandler());

   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = new factory.newDocumentBuilder();
   Document document = builder.parse(filename);

/**
DOM 파서를 생성하고, XML 문서를 파싱하거나 새로운 XML 문서를 생성하는 예제
**/
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class CreateDOMParser {
 public static void main(String[] args) {
  try {
   DocumentBuilderFactory factory =     
                   DocumentBuilderFactory.newInstance();
   DocumentBuilder dBuilder = factory.newDocumentBuilder();

   // 빈 Document 객체 생성
   Document emptyDocument = dBuilder.newDocument();
   System.out.println("빈 Document 객체 생성 완료");
   
   // XML 파일을 로딩하여 Document 객체 생성
   Document xmlDocument = dBuilder.parse("DOMSample.xml");
   System.out.println("DOMSample.xml 문서를 입력으로 Document 객체 생성 완료");
  } catch(Exception e) {
   e.printStackTrace(System.err);
  }
 }
}

Posted by 나비:D
:

1.    F1 : 선택된 항목에 대한 비주얼 베이직 도움말 보기
2.    F2 : 개체 찾아보기
3.    F3 : 다음 찾기
4.    F5 : 컴파일하기
5.    Crtl+F5 : 전체 컴파일한 후 다시 시작하기
6.    Crtl+F : 찾아보기 (Find)
7.    Crtl+H : 바꾸기
8.    Crtl+I : 변수등의 요약 정보
9.    Crtl+J : 속성과 메소드 목록보기
10.    Crtl+Z : 실행 취소
11.    Crtl+DEL : 한 단어만 지우기
12.    Crtl+오른쪽 화살표 : 한 단어만큼 오른쪽으로 이동
13.    Crtl+왼쪽 화살표 : 한 단어만큼 왼쪽으로 이동
14.    Crtl+Home : 해당 모듈의 처음으로 이동
15.    Crtl+End : 해당 모듈의 끝으로 이동
16.    Crtl+아래쪽 화살표 : 다음 프로시저의 첫번째 줄로 이동
17.    Crtl+위쪽 화살표 : 이전 프로시저의 첫번째 줄로 이동
18.    Crtl+Page Up : 이전 프로시저 선언으로 가기
19.    Crtl+Page down : 다음 프로시저 선언으로 가기
20.    Crtl+스페이스바 : 나머지 단어 채우기
21.    Shift+F2 : 프로시저 정의 보기
22.    Shift+F3 : 이전 찾기
23.    Shift+F10 : 오른쪽 마우스 버튼 클릭한것과 동일한 효과
24.    Shift+Tab : 선택된 부분의 들여쓰기 해제
25.    Shift+오른쪽 화살표 : 오른쪽으로 한 단어 더 선택하기
26.    Shift+왼쪽 화살표 : 왼쪽으로 선택된 한 단어 해제하기
27.    Shift+아래쪽 화살표 : 위로 한 줄 더 선택하기/지우기
28.    Ctrl+Shift+F2 : 가장 마지막으로 가기
29.    Ctrl+Shift+J : 상수 열거
30.    Ctrl+Shift+I : 인수 정보 보기


  1. Shift + F2        : 선언된 함수, 변수로 이동하기
  2. Shift + Ctrl + F2 : Shift + F2 로 가서 되돌아오기
  3. F8                : 한문장씩 실행하기(중지모드에서 사용)
  4. Shift + F8        : 어떤 문장이 사용자 정의 함수를 호출할시
                         F8키는 함수안으로 들어가지만, Shift + F8 키는
                         함수를 모두 실행하고 다음 문장으로 이동합니다.
                         (중지모드에서 사용)
  5. Ctrl + F9         : 노란색선을 원하는 위치로 이동하기
                         중지모드에서 현재 실행중인 코드가 노란색으로
                         나타납니다. 마우스나 키보드로 특정문장으로
                         커서를 이동 시킨뒤 Ctrl + F9키를 누르면
                         여기부터 다시 실행할 수 있습니다.
  6. Ctrl + SpaceBar   : 단어채우기
                         코딩중 긴함수나 긴변수를 일일히 쓰는건 아주
                         짜증나는 일입니다. 만약 변수명이 mintRecordCount
                         일 경우 mintR 한다음에 Ctrl + SpaceBar를
                         누르면 단어가 자동으로 채워 집니다.
                         (중복 단어가 있으면 골라서 사용할 수 있습니다.)
  7. 꽁수(....^^)
     만약 어떤 이벤트를 테스트할 목적으로 디버깅 하려면 여러분들은
     보통 어떤식으로 하십니까?... 아마 그 이벤트에 F9키를 눌러서
     중단점을 잡아 놓고서 F5키를 눌러서 실행 할 것입니다.
     그런데 중단점을 잡아 놓지 않고, 할수 있는 방법이 있는데 그 방법을
     설명해 드리겠습니다...

     먼저 실행도중에 Ctrl + Break키를 눌러서 중지모드 상태로 들어갑니다.
     다음에 F8키를 누르고, 어떤 이벤트(버튼클릭 또는 키보드 입력 ....)를
     발생시키면 디버깅 상태로 들어갈 것입니다.(전재조건 : 발생시킨 이벤트
     안에는 반드시 코드가 있어야겠죠...)



단축키(ShortCut Key) 설명
   CTRL+C              선택영역 복사하기  
   CTRL+X              선택영역 잘라내기
   CTRL+Y              현재줄 잘라내기  
   CTRL+V              붙여넣기  
   CTRL+DELETE         문장단위로 지우기
   TAB                 선택영역 한번에 내여쓰기  
   SHIFT+TAB           선택영역 한번에 들여쓰기  
   CTRL+Z              되돌리기(실행취소)  
   CTRL+RIGHT ARROW    다음 단어로 이동  
   CTRL+LEFT ARROW     이전 단어로 이동  
   CTRL+DOWN ARROW     다음 프로시져로 이동  
   CTRL+UP ARROW       이전 프로시져로 이동
   SHIFT+F2            정의 보기  
   CTRL+F              찾기  
   CTRL+H              바꾸기  
   CTRL+S              저장하기  
   F7                  코드창으로 이동하기
   F4                  속성창으로 이동하기  
   CTRL+R              프로젝트 탐색기로 이동하기  
   F5                  실행  
   F8                  한 단계씩 코드 실행



Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :