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가 기억되든 모두 문자열로 변환되어 저장됩니다.
'Application Programming Interface > Windows API' 카테고리의 다른 글
| Windows DDK 문서 IMEIMES.DOC - 1. Overview (개요) (0) | 2014.09.26 |
|---|---|
| 윈도우 프로그램에서 콘솔창 띄우기 (0) | 2014.09.24 |
| Visual C++로 MSXML 사용하기 #6 (0) | 2014.08.19 |
| Visual C++로 MSXML 사용하기 #5 (0) | 2014.08.12 |
| Visual C++로 MSXML 사용하기 #4 (0) | 2014.08.12 |