본문 바로가기

Application Programming Interface/Windows API

Visual C++로 MSXML 사용하기 #7

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이전 포스팅에서 저장한 test.xml을 불러오는 기능은 XMLDOMDocument의 load 메서드입니다.

_variant_t variant = TEXT("test.xml");
xmlDocument->load(variant);

test.xml을 불러와 콘솔에 출력해보겠습니다.

/* ex12.cpp */
#include <windows.h>
#include <stdio.h>
#include <locale.h>
#import <msxml4.dll>

int main(int argc, char * argv[])
{
	::setlocale(LC_ALL, "");

	if (SUCCEEDED(::CoInitialize(NULL)))
	{
		{
			_bstr_t bstr1, bstr2;
			_variant_t variant;

			IXMLDOMDocumentPtr xmlDocument;
			IXMLDOMProcessingInstructionPtr xmlProcessingInstruction;
			IXMLDOMElementPtr xmlElement1, xmlElement2;
			IXMLDOMAttributePtr xmlAttribute;

			VARIANT_BOOL variantBool;

			if (!SUCCEEDED(xmlDocument.CreateInstance(__uuidof(DOMDocument))))
			{
				::wprintf(L"xmlDocument가 생성되지 않았습니다.\n");
				::CoUninitialize();
				return -1;
			}

			/* test.xml을 불러와 XMLDOMDocument에 기억시킵니다. */
			variant = TEXT("test.xml");
			xmlDocument->load(variant, &variantBool);

			if (variantBool == VARIANT_TRUE)
			{
				xmlDocument->get_xml(bstr1.GetAddress());
				::wprintf(L"%s", (const wchar_t *)bstr1);
			}
		}
		::CoUninitialize();
	}
	return 0;
}

VARIANT_BOOL이라는 자료형이 새로 등장하는데 short 형이 재정의 된 것으로 VARIANT_TRUE, VARIANT_FALSE의 2가지 값을 가집니다. load 메서드에서는 두 번째 매개변수를 통해 파일 열기의 성공 여부를 반환합니다.

루트 엘리먼트에 접근해보겠습니다. 루트 엘리먼트는 문서 엘리먼트(Document Element)라고도 부르며, XMLDOMDocument의 get_documentElement 메서드로 가져올 수 있습니다. 기본 형태는

xmlDocument->get_documentElement(&xmlElement);

이를 통해 integer 어트리뷰트에 어떤 값이 있는지를 출력해보겠습니다.

/* ex13.cpp */
#include <windows.h>
#include <stdio.h>
#include <locale.h>
#import <msxml4.dll>
int main(int argc, char * argv[])
{
	::setlocale(LC_ALL, "");

	if (SUCCEEDED(::CoInitialize(NULL)))
	{
		{
			_bstr_t bstr1, bstr2;
			_variant_t variant;

			IXMLDOMDocumentPtr xmlDocument;
			IXMLDOMProcessingInstructionPtr xmlProcessingInstruction;
			IXMLDOMElementPtr xmlElement1, xmlElement2;
			IXMLDOMAttributePtr xmlAttribute;

			VARIANT_BOOL variantBool;

			if (!SUCCEEDED(xmlDocument.CreateInstance(__uuidof(DOMDocument))))
			{
				::wprintf(L"xmlDocument가 생성되지 않았습니다.\n");
				::CoUninitialize();
				return -1;
			}

			variant = TEXT("test.xml");
			xmlDocument->load(variant, &variantBool);

			/* Document Element를 가져오기 */
			xmlDocument->get_documentElement(&xmlElement1);
			/* integer 속성을 가져오기 */
			bstr1 = TEXT("integer");
			xmlElement1->getAttributeNode(bstr1, &xmlAttribute);
			xmlAttribute->get_value(&variant);
			/* integer 속성의 값과 그 종류를 출력하기 */
			::wprintf(L"type = %d\n", V_VT(&variant.GetVARIANT()));
			if (V_VT(&variant.GetVARIANT()) == VT_BSTR)
			{
				bstr1 = variant;
				::wprintf(L"BSTR value = %s\n", (const wchar_t *)bstr1);
			}
			else if (V_VT(&variant.GetVARIANT()) == VT_INT)
			{
				::wprintf(L"INT value = %d\n", V_INT(&variant.GetVARIANT()));
			}
		}
		::CoUninitialize();
	}
	return 0;
}

실행 결과 저장 시 정수로 지정했던 1318이 다시 열어보면 BSTR로 저장되어있음을 확인할 수 있습니다. XML 파일이 근본적으로 텍스트 파일이기때문에 어떤 자료형의 VARIANT가 기억되든 모두 문자열로 변환되어 저장됩니다.