티스토리 뷰
개요
| 이 예제는 ASP, XML, HTML 4.0에 어느 정도 익숙하다는 가정 아래 작성되었다.
만일 이 글을 읽기 전에 "HTML 폼 데이터를 XML로 저장하는 방법"과 "XSL과 ASP를 이용하여 XML 데이터 수정하는 방법"이란 글을 아직 읽지 않았다면 그 글을 먼저 읽어볼 것을 권한다. 왜냐하면 이 글은 앞의 두 글에 대한 후속 글이기 때문이다. 만일 XML에 대한 기초 지식이 없는 사람은 먼저 "XML 기초 다지기"를 읽어볼 것을 권한다. |
웹 상에서 XML 데이터를 삽입하는 방법
이 글에서 사용된 예는 "HTML 폼 데이터를 XML로 저장하는 방법"에서 사용된 예와 매우 비슷하다. 하지만 폼 데이터가 전송될 때 매번 새로운 파일을 만드는 것이 아니라 해당 파일이 이미 존재하는지를 점검한 후 존재하면 그 파일에 폼 데이터를 삽입할 것이다. 이 기법과 앞에서 살펴본 두 강좌의 내용을 이용하면 데이터베이스에서 레코드를 다루는 것과 비슷하게 데이터들을 핸들링할 수 있게 된다.
전 글에서 이미 XMLDOM 개체를 어떻게 생성하고 사용하는지에 대해서는 살펴 보았다. 이제 바로 예제를 살펴 보도록 하자.
예제: ASP를 이용하여 XML 파일에 데이터 삽입하기
먼저 살펴볼 것은 새로운 레코드를 삽입할 때 사용될 HTML 폼이다. 이 것은 "HTML 폼 데이터를 XML로 저장하는 방법"에서 사용된 것과 같은 폼이다. (단지 파일 이름만 변경되었을 뿐 내용은 똗같다.)
AddContact.html:
<html> <head> <title> 연락처 정보 </title> </head> <body> <form action="processAdd.asp" method="post"> <h3>연락처 정보를 입력하세요</h3> 이름: <input type="text" id="firstName" name="firstName"><br> 성: <input type="text" id="lastName" name="lastName"><br> 주소1: <input type="text" id="address1" name="address1"><br> 주소2: <input type="text" id="address2" name="address2"><br> 전화번호: <input type="text" id="phone" name="phone"><br> 이메일 주소: <input type="text" id="email" name="email"><br> <input type="submit" id="btnSub" name="btnSub" value="Submit"><br> </form> </body> </html> |
이 HTML 폼에 대한 액션은 processAdd.asp로 넘어간다. 이 ASP 페이지는 XML 파일 rolodex.xml이 존재하는지 확인하는 함수를 호출한다. 만일 파일이 존재하면 그 파일에 새로운 데이터를 추가하고 없으면 파일을 생성한다.
processAdd.asp:
<%
'--------------------------------------------------------------------
'"addNewContacttoXML"함수는 두 개의 파라미터를 받아들인다.
'strXMLFilePath : XML 파일이 저장될 물리적 경로
'strFileName - 저장될 XML 파일의 이름
'--------------------------------------------------------------------
Function addNewContacttoXML(strXMLFilePath, strFileName)
'지역 변수 선언
Dim objDom
Dim objRoot
Dim objRecord
Dim objField
Dim objFieldValue
Dim objattID
Dim objattTabOrder
Dim objPI
Dim blnFileExists
Dim x
'XMLDOM 인스턴스 생성
Set objDom = server.CreateObject("Microsoft.XMLDOM")
objDom.preserveWhiteSpace = True
'XMLDOM 개체의 Load 메쏘드 호출.
'Load 메쏘드는 파일이 로드됐는지 아닌지를 알려주는 불린 값 반환
'만일 파일이 존재하여 로딩했으면 true,
'그렇지 않으면 false를 반환
blnFileExists = objDom.Load(strXMLFilePath & "\" & strFileName)
'파일이 성공적으로 로딩됐는지 체크
If blnFileExists = True Then
'로딩된 파일의 최상위 요소를 objRoot 개체에 셋팅
Set objRoot = objDom.documentElement
Else
'최상위 요소를 만든 후 XML 문서에 추가
Set objRoot = objDom.createElement("rolodex")
objDom.appendChild objRoot
End If
'새로운 레코드를 위한 새로운 컨테이너 요소 생성
Set objRecord = objDom.createElement("contact")
objRoot.appendChild objRecord
'Request 개체의 폼 컬렉션 반복
For x = 1 To Request.Form.Count
'폼 요소중 btn이란 이름의 요소가 있으면
'XML 문서에 추가되지 않도록...
If instr(1,Request.Form.Key(x),"btn") = 0 Then
'"field"요소 생성
Set objField = objDom.createElement("field")
'"id" 속성 생성
Set objattID = objDom.createAttribute("id")
'현재 폼 필드 이름과 id 속성을 같도록 함
objattID.Text = Request.Form.Key(x)
'setAttributeNode 메쏘드는 field 요소에 id 속성 추가시킴
objField.setAttributeNode objattID
'또 다른 속성 "taborder" 생성. 요소들의 순서와 관련
Set objattTabOrder = objDom.createAttribute("taborder")
'taborder 속성의 값 설정
objattTabOrder.Text = x
'field 요소에 taborder 속성 추가
objField.setAttributeNode objattTabOrder
'새로운 요소 "field_value" 생성
Set objFieldValue = objDom.createElement("field_value")
'field_value요소의 값에 현재 폼 컬렉션의 필드의 값 설정
objFieldValue.Text = Request.Form(x)
'field 요소를 새로운 레코드 컨테이너 contact의 자식으로 추가
objRecord.appendChild objField
'field_value 요소를 field 요소의 자식으로 추가
objField.appendChild objFieldValue
End If
Next
'파일을 로딩하는데 실패했다면 XML 새로운 문서를 만들고
'XML processing instruction을 삽입해야 함
If blnFileExists = False then
'xml processing instruction 생성
Set objPI = objDom.createProcessingInstruction("xml", "version='1.0'")
'XML 문서에 processing instruction 추가
objDom.insertBefore objPI, objDom.childNodes(0)
End If
'XML 문서 저장
objDom.save strXMLFilePath & "\" & strFileName
'모든 객체 참조 반환
Set objDom = Nothing
Set objRoot = Nothing
Set objRecord = Nothing
Set objField = Nothing
Set objFieldValue = Nothing
Set objattID = Nothing
Set objattTabOrder = Nothing
Set objPI = Nothing
End Function
'에러 발생시 계속 진행
On Error Resume Next
'addNewContacttoXML 함수 호출
addNewContacttoXML "c:","rolodex.xml"
'에러 발생시 사용자에게 알려 주고,
'그렇지 않으면 성공했음을 알려줌
If err.number <> 0 then
Response.write("처리 도중 에러 발생!")
Else
Response.write("성공적으로 처리됐습니다!")
End If
%>
|
"HTML 폼 데이터를 XML로 저장하는 방법"이란 글을 읽어봤다면 알겠지만 거의 내용이 동일하다. 여기서 사용된 addNewContacttoXML 함수와 "HTML 폼 데이터를 XML로 저장하는 방법"에서의 ConvertFormtoXML 함수 사이에서는 몇 가지 차이점이 있다. 그 차이점을 한 번 살펴 보도록 하자:
'XMLDOM 개체의 Load 메쏘드 호출.
'Load 메쏘드는 파일이 로드됐는지 아닌지를 알려주는 불린 값 반환
'만일 파일이 존재하여 로딩했으면 true,
'그렇지 않으면 false를 반환
blnFileExists = objDom.Load(strXMLFilePath & "\" & strFileName)
'파일이 성공적으로 로딩됐는지 체크
If blnFileExists = True Then
'로딩된 파일의 최상위 요소를 objRoot 개체에 셋팅
Set objRoot = objDom.documentElement
Else
'최상위 요소를 만든 후 XML 문서에 추가
Set objRoot = objDom.createElement("rolodex")
objDom.appendChild objRoot
End If
|
위에 제시한 코드는 the addNewContacttoXML 함수의 일부이다. 여기서 눈여겨 봐야할 것은 XMLDOM 개체의 Load 메쏘드를 호출하는 부분이다. XML 파일이 존재하는지 아닌지를 체크하여 존재하면 그 파일에 데이터를 삽입하고 존재하지 않으면 새로운 파일을 생성해야 하는데 이것을 가능하게 하는 것이 바로 Load 메쏘드이기 때문이다.
또 다른 부분은 파일을 성공적으로 로딩했는지 여부에 따라 XML processing instruction을 삽입할지 말지를 경정하는 부분이다.
'파일을 로딩하는데 실패했다면 XML 새로운 문서를 만들고
'XML processing instruction을 삽입해야 함
If blnFileExists = False then
'xml processing instruction 생성
Set objPI = objDom.createProcessingInstruction("xml", "version='1.0'")
'XML 문서에 processing instruction 추가
objDom.insertBefore objPI, objDom.childNodes(0)
End If
|
위에서 언급한 두 가지 차이점을 제외하면 새로운 파일에 데이터를 저장하는 것과 기존 파일에 데이터를 추가하는 것은 거의 동일하다. 이 글에서 최상위 요소 rolodex의 자식으로 새로운 컨테이너 요소인 contact를 생성했다. 이 컨테이너는 새로운 레코드가 추가될 때마다 데이터를 갖고 있기 위해 필요하다.
여기서 사용된 예를 테스트하려면 해당 소스들을 해당 파일로 저장한 후 개발 서버로 복사하여 사용하면 된다.
'프로그래밍 > ASP' 카테고리의 다른 글
| ASP 정규식을 이용하여 문자열 패턴 적용하기(영문숫자만 허용) (0) | 2016.03.04 |
|---|---|
| 엑셀 파일 업로드 (0) | 2010.03.22 |
| 웹 url에 www가 붙지 않은 주소에 www 붙이기 (0) | 2009.09.18 |
| 타겟(target)의 종류 및 기능 (링크 속성) (0) | 2008.10.30 |
| Dext(v3.2.1), ABC(v4.1), TABS(v3.0)을 이용한 Upload Class (0) | 2008.09.01 |
| ASP 정보(ip,domain,page)가져오기 - ServerVariables (0) | 2007.11.06 |
| asp용 GD라이브러리 (0) | 2007.07.03 |