Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

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

원격 컴퓨터에서 개발작업 하기

보통 서버가 다른 곳에 있기 때문에 원격으로 접속해서 작업해야 하는 경우가 많다. 하지만 서버에는 내 컴퓨터처럼 개발환경이 잘 안추어져 있기 때문에 간단한 작업조차도 원격에서 하기는 쉽지가 않다. 그렇다고 서버에 비쥬얼 스튜디오랑 에디터를 종류별로 깔수도 없는 노릇이고....

계속 해서 작업하는 경우에는 네트워크 드라이브로 잡아 놓으면 편하다.

사용자 삽입 이미지

탐색기에서 내컴퓨터에서 네트워크 드라이브 연결을 누른다.

사용자 삽입 이미지

여기서 폴더에 \\아이피주소\C$라고 입력하면 해당 아이피 PC의 C루트를 네트워크 드라이브로 잡을 수 있다. 물론 접속 아이디/비밀번호는 알아야 겠지..

장기간 동안 계속 해야하는 작업이면 네트워크 드라이브로 항상 해두면 편하고 잠시 하는 것도 로컬의 HDD처럼 다룰수 있기 때문에 무척 편하다

또한 이렇게 연결된 네트워크 드라이브를 잡아놓고 비쥬얼 스튜디오나 웹 디벨로퍼드엥서 프로젝트의 경로를 해당 드라이브로 잡아도 되고 위의 네트워크 드라이브를 잡는 대신 개발툴에서 직접 그 경로로 접속을 해두 된다.


그러나 상황에 따라 저 방법을 사용하지 못하거나 굳이 원격 데스크톱을 사용해야만 한다면

사용자 삽입 이미지

그냥 아이피를 찍고 접속하지 말고 접속하기 전에 "옵션"을 누른다.

사용자 삽입 이미지

옵션에서 "로컬 리소스"탭에서 "디스크 드라이브"를 체크하도록 한다. 그렇게 하면 접속할때 경고창이 하나 뜨긴 하지만 무시해도 큰 상관은 없다.

이렇게 디스크 드라이브를 사용해서 원격 데스크톱을 연결하면 Copy&Paste를 로컬과 원격에서 모두 사용할 수 있다. text는 물론이고 파일도 로컬에서 복사해서 원격컴퓨터에 붙히거나 반대로 하는 경우도 모두 가능하다.

물론 FTP나 네트워크 드라이브보다는 불편하겠지만 원격데스크톱에선 파일을 올리고 내릴수 없는게 가장 불편한데 이걸 사용하면 해결이 가능하다.


덧)  참고로 원격데스크톱은 실행에서 mstsc 명령어이다...

사용자 삽입 이미지
2007/10/28 00:00 2007/10/28 00:00