본문 바로가기

Application Programming Interface/Windows API

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

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

루트 엘리먼트 내부에 텍스트와 자식 엘리먼트를 넣어보겠습니다. 먼저 루트 엘리먼트인 "document"에 "Hello, Word!"라는 문장을 넣어보겠습니다.

<?xml version="1.0"?>
<document>
Hello, World!
</document>

이를 소스코드로 표현하면

/* ex09.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, bstr3;
			_variant_t variant;
			IXMLDOMDocumentPtr xmlDocument;
			IXMLDOMProcessingInstructionPtr xmlProcessingInstruction;
			IXMLDOMElementPtr xmlElement;

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

			bstr1 = TEXT("xml");
			bstr2 = TEXT("version=\"1.0\"");
			xmlDocument->createProcessingInstruction(bstr1, bstr2, &xmlProcessingInstruction);

			xmlDocument->appendChild(xmlProcessingInstruction, NULL);

			/* <document>Hello, World!</document> 부분을 만드는 과정 */
			bstr1 = TEXT("document"); // 태그의 이름은 document
			bstr2 = TEXT("Hello, World!"); // 텍스트의 내용은 Hello, World!
			xmlDocument->createElement(bstr1, &xmlElement);
			xmlElement->put_text(bstr2); // 엘리먼트에 텍스트 삽입

			xmlDocument->appendChild(xmlElement, NULL);

			xmlDocument->get_xml(bstr3.GetAddress());
			::wprintf(L"%s", (const wchar_t *)bstr3);
		}
		::CoUninitialize();
	}
	return 0;
}

실행 결과는

자식 엘리먼트를 넣는 방법은 루트 엘리먼트를 만드는 방법과 같습니다. 다만 삽입할 대상을 xmlDocument가 아닌 루트 엘리먼트로 바꾸면 됩니다.

<?xml version="1.0"?>
<document>
	<child>
	</child>
</document>

위 xml을 작성하는 소스는

/* ex10.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, bstr3;
			_variant_t variant;
			IXMLDOMDocumentPtr xmlDocument;
			IXMLDOMProcessingInstructionPtr xmlProcessingInstruction;
			IXMLDOMElementPtr xmlElement1, xmlElement2;

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

			bstr1 = TEXT("xml");
			bstr2 = TEXT("version=\"1.0\"");
			xmlDocument->createProcessingInstruction(bstr1, bstr2, &xmlProcessingInstruction);

			xmlDocument->appendChild(xmlProcessingInstruction, NULL);

			bstr1 = TEXT("document");
			xmlDocument->createElement(bstr1, &xmlElement1);

			bstr1 = TEXT("child");
			xmlDocument->createElement(bstr1, &xmlElement2);

			xmlDocument->appendChild(xmlElement1, NULL); // 루트 엘리먼트를 XMLDocument에 추가합니다.
			xmlElement1->appendChild(xmlElement2, NULL); // 자식 엘리먼트를 루트 엘리먼트에 추가합니다.

			xmlDocument->get_xml(bstr3.GetAddress());
			::wprintf(L"%s", (const wchar_t *)bstr3);
		}
		::CoUninitialize();
	}
	return 0;
}

실행 결과는