[Develope]

msxml

하늘을닮은호수M 2006. 8. 9. 19:19
반응형
정말 오래간만입니다. 드뎌.. 펜을 들게 되었네요. 새로운 것을 준비함은 항상 적당한 긴장감을불러오는 것 같네요.. 이번 강좌는 MSXML에 대한 것입니다.

솔직히 전 MSXML을 그렇게 잘 사용한다고 할 수 없습니다.

아마 저보다도 더 많이 아시는 분이 많을 겁니다. 다만, 제가 XML 파서를 실제로 만들어 보았기에 이 글을 쓰려고 생각하게 된건지도 모릅니다.

편안하게 읽으면서 따라 오시구요.. 제가 틀린게 있으면 질책도 바랍니다.



MSXML이란?



MSXML은 무엇일까요? 단순히 의미적으로 보면 MS에서 제작한 XML 관련 프로그램이라고 할 수 있겠죠...



정확하게 한마디로 MSXML을 말한다면 바로 파서(Parser)라 할 수 있습니다.

그럼 먼저 파서가 무엇에 쓰는 것인지 간단히 설명하도록 하죠..



예전의 DOS에서는 컴퓨터에 명령을 직접 입력했습니다. 그쵸..

C:>Dir c:Program

이런 명령어를 많이 봤을 겁니다. 그러면, 이건 무엇을 하는 거죠?



네~ 바로 C드라이브의 Program 폴더에 있는 파일의 목록을 보여달라는 거죠.

사람은 명령어를 보고 바로 이해할 수 있습니다.

뇌가 바로 해석을 해 주니까요? 그렇다면 생각하는 능력이 없는 컴퓨터는 어떻게 할까요?

누군가가 해석을 해주어야 할 겁니다. 그래야 파일 목록을 보여줄테니까요..

그 누군가가 바로 파서입니다.



즉, 컴퓨터에서 주어진 명령을 읽고 해석하는 것이라고 할 수 있습니다.

DOS에서는 그 파서의 역할을 command.com이란 파일이 수행했었죠.



이런식으로 컴퓨터에서는 파서가 중요한 역할을 합니다.

HTML문서를 웹브라우저로 보여준다는 것은 역쉬 누군가가 HTML문서를 해석해야겠죠.. 그게 바로 HTML 파서입니다....

오라클의 SQL/Plus나 MS의 쿼리분석기에서 입력한 SQL문도 해석을 해야 그 결과를 보여주겠죠.. 역시 SQL문을 해석하는 파서가 포함되어 있는 것입니다.



이처럼 XML 파서라 하면, XML 문서를 해석해서 컴퓨터가 처리할 수 있는 형태로 제공하는 것입니다.



그런데 이런 파서를 모든 사람이 자기 맘대로 만들면 호환상의 문제가 발생하겠죠.

특히나 어디서나, 아무때나 사용할 수 있다는 XML 문서에서는 치명적일 수가 있죠.

그래서 발생한 것이 XML 파서에서 해석하는 표준을 만들었습니다.



국제 표준화 기구에서 제정한 것이 바로 DOM(Document Object Model)이고, 민간기구에서 제작해 실질적인 표준이 된 것이 SAX(Simple API for XML)입니다.



