자료/ASP

ASP를 이용하여 XML 데이터 삽입하는 방법

네오블루 2008. 3. 29. 01:15

개요
 

이 예제는 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를 생성했다. 이 컨테이너는 새로운 레코드가 추가될 때마다 데이터를 갖고 있기 위해 필요하다.

여기서 사용된 예를 테스트하려면 해당 소스들을 해당 파일로 저장한 후 개발 서버로 복사하여 사용하면 된다.