1장 ASP 와 XML
XML파일을 ASP 프로그램에서 사용하는 방법에는
- XML 객체 생성후 xml 문서를 DOM에서 로딩하는 방법
- ASP 페이지 내에 인클루드 시키는 방법(Server-side Includes, SSI)
- FieSystemObject를 이용하여 XML 문서에 접근 하는 방법
ASP 파일을 사용하는 이유
- XML 과 XSL의 기능이외에 추가적으로 필요한 기능을 DOM을 이용하여 ASP로 구현하기 위한 것
- XML 데이터를 갱신하고 수정 및 기록은 ASP를 활용하며 XML 데이터의 접근 및 읽기는 클라이언트 측 데이터 바인딩 기능을 활용한다.
간단한 예제
asptest1.asp, asptest1.xml, asptest1.xsl의 파일을 준비
asptest1.asp를 익스플로러에서 불러오면 XML 파일과 XSL 파일을 가져와서 화면에 보여줌
[asptest1.asp]
<%
dim oSource, sStyle '// 변수(객체)의 선언
'// XML DOM 객체를 생성한다.(asptest1.xml)
Set oSource=Server.CreateObject("Microsoft.XMLDOM")
oSource.async=false
'// DOM 객체에 asptest1.xml 파일을 로드한다
oSource.Load Server.MapPath("asptest1.xml")
'// XML DOM 객체를 생성한다.(asptest1.xsl)
Set oStyle=Server.CreateObject("Microsoft.XMLDOM")
oStyle.async=false
'// DOM 객체에 asptest1.xsl 파일을 로드한다
oStyle.load Server.MapPath("asptest1.xsl")
'// xsl의 폼에 의해 xml을 뿌려준다.
Response.Write oSource.TransformNode(oStyle)
'// 객체를 닫는다.
Set oStyle = nothing
Set oSource = nothing
%>
|
[asptest1.xsl]
<?xml version="1.0" encoding="euc-kr"?>
<상영영화>
<영화>
<제목>인디안썸머</제목>
<주인공>이미연,박신양</주인공>
<감독>노효정</감독>
<개봉날짜>
<년>2001</년>
<월>04</월>
<일>28</일>
</개봉날짜>
</영화>
</상영영화> |
[http://localhost/asptest/asptest1.asp]
2. DOM 의 사용
DOM과 ASP 코딩을 활용하여 서버측에서 XML 문서를 효율적으로 다루는 방법.
DOM을 ASP문서내에서 애용하기 위해서 MSXML 의 인스턴스를 생성해야 함
http://msdn.microsoft.com/library/default.asp
3. ASP와 XML의 결합
ASP에서 XML을 사용한다는 것은 ASP 환경에서 XML 문서를 읽고 관리한다는 의미.
XML객체를 생성하여 ASP의 환경에 삽입된 예
Set objXML = Server.CreateObject("Microsoft.XMLDOM")
//objXML 이라는 객체를 사용하기 위해 생성하는 단계
objXML.load(Server.MapPath("xmldata.xml"))
// 상대ㅡ 경로에 있는 xmldata.xml의 이름을 가진 XML 문서를 로딩한다.
Set objRootElement = objXML.documentElement
// 현재의 노드를 루트노드로 세팅하는 과정.
Set objXML = nothing
// 객체 사용이 끝났음을 처리해 준다. |
[asptest2.xml]
<?xml version="1.0" encoding="euc-kr"?>
<구입도서>
<신청내역>
<신청인>홍길동</신청인>
<제목>해리포터</제목>
<수량>2</수량>
<금액>14,000원</금액>
</신청내역>
<신청내역>
<신청인>김동수</신청인>
<제목>해리가 샐리를</제목>
<수량>1</수량>
<금액>12,000원</금액>
</신청내역>
</구입도서> |
[asptest2.asp]
<%@ Language=VBScript %>
<HTML>
<META http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<HEAD>
<TITLE>asptest2.asp </TITLE>
</HEAD>
<BODY>
<%
dim oSource, myRec, oHTML '// 변수(객체)의 선언
'// XML DOM 객체를 생성한다.(asptest2.xml)
Set oSource=Server.CreateObject("Microsoft.XMLDOM")
oSource.async=false
'// DOM 객체에 asptest2.xml 파일을 로드한다
oSource.Load Server.MapPath("asptest2.xml")
Set myRec = oSource.documentElement
oHTML = oHTML & myRec.childNodes(0).text
oHTML = oHTML & "<br/><br/>"
oHTML = oHTML & myRec.childNodes(1).text
Response.Write oHTML
'// 객체를 닫는다.
Set oSource = nothing
%>
</BODY>
</HTML>
|
[http://localhost/asptest/asptest2.asp]
4. FileSystemObject(FSO)의 사용
FileSystemObject 에 의한 XML 데이터 접근을 시도
FSO는 Drive, Folder, File과 같은 객체들을 조작하기 위해 많은 메소드를 제공하고 있다.
FSO를 이용하여 XML 문서내의 텍스트 검색을 하기 위한 예제
[asptest3.xml]
<구입도서>
<신청내역>
<신청인>홍길동</신청인>
<제목>해리포터</제목>
<수량>2</수량>
<금액>14,000원</금액>
</신청내역>
<신청내역>
<신청인>김동수</신청인>
<제목>해리가 샐리를</제목>
<수량>1</수량>
<금액>12,000원</금액>
</신청내역>
</구입도서> |
[asptest3.asp]
<%@ Language=VBScript%>
<HTML>
<META http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<HEAD>
</HEAD>
<BODY>
<%
' 변수를 선언한다.
Dim objFso, objFile, strXML, strValue
' FileSystemObject 인스턴스를 생성한다.
Set objFso = CreateObject("Scripting.FileSystemObject")
' 상대경로의 텍스트 파일을 연다.
Set objFile = objFso.OpenTextfile(Server.MapPath("asptest3.xml"),1,False)
' 전체의 파일을 하나의 문자열로서 읽어들인다.
strXML = objFile.ReadAll
' 파일객체를 닫는다.(읽어온 문자열 존재)
objFile.close
strValue = InStr(strXML, "해리포터")
If strValue > 0 Then
' 조건이 일치하면 Good found 를 출력한다.
Response.write " 선택하신 책(해리포터)을 찾았습니다."
Else
' 조건이 일치하지 않으면 Bad found 를 출력한다.
Response.write " 선택하신 책이 존재하지 않습니다."
End If
' 객체를 제거한다.
Set objFso = nothing
%>
</BODY>
</HTML> |
[http://localhost/asptest/asptest3.asp]
5. Server-side-Include(SSI)
서버 사이드 인클루드는 XML 문서를 ASP 코드에 포함시키는 것이다.
ASP 페이지에 삽입할 XML 문서
[asptest4.xml]
<?xml version="1.0" encoding="euc-kr" ?>
<includea>
<includeb>
이것은 인클루드된 파일입니다.<br /><br />
인클루드한 태그 중 HTML태그는 인식을 하여 처리하지만, 그렇지 않은 사용자정의 태그는 HTML에 등록된 태그가 아니므로 인식을 하지 못하고 무시하게 됩니다.<br /><br />
XML에서는 한글태그를 써도 무방하나 HTML로 인클루드 될때에는 태그안에 한글을 사용하면(한글을 아직 완벽히 지원하지 못하므로) 모두 화면에 뿌리게
되므로 이점 주의하기 바랍니다.<br />
</includeb>
<english>
이것은 영문태그 사이에 있는 문자열입니다.<br/>
</english>
<한국어>
이것은 한글태그 사이에 있는 문자열입니다.<br/>
</한국어>
</includea>
|
[asptest4.asp]
<%@ Language=VBScript %>
<HTML>
<HEAD>
</HEAD>
<BODY>
<H1> 인클루드 예제 </H1>
<% response.write "지금 시각은" & now() & "<br/>" %>
<!-- #INCLUDE file="asptest4.xml" -->
</BODY>
</HTML> |
http://localhost/asptest4.asp]
주의 할점: HTML 로써 나타나기 때문에 한글 태그는 인식하지 못하고 그대로 나타남.
인클루드 한 태그중 HTML 태그는 인식하여 처리하고 사용자 정의 태그는 인식하지 못함
XML에서는 한글 태그가 사용되지만 HTML로 인클루드 될 때에는 태그안에 한글이 사용되면인식을 못하고 그대로 나타남
6. ASP 환경에서 XML 문서 데이터 추출
XML데이터 내에 있는 특정값을 DOM을 이용하여 가져오는 형태
DOCUMENT 객체를 생성한 후 이를 기준으로 XML 문서를 로딩하고 인식시킨후 원하는 자료를 루트에서부터 순차적으로 찾아서 결과를 보여주는 것.
XML 문서는 반드시 루트가 존재해야 한다.
[asptest5.xml]
루트 디렉토리 <구입도서>안에 <신청내역>이라는 엘리먼트가 존재한며 각각의 속성을 가지고 있다.
<?xml version="1.0" encoding="euc-kr"?>
<구입도서>
<신청내역 number="1">
<신청인>홍길동</신청인>
<제목>해리포터</제목>
<수량>2</수량>
<금액>14,000원</금액>
</신청내역>
<신청내역 number="2">
<신청인>김동수</신청인>
<제목>해리가 샐리를</제목>
<수량>1</수량>
<금액>12,000원</금액>
</신청내역>
<신청내역 number="3">
<신청인>김유림</신청인>
<제목>무소유의 기쁨</제목>
<수량>5</수량>
<금액>75,000원</금액>
</신청내역>
</구입도서> |
[asptest5.asp]
<%@ Language=VBScript %>
<HTML>
<META http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<HEAD>
<TITLE>asptest5.asp </TITLE>
</HEAD>
<BODY>
<%
dim oSource, myRec, aHTML, bHTML, cHTML '// 변수(객체)의 선언
'// XML DOM 객체를 생성한다.(asptest5.xml)
Set oSource=Server.CreateObject("Microsoft.XMLDOM")
oSource.async=false //비동기모드를 False 한 부분. 파일이 로딩되도록 하는 작업. 큰파일의 경우 로딩과 파싱 시간이 많이 걸릴 수 있다.
'// DOM 객체에 asptest5.xml 파일을 로드한다
oSource.Load Server.MapPath("asptest5.xml")
Set myRec = oSource.documentElement //현재 노드를 루트노드로 세팅하는 과정
For i=0 To myRec.childNodes.Length-1 //For Next 문, 노드는 0부터 시작 i=0
aHTML = myRec.childNodes(i).getAttribute("number")
bHTML = myRec.childNodes(i).Attributes(0).text
cHTML = myRec.childNodes(i).text
Response.Write "번호 :" & aHTML & "혹은 번호 :" & bHTML & "<br/>" & cHTML & "<p/>"
Next
'// 객체를 닫는다. 객체를 생성후 반드시 해제해 주어야 한다. 그렇지 않으면 자동 소멸되지 않고 메모리등의 할당이 증가하게 된다.
Set oSource = nothing
%>
</BODY>
</HTML> |
이 문서에 테이블을 만들어서 넣는 예제
[asptest.asp]
<%@ Language=VBScript %>
<%
dim oSource, myRec, aHTML, bHTML, cHTML '// 변수(객체)의 선언
'// XML DOM 객체를 생성한다.(asptest5.xml)
Set oSource=Server.CreateObject("Microsoft.XMLDOM")
oSource.async=false
'// DOM 객체에 asptest5.xml 파일을 로드한다
oSource.Load Server.MapPath("asptest5.xml")
Set myRec = oSource.documentElement
%>
<HTML>
<META http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<HEAD>
<TITLE>asptest6.asp </TITLE>
</HEAD>
<BODY>
<table border="1" cellspacing="1" cellpadding="1">
<tr>
<td bgcolor="pink" align="center" width="100" height="23"><b><font size="2" color="#666666">번호예제1</font></b></td>
<td bgcolor="pink" align="center" width="100"><font size="2"><b><font color="#666666">번호예제2</font></b></font></td>
<td bgcolor="pink" align="center" width="300" height="23"><font size="2" color="#666666"><b>내 용</b></font></td>
</tr>
<%
For i=0 To myRec.childNodes.Length-1
aHTML = myRec.childNodes(i).getAttribute("number")
bHTML = myRec.childNodes(i).Attributes(0).text
cHTML = myRec.childNodes(i).text
%>
<tr>
<td bgcolor="B8D7FC" align="center" width="100" height="23"><b><font size="2" color="#666666"><%=aHTML%></font></b></td>
<td bgcolor="B8D7FC" align="center" width="100"><font size="2"><b><font color="#666666"><%=bHTML%></font></b></font></td>
<td bgcolor="B8D7FC" align="center" width="300" height="23"><font size="2" color="#666666"><b><%=cHTML%></b></font></td>
</tr>
<%
Next
%>
</table>
</BODY>
</HTML>
<%
'// 객체를 닫는다.
Set oSource = nothing
%> |
DOM에서 가장 기본이 되는 개체 형태는 노드(Node)이며 ASP 프로그램시 3개의 개체타입(Document, Node, Child(Nodelosts))에 익숙해야 한다.
1) Document
Dcument는 MSXML 의 인스턴스를 생성할 때 함께 얻어지는 개체로 이 개체의 document-Element 속성의 XML 루트(root) 엘리먼트에 대응 된다. 따라서 이 개체로부터 XML 문서내의 전체 노드들을 접근 할 수 있다.
2) Node
Node는 DOM에서 가장 중요한 것으로 XML 문서내의 엘리먼트, 속성, 처리 명령어 등 모
든 요소들은 이 Node 개체이며, 다른 노드들과 부모 자식 관계 및 형제 관계를 형성한다.
3) Childnodes(Node lists)
문서내의 임의의 노드에 대하여 바로 아래 자식 노드들은 포함한다.
임의의 노드 개체에 대해 DOM 이 제공하는 속성.
|
속성 |
설명 |
노드개체속성중 읽을 수만 있는 것 |
firstChild |
첫 번째 자식 노드 |
lastChild |
마지막 자식노드 |
nestSibling |
해당 노드의 다음 형제 노드 |
nodeName |
노드의 이름(엘리먼트 이름) |
nodeType |
노드가 엘리먼트인지, 텍스트인지, 속성인지를 담고 있음 |
parentNode |
해당 노드의 부모 노드 |
presiousSibling |
|
specified |
속성값이 할당되어 있는지를 알려줌 |
읽고 쓸 수 있는것 |
nodeValue |
속성, 주석, CDATA 섹션, 텍스트 노드의 값, 엘리먼트 노드에 대해서는 null이 돌려진다. |
콜렉션 속성 |
attributes |
해당 노드의 속성들에 대한 콜렉션 |
childNodes |
해당 노드의 자식 노드들의 대한 콜렉션 | |