DOM은 W3C(http://www.w3.org)에서 만들었는데요. 2002년 4월에 DOM Level 3가 발표되었습니다. 전 DOM Level 2까지 다루어 보았거든요.. 아직 3에서의 차이점은 파악을 못해봤네요.. 이번 강좌가 끝날 무렵에 DOM에 대해서 다시 한번 정리해 드릴 겁니다. 그때 차이점을 공부해서 올려놓도록 하지요.. ^^



SAX는 http://www.megginson.com/SAX/ 에 그 스펙이 나와 있는데요.. 현재 SAX2로 계속 유지되고 있습니다.



이 두 가지는 처리하는 방식에서 차이가 있습니다. 일단 DOM은 트리 구조로서, XML 문서 자체를 한꺼번에 읽어서 XML 트리를 생성합니다. 반대로 SAX는 이벤트 방식으로서 특정 이벤트가 발생할 때마다 처리합니다.



XML문서 자체가 트리구조이므로 DOM이 트리구조로 생성한다는 것은 어느정도 이해할 수 있겠죠.. 그렇다면 이벤트 방식이란 무얼 말하냐면요...

우리가 윈도우 프로그램을 보면, 예로 윈도우 탐색기를 생각해 보죠.

폴더를 클릭하면 폴더의 내용이 보이잖아요.. 바로 이런게 이벤트라고 하죠..

폴더를 클릭했다는 것이 이벤트를 발생한 거죠..



SAX에서는 문서를 읽어올때, 어떤 노드가 나왔을때에 이런 이벤트를 발생해서 처리할 수 있습니다.



휴.. 일단 이정도로 설명하고요.. 이 둘의 차이점을 이야기 하다보면 오늘의 주제를 너무 벗어나게 되니까.. 담에 좀더 자세히 다루도록 하죠..



어쨌거나 그래서 요즘 XML 파서들은 이러한 DOM과 SAX를 모두 지원합니다. 당연히 MSXML도 지원을 하고 있죠... 그러면, MSXML의 역사에 대해서 간단히 설명해 볼까요...



MSXML의 역사



MS의 XML 페이지(http://msdn.microsoft.com/xml)에 가보면 MSXML이 빠르게 변화하고 있음을 알 수 있습니다. 이것은 당연히 XML과 관련된 스펙들이 발전해 나가기 때문이죠..



Internet Explorer 5.0에 처음 제공된 것이 msxml 2.0이었습니다. 그리고 windows 2000에 msxml 2.5가 2000년도에는 msxml 3.0이 발표되었죠.. 현재는 msxml 4.0이 발표된 상태입니다.



앞서 설명한 것중에 DOM과 관련된 API는 초기부터 제공되었구요.. SAX, XPath, XSL, XSLT등이 점차로 추가되어 나간것이지요.



저는 기본적으로 최신 버전인 msxml 4.0을 가지고 설명할 것입니다.

그러나 그 기능의 대부분은 이전 버전에서도 동일하게 동작할 것입니다.

왜냐하면 파서의 기본적인 기능을 다룰 것이니까요....



그럼 msxml 4.0은 다음 사이트에서 다운로드 할 수 있습니다.

http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/766/msdncompositedoc.xml



일단 다운로드 한다음에 설치 해놓으시기 바랍니다. 설치하는데 큰 어려움은 없을 것입니다. 만약 잘 모르는 사항이 있다면 Q&A를 이용해 주시기 바랍니다.



프로그래밍에서 MSXML 사용하기



그럼 이제 이 파서를 사용하는 방법을 간단하게 살펴볼까요?



일단 먼저 아주 간단한 XML 문서를 가지고 생각해 보도록 합니다.



XML Developer





위 문자열을 읽어서 XML로 읽어들이고 그 내용을 출력하는 것입니다.



여기에서 여러분이 중요하게 봐야 할 것은 실제 내용을 처리하는 부분이 아니라 (이부분은 앞으로 자세히 설명할 것입니다.) msxml을 어떻게 호출하는가 하는 부분입니다.



음.. VB와 VC++에서 호출해 처리할 텐데요..

우선 불러오는 방법만 확실하게 이해하기 바랍니다.

설명은 VB예제를 가지고 할 것입니다.



msxml은 호출하는데 두가지 방법을 사용할 수 있습니다.

rental model과 free-threaded model의 두 가지가 있는데요...



이것은 단일 쓰레드냐 멀티 쓰레드이냐를 의미하는 것입니다. 쓰레드란 개념을 아시는 분도 있겠지만, 모르는 분을 위해서 간략하게 설명하면, 동시에 여러가지 작업을 수행한다면 멀티 쓰레드이고, 하나의 작업만 수행한다면 단일 쓰레드이죠..

예를 들어, 윈도우 탐색기에서 파일복사를 하면서 폴더를 다른 곳으로 이동할 수 있죠.. 이렇게 동시에 여러가지 작업을 하는 것을 멀티 쓰레드라고 합니다.



물론 동시에라는 표현을 쓰기는 했지만 실제로 같은 시간에 발생하는 것은 아니죠.. 다만, 사람에게는 그렇게 느껴지는 것입니다.



쓰레드에 대해서 더 알고 싶으면, 다른 자료를 찾아보세요.. -_- 여기에서는 대략 이런 것이구나 하고 알아 두세요..



msxml에서 rental model을 사용하면 단일 쓰레드로 운영하는 것이고, free-threaded model을 사용하면 멀티 쓰레드로 호출할 수 있는 것입니다.



즉, 생성한 msxml 파서 객체로 XML문서에 접근하는 여러개의 쓰레드를 만들 계획이라면, free-threaded model을 사용하고요.. 오직 하나의 쓰레드만이 XML 문서에 접근하도록 할 것이라면, rental model을 사용합니다.



당연한 이야기이지만, rental model이 좀더 나은 성능을 보이겠죠.



VB에서 MSXML 호출



앞으로 모든 예제는 VB에서 호출하는 것으로 살펴볼 것입니다.

이유는 웹프로그래밍 언어인 ASP나 다른 언어에서 msxml을 사용하고자 할때, VB에서 사용하는 방식과 비슷하게 운영할 수 있기 때문이죠.. 그렇다고 해서 VC++로 사용하지 못한다는 것은 아닙니다.



그리고 요즘은 XML을 ASP와 같은 언어에서 사용하는 방식에 대한 책도 많이 나와 있습니다. XML과 관련된 책이 제가 초기에 XML 공부를 시작하던 때에 비하면 어마어마하게 많은 것 같습니다. 그와 더불어 고수님들도 많이 생기구요..

전 지금은 제가 XML에 대해 그리 많이 알고 있는 상태는 아니라고 생각합니다. 그렇지만, 조금 아는 것이나마 정리해 두려고 이렇게 글을 쓰고 있네요.. 쩝~~



자... VB에서는 msxml을 어떻게 불러올까?

앞에서 말씀드렸듯이 최근에 나온 msxml 4.0이 기준입니다. 3.0이나 그 이전 버전은 이 부분만 다르게 하면, 나머지는 똑같이 사용할 수 있을 것입니다.

먼저 소스의 전부입니다.


Dim pXMLDoc As MSXML2.DOMDocument40

Set pXMLDoc = New MSXML2.DOMDocument40



pXMLDoc.loadXML "XML Developer"

MsgBox pXMLDoc.Text



Set pXMLDoc = Nothing





어때요 간단하죠.. ^^



pXMLDoc란 객체를 하나 생성하고 그 객체로 XML문자열을 연 다음 텍스트를 출력해 주고 있습니다.



첨이라 어렵게 느끼는 분도 있을 수 있는데요..앞으로 자주 보다 보면 익숙해지게 될 것입니다. 원래 처음에는 뭐든지 어렵게 느껴지잖아요.. 그게 낯설어서인것 같아요.. ^^



자 한 문장씩 간단하게 설명 드리죠...


Dim pXMLDoc As MSXML2.DOMDocument40

Set pXMLDoc = New MSXML2.DOMDocument40





이 부분은 msxml 파서 객체를 선언하고 할당하는 부분입니다. 그런데 특이한 타입으로 선언을 했죠. MSXML2.DOMDocument40이란 부분입니다. 이것을 ProgID라고 부릅니다.

ProgID란 객체의 고유 ID라고 할 수 있는데요...



우리가 ASP나 VB에서 자주 사용하는 "ADODB.Connection", "Scripting.FileSystemObject"등이 ProgID에 해당합니다. 첫번째는 DB연결 객체를 나타내고 두번째는 파일 관련 객체를 나타내고 있죠..



원래는 GUID라는 것으로 존재하는데, 숫자로 되어 있어서 사람이 이해하기 쉽도록 문자로 된 ProgID를 사용하게 되었지요..



그러면 이런 ProgID가 왜 필요한가 하고 의아해 할 수 있습니다.

이것은 msxml이 발전하면서 버전 독립적으로 존재할 수 있도록 하기 위해서입니다.

즉, msxml의 버전에 따라 다른 ProgID를 사용하기 때문에 상황에 따라서 다른 버전의 msxml 파서를 사용할 수 있다는 것이죠..



msxml 3.0을 사용하고 싶다면 "MSXML2.DOMDocument30"을 사용하면 됩니다.



pXMLDoc.loadXML "XML Developer"

MsgBox pXMLDoc.Text




이 부분은 간단한게 문자열로 된 XML 문서를 읽어와서 그 텍스트를 출력하는 부분입니다. XML문서를 불러오는 함수는 msxml에 두개가 있습니다.

하나는 load 메소드이고 다른 하나가 위의 loadXML 메소드입니다.

load 메소드는 XML 문서의 경로를 주고 그 문서를 읽어노는 것이구요..

loadXML 메소드는 문자열로 된 XML을 읽어오는 것입니다.

위에서는 문자열로 되어 있기 때문에 loadXML을 사용하고 있지요



"엉? 저 문자열은 XML 문서가 아닌데?" 하는 분도 계실텐데요.. ^^

저렇게 XML의 일부만을 가진 것을 XML Fragment라고 하죠.. XML 조각이라고 번역해야 하나요?

loadXML 메소드로 XML의 일부분만 읽어 들일 수 있습니다.



마지막 문장은 제가 습관적으로 넣는 것이네요.. 예전에 ASP할때, 직접 만든 컴포넌트에서 Nothing을 안해줘서 메모리가 샌 경우가 있었거든요.

그래서 Set으로 할당한 경우, 반드시 써줍니다. 확인차원에서.. ^^


그런데... 위 소스를 VB에서 열심히 타이핑 했서. 실행 시키니까..에러가 발생하는 분이 있을 겁니다. 그것은 msxml4.dll을 가져오지 않았기 때문인데요..

[프로젝트]-[참조]에서 "Microsoft XML, v4.0"을 선택해 주시기 바랍니다.

그러면 제대로 실행 될 거예요..

VB에서 외부 DLL을 참조할 때 이런 방식으로 사용하니까요..


그러면 VB에서의 소스와 VC++에서의 소스를 받아서 참고 해보시기 바랍니다.


소스를 보면 VC++에서도 동일한 기능을 하는 것을 포함했는데요.

VB가 아닌 VC++을 사용하고자 하는 분도 있잖아요.. 그런 분들은 참조하세요

지금 다시보니 VB는 잘 되는 것 같은데, VC++에서는 dll의 포함여부에 따라 제대로 동작하기도 하고, 안하기도 하는 것 같습니다.

그래서 이 부분을 한번 정리해 보려고 합니다.


실제로 MSXML의 쓰임새는 VB가 더 많을 것이라고 생각합니다. ASP를 이용해 웹에서도 쓸 수 있고, 자바스크립트에서도 활용하고 있으니까요.

그러나 C/S 프로그램이나 XML관련 애플리케이션을 VC++로 개발하는 경우, 처음 msxml을 사용하려면 어려움을 겪는 분들이 간혹 있습니다.

특히, 저처럼 COM에 대한 개념이 생소한 분들이 그렇지요..

CoInitialze나 CoCreateInstance.. 이런 함수들이 튀어 나오면 그 순간.. 아주 답답해지죠..

실은 저도 COM에 대해서는 잘 모릅니다. 물론 위의 함수의 정확한 의미도 설명할 정도의 수준은 아니고요..

BUT, MSXML을 사용하기 위한 방법에 대해서는 한번 설명해 보려고 합니다.

VB는 MSDN에 나와있는 예제만 참고해도 잘 활용할 수는 있으니.. VC++을 먼저 알아보죠..

음.. 데브피아나 이런데 가면 좋은 MSXML을 위한 wrapper 클래스들이 많이 있을 테니.. 그걸 사용하셔도 되구요..
(저도 이 강의를 끝내면서 library 하나 만들어 볼까 합니다. 나름대로 편리하게 구성해서.. 쩝~ 생각만... 할려나.. 에궁)

필요작업

일단, VC++을 작업하기 위해서 필요한 것부터 간단히 정리해 보죠..

1. 플랫폼 SDK라는 것 들어봤죠.. 이걸 먼저 설치해야 합니다.
요즘 Visual C++로 개발하는데, 이게 없으면 안되는 게 너무 많더군요.. 한번 설치해 두는 것도 괜찮을 것 같네요..

MS의 사이트 주소는 맨날 바뀌니.. 그렇더라도 현재 다운로드 할 수 있는 주소를 하나 적어놓을께요..

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/default.htm

플랫폼 SDK를 설치하는 이유는 여기에 라는 헤더 파일이 있기 때문입니다.

2. VC++의 환경설정에서 플랫폼 SDK를 지정해 줘야 합니다.

뭐.. 대부분은 잘 아시겠지만, 혹여라도 잘 모르시는 분이 계실까봐~~

[Tools] - [Options] - [Directories]로 가셔서..

Inclue files 와 Library files에 플랫폼 SDK의 Include와 Lib를 지정하시면 됩니다.

이때, 플랫폼 SDK의 Include와 Lib를 가장 위로 올려놓는게 좋기는 합니다.

3. MFC를 사용하는 프로그램이라면, stdafx.h란 파일이 존재할 겁니다.

여기에 다음과 같은 소스를 아래부분에 추가합니다.

만약 stdafx.h가 없다면.. MSXML을 사용할 헤더나 소스 파일에 이걸 추가하면 됩니다.

#include
#pragma comment (lib, "msxml2.lib")

자.. 이렇게 하면 이제 MSXML을 사용할 준비가 된 것입니다. 그럼.. 시작해 볼까요..

MSXML 이해

MSXML 도움말을 살펴보면 Node나 Attribute를 선언할 때, 변수명이 특이합니다.

이것은 MSXML자체가 DOM 스펙을 따르면서 COM형태로 개발되었기 때문인것 같습니다.

IXMLDOMNode, IXMLDOMAttribute, IXMLDOMDocument

뭔가 공통점이 있죠?

I - 인터페이스를 의미하는 것 같네요
XML - XML이라는 거죠.. 당연한 거죠.. 쩝~
DOM - DOM 스펙을 따른다는 이야기고..
나머지 - 각각의 의미를 나타내고 있죠..

그럼 자주 사용하는 몇가지 변수명만 설명할께요..

IXMLDOMDocument - XML 문서의 최상위 객체입니다. 다른 XML 객체는 여기에서부터 파생된다고 볼 수 있습니다.
IXMLDOMNode - XML의 각각의 Node를 가리키는 객체입니다. DOM의 가장 기본 요소입니다.
IXMLDOMAttribute - Node의 속성을 나타내는 객체입니다.
IXMLDOMElement - XML의 요소(Element)를 나타내는 객체입니다. 실제로 사용할 때는 Node를 더 많이 쓰는 것 같습니다. 요것 보다는
IXMLDOMNodeList - 주로 자식 노드의 리스트, XPath를 이용해 검색한 노드들의 리스트를 가리는 겁니다.
IXMLDOMNamedNodeMap - 주로 속성들의 리스트를 나타낼 때 사용합니다. NodeList와의 구분은 순서가 중요하냐의 여부에 달려있죠..

이외에도 IXMLDOMComment, IXMLDOMProcessInstruction.. 등이 있는데..
앞의 강좌인 XML 기본 강좌를 읽어보신 분은 대략 이해할 수 있을 거라 생각합니다.

이제 본격적으로 코딩을 해봅시다.

프로젝트는 알아서 만드시고.. 주요부분만 한번 해보도록 하겠습니다.

소스를 간결하게 하기 위해서 에러 처리부분은 생략했습니다.
에러가 포함된 소스는 자료실에서 다운로드 받으시면 됩니다.

그리고 여기에는 COM관련 함수들이 많이 나옵니다.
제가 COM을 잘 모르기 때문에 자세한 설명을 할 수가 없습니다. 혹, COM에 대해 잘 아시는 분이 계시면 코멘트를 달아서 설명해 주시면 고맙겠습니다.

MSXML을 사용하기 위해서 먼저 CoInitialize(NULL)를 실행해야 합니다.
그리고 메모리 해제를 위해 끝나면 CoUninitialize()를 하면 되겠죠..

이건 COM 객체를 사용하기 위해 기본적으로 사용하는 것 같습니다.

CoInitialize(NULL);

... // 이 사이에서 msxml을 활용하면 됩니다.

CoUninitialize();

CoInitialize나 CoUninitialize는 만약 클래스로 만든다면 생성자나 소멸자에 넣어도 되겠죠..

그럼 중간에서 XML을 사용하기 위해서는 XML의 기본 객체를 만들어야겠죠.. 바로 IXMLDOMDocument 입니다.

IXMLDOMDocument* m_pXml;

그리고 나서 인스턴스를 생성합니다.

CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXml);

이렇게 하면 xml 객체를 활용할 수 있게 됩니다. 바로 m_pXml을 통해서죠...

CoCreateInstance를 살펴보면,
Co - COM 관련 함수라는 의미 같은데요.. Cowork인가? 쩝~~ 암튼 그렇구요..
CreateInstance - 인스턴스를 생성하는 것이죠.. 객체지향 프로그램에서는 객체나 클래스, 인터페이스를 사용할 수 있도록 하기 위해서는 그것의 인스턴스를 생성해야 하죠..

여기까지 소스를 종합해보면 다음과 같습니다.

CoInitialize(NULL);

IXMLDOMDocument* m_pXml;
CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXml);

// 필요한 작업을 수행합니다.

CoUninitialize();


그럼 이번 강좌에서는 XML 문서를 가져오는 것만 해보도록 하죠..
XML 문서는 XML 기초강좌에서 사용한 것을 활용하겠습니다.

MSDN에서 IXMLDOMDocument의 load 함수를 살펴보겠슴다.
XML 문서를 로드할 경우, 파일에서 로드하는 경우와 XML 문자열을 로드하는 경우가 있습니다.
일반적으로 XML 문자열을 로드하기 보다는 파일을 로드하는 경우가 많다고 생각되므로 파일 로드에 대해서 자세히 설명하도록 할께요.

HRESULT load(
VARIANT varXmlSource,
VARIANT_BOOL* varIsSuccessful
);

함수 원형은 위와 같습니다.
VARIANT라는 것이 나오는데요.. 이건 각각의 형별로 union으로 선언한 것이라고 생각하면됩니다.
그러니까 "가변형"이라고 생각하면 되겠네요..

VARIANT varXmlSource는 XML 파일명을 가리키는 것이고요
VARIANT_BOOL* varIsSuccessful 성공 여부를 가리키는 것입니다.

그럼 한번 적용해 볼까요?

CoInitialize(NULL);

IXMLDOMDocument* m_pXml;
CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXml);

// 파일명을 지정합니다.
variant_t file("test.xml");
VARIANT_BOOL bLoad;

// 파일을 오픈합니다.
HRESULT hr;
hr = m_pXml->load(file, bLoad);
if (FAILED(hr)) return;

if (bLoad) {
// 성공
}

CoUninitialize();

이런형태로 사용할 수 있습니다.
VARIANT 구조체에 맞추어 문자열을 변환하기 위해서 variant_t를 사용했네요..
이걸 사용하기 위해서는

#include 를 포함해야 합니다.

그리고 HRESULT라는 리턴값을 사용했습니다.

typedef LONG HRESULT;

MSDN에 보면 이렇게 선언되어 있는데요. 결과를 알려주는 것입니다.
정확하게 S_OK, S_FALSE, S_INVALIDARG로 리턴이 되는데..

성공과 실패여부를 확인하기 위해
SUCCEEDED(hr) 또는 FAILED(hr) 이렇게 사용할 수 있네요.

자.. 이번에는 읽은 XML 문서의 내용을 화면에 출력하는 부분을 해보도록 하겠습니다.

HRESULT get_xml(
BSTR *xmlstring);


여기에서는 BSTR을 사용하는 방법을 잘 살펴보시면 될 것 같습니다.

if (bLoad) {
BSTR bstr;
CString strValue;

// XML 내용 가져오기
m_pXml->get_xml(&bstr);

// BSTR 변환
USES_CONVERSION;
strValue.Format("%s", W2A(bstr));
SysFreeString(bstr);

// 화면 출력
printf("%sn", strValue);
}

