Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

ASP에서 XML 데이터 불러오기

현재 풀옵션 게시판을 하나 만들고 있다. 사내사업부 지원용으로 만드는 것으로 혼자만든다는 거에 압박감이 좀 있기는 하지만 원래 초기에는 개인프로젝트로 만들려고 했는데 회의가 오가는 중에 팀내 JOB으로 할당되어서 그동안 DB설계하고 설계했던 것을 그대로 가져다가 만들고 있다.

원래 월말까지 만들라고 했는데 빡시게 해도 빡빡한데 계속된 자른 일로 인하여 지난주에도 한 3일은 날려먹었다... 쩝;;;

어쨌든 게시판 마다 config을 적용하기 위해서 게시판 아이디를 가지고 config을 따로 인클루드 해서 사용할 수 있게 하려는게 애시당초의 계획이었으나

<!--#include virtual = "config.asp"-->

ASP에서 인클루드에 사용하는 저녀석에 변수를 할당할 수가 없었다. 에러가 나는 상황을 보아 서버단의 ASP코드보다도 include가 먼저 실행이 되는 듯 하다. 이런 저런 다양한 걸 시도해봤지만 어떤수로도 할 수가 없었다.

어쨌든 DB에서 가져오긴 좀 부담되었고 그런 고민을 하던 와중에 과장님이 XML을 제안하셨다. 그렇지.. XML이 그럴때 사용하라구 만들어진거였지... ㅡ..ㅡ 처음 사용하는 XML에 두려움이 있었지만 시작은 과장님에서 약간 잡아주신 관계로 XML사용에 들어갔다.


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

<example>
    <bbs>
        <id>test</id>
        <name>테스트</name>
        <size>100</size>
        <path>/example</path>
        <writer>Outsider</writer>
    </bbs>
</example>

일단 XML을 만든다... 전체를 example로 묶고 그안에 bbs를 만들고 그안에 여러값을 넣어서 만든다. 이렇게 생긴 bbs가 이제 계속 추가되어서 붙어나가는 구조라고 할 수 있다. 복잡한 구조가 아니기 때문에 크게 설명할 건 없다.

이제 이 XML을 사용하는 ASP를 보자. 그냥 XML만 불러오는 소스만 적어두 되지만 좀더 이해를 돕기 위해 현재 내가 사용한 코드를 같이 써 넣었다.


' getXml.asp
text = "";                                  '//게시판 아이디

Set x = CreateObject("msxml2.domDocument")     '// XML 객체 생성
x.async = False                                '// 비동기로 설정
x.load(server.MapPath("xml.xml"))            '// XML파일 로드

set bbs = x.getElementsByTagName("id")   '//id로 게시판이름의 리스트를 가져온다

for i = 0 to bbs.length -1     '//게시판 존재여부 체크(없는 게시판은 xpath하면 오류남)
    if bbs.item(i).text = text then
        hasBoard = true         '//존재하는 게시판인지를 위한 플래그
        Exit for
    else
        hasBoard = false
    end if
Next

if hasBoard = true then                 '//게시판이 존재하면
    '// XPath로 id가 searchtext인 board노드 가져오기
    set board = x.selectSingleNode("example/bbs[id='" & text & "']")  
    id     = board.selectSingleNode("id").text      '//해당 노드의 값 가져와서 변수로 설정
    name   = board.selectSingleNode("name").text
    size   = board.selectSingleNode("size").text
    path   = board.selectSingleNode("path").text
    writer = board.selectSingleNode("writer").text
end if

Set x = Nothing

약간 설명을 하자면 1번줄에서 게시판 아이디를 할당하고(여기선 안했지만) 해당아이디가 있는지를 확인하고 있을 경우에는 그 id를 가진 bbs의 값들을 가져오는 코드이다.

Set x = CreateObject("msxml2.domDocument")        '// XML 객체 생성

xml DOM을 사용하기 위해서 객체를 만든다. 객체를 만들기 위해서 Set을 사용하고 x는 임의로 정한 변수명이다.

x.async = False                                   '// 비동기로 설정

보통 비동기로 설정한단다.

x.load(server.MapPath("xml.xml"))                 '// XML파일 로드

server.MapPath를 이용해서 사용할 XML파일을 XML객체에 로드시킨다.

set bbs = x.getElementsByTagName("id")            '//id로 게시판이름의 리스트를 가져온다

ASP메서드이다. 언어에 따라 사용은 약간 다르지만 메서드는 거의 비슷한건 갓다. 테그이름을 가진 앨래먼트를 모두 가져온다. 태그네임으로 직접 접근한다. <id></id>로 되어 있는 것을 모두 가져온다.

bbs.item(i).text

getElementsByTagName으로 가져온 것이 bbs객체에 들어가기 때문에 bbs.item(i)의 형태로 접근하고 그 값을 빼오기 위해서 text를 사용했다.

set board = x.selectSingleNode("example/bbs[id='" & text & "']")  '// XPath로 id가 searchtext인 board노드 가져오기

selectSingleNode메서드는 한 노드를 가져온다. 물론 그 하위도 가져온다. 이 역시 객체이므로 set을 사용한다. 여기서 XPath를 사용했다. XPath는 XML DOM을 트리구조처럼 접근할 수 있도록 해준다. 책에는 AXIS(축)을 지정하게 되어 있는데 어떻게 사용하는지 잘 모르겠다. 일단 이렇게 사용했다.

xml.xml자체가 x객체에 로드되어 있으므로 x.selectSingleNode를 해주고 XPath를 써줬다. example/bbs[id='test']" 로 접근하면 id='test'인 bbs노드가 board에 들어간다. example[bbs/id='test']라고 해주면 example노드가 board에 들어간다.
       
 id     = board.selectSingleNode("id").text                        '//해당 노드의 값 가져와서 변수로 설정

board에 bbs노드가 들어있기 때문에 그 하위의 노드를 selectSingleNode를 접근한다. 만약 board에 example노드가 들어있다면(위 xml상으론 불가능하지만 설명상...) selectSingleNode("bbs/id")로 접근할 수 있다.

Set x = Nothing

다 사용한 후에는 x객체를 해제해 준다.



추가적으로...

한 단계의 트리구조는 //의 형태로 들어갈 수 있다. 무슨말이냐 하면 /example/bbs와 //bbs는 같다. 가독성면에서는 당연히 전자쪽이 좋겠지만...

메서드명으로 보면 알수 있지만 selectSingleNode는 한개의 노드를 가져오고 selectNodes는 여러개의 노드를 가져온다.

2007/10/28 23:22 2007/10/28 23:22