티스토리 뷰
개요
이 예제는 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를 생성했다. 이 컨테이너는 새로운 레코드가 추가될 때마다 데이터를 갖고 있기 위해 필요하다.
여기서 사용된 예를 테스트하려면 해당 소스들을 해당 파일로 저장한 후 개발 서버로 복사하여 사용하면 된다.
- Total
- Today
- Yesterday
- 켄우드 정수기
- GTO SHONAN 14DAYS
- 아이폰 보조배터리
- 보이스차
- 릴리스 다이어리 - 설레어
- hot 6
- 닷넷 엑셀
- .NET Excel
- 아이튠즈 없이 mp3가져오기
- KL-2200
- 삼성 외장하드
- 보이스티
- Crows Zero
- 모토스톰2
- 아이폰 셀카
- georgia max
- 러브트리프로젝트
- 릴리스다이어리
- Roibosh Vanilla
- Lily's Diary
- 윈터드림
- 아이폰 카메라어플
- 나를 기억하고 있는 너에게
- 안녕 바다
- 닷넷 파일형식
- 아이팟 보조배터리
- 로네펠트
- KL2200
- God of War III
- IT·컴퓨터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |