C++でXML

暇だったのでちょっと書いてしまった。今では反省している。
_bstr_tの使い方がいまいち分かってないので文字列周り適当です。


Livedoorお天気Webサービスから任意の地域の天気を取得するテスト。

#include <iostream>
#include <tchar.h>
#import "msxml4.dll" named_guids

int main(void) {
	//COM初期化
	CoInitialize(NULL);

	//予報を取得する地域番号取得
	TCHAR area[16];
	TCHAR url[256];
	std::cout << "天気を取得したい地域番号を入力して下さい(東京:63) : ";
	std::wcin >> area;
	wsprintf(url, L"http://weather.livedoor.com/forecast/webservice/rest/v1?city=%s&day=tomorrow", area);

	MSXML2::IXMLDOMDocument2Ptr pDoc;
	_bstr_t bstrURL = _variant_t(url);

	//ドキュメントオブジェクトのインスタンスを生成する。
	if(FAILED(pDoc.CreateInstance(MSXML2::CLSID_DOMDocument))) {
		std::cout << "CreateInstance failed." << std::endl;
		return -1;
	}

	//load関数の非同期処理を切る。
	pDoc->put_async(VARIANT_FALSE);

	//XML読み込み
	if(!pDoc->load(bstrURL) != S_OK) {
		std::cout << "XML file loading failed." << std::endl;
		return -1;
	}

	//ルート要素を取得
	MSXML2::IXMLDOMElementPtr pRoot;
	pDoc->get_documentElement(&pRoot);
	if(pRoot == NULL) {
		return -1;
	}

	//タイトルと予報を取得
	_bstr_t bstrTitle = pRoot->selectNodes(_bstr_t(L"/lwws/title"))->nextNode()->text;
	_bstr_t bstrTelop = pRoot->selectNodes(_bstr_t(L"/lwws/telop"))->nextNode()->text;

	//表示
	std::cout << bstrTitle << std::endl;
	std::cout << bstrTelop << std::endl;

	//終了処理
	pRoot.Release();
	pDoc.Release();
	CoUninitialize();

	return 0;
}