USES_CONVERSION이나 W2A와 같은 것을 사용하기 위해서는

#include 를 포함해야 함니다.

BSTR을 CString으로 변경하기 위해 위와 같은 방식을 사용했네요..
그냥 Casting을 해도 결과를 보는데는 문제가 없지만, 메모리 누수를 막기위해 저렇게 사용했습니다.

물론 위와 같은 방식이 아니라 VB와 같이 쉽게 VC++을 사용하는 방법이 있기는 합니다만,
전 이방식으로 쭉 설명할 계획입니다.

경우에 따라서는 필요하기 때문이죠.. C++에 대해서 잘 모르시는 분들은 좀 어렵게 느꼈을 것 같네요..
그래도 한번 따라해 보세요.. 한번의 실습이 열번 읽는 것보다 훨씬 나으니까요..

전체 소스를 한번 정리하겠습니다. 자료실에도 이와 관련된 소스를 넣어둘께요..

그럼.. 좋은 하루 되세요~~ 2005/03/29 미니


if (!SUCCEEDED(CoInitialize(NULL))) return 0;

// Instance 생성
IXMLDOMDocument* m_pXml;
if (!SUCCEEDED(CoCreateInstance(CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXml))) {
CoUninitialize();
return 0;
}

// XML 파일 읽어오기
variant_t file("test.xml");
VARIANT_BOOL bLoad;
HRESULT hr;

hr = m_pXml->load(file, &bLoad);
if (FAILED(hr)) {
CoUninitialize();
return 0;
}

// XML 내용 출력
if (bLoad) {
BSTR bstr;
CString strValue;

// XML 내용 가져오기
hr = m_pXml->get_xml(&bstr);
if (SUCCEEDED(hr)) {
// BSTR 변환
USES_CONVERSION;
strValue.Format("%s", W2A(bstr));
SysFreeString(bstr);

// 화면 출력
printf("%sn", strValue);
}
}

CoUninitialize();

출처 : http://xml.80port.net/
반응형

'[Develope]' 카테고리의 다른 글

[Doc]C++ MSXML Programming  (0) 2006.08.10
MS XML Overview  (0) 2006.08.09
XML parser  (0) 2006.08.08
응용 서비스 개발 방법과 국내외 개발현황③  (0) 2006.08.08
응용 서비스 개발 방법과 국내외 개발현황②  (0) 2006.08.08