お天気アプリ制作 #02 - XMLの読み込みを行う
前回、webよりXMLファイルを取得するテストが出来ましたので、引き続き取得したXMLからさらに情報を取得するサンプルを作ってみた。
XMLの操作にはXMLパーサーと呼ばれるものを使用します。Windows・WindowsMobileで共通して使用できるものとして、MSXMLというCOMコンポーネントがあるのでそれを使用します。
使用するキーワードとしては、こんな感じかな。
MSXML2::IXMLDOMDocumentPtr MSXML2::IXMLDOMNodeListPtr MSXML2::IXMLDOMElementPtr |
初期化
まずCOMの初期化から。
大体、アプリケーションクラスのInitInstanceで行っておけばよいのだけれども、読み込み部分をスレッドにする場合は、スレッドの先頭と最後で行う必要あり。
// COMの初期化 for MSXML ::CoInitialize(NULL); // XMLの処理 // COMの終了 for MSXML ::CoUninitialize(); |
XMLファイルの読み込み
ファイル名を渡すだけですね。
// インスタンスの作成 MSXML2::IXMLDOMDocumentPtr pDoc(__uuidof(MSXML2::DOMDocument40)); //XMLファイルの読み込み LP_WEZ_DATA pWezDat = m_pWezData->GetWezData(); pDoc->put_async(VARIANT_FALSE); VARIANT_BOOL hr = pDoc->load( pFile); if (hr != VARIANT_TRUE) { // エラー return FALSE; } |
XMLの操作
XMLは基本的に階層構造になっているので、その階層をもぐっていく必要があります。
IXMLDOMDocumentはXML全体を保持するもので、そこから、各ノードへもぐっていきます。
// ルートエレメントの取得 MSXML2::IXMLDOMElementPtr peRoot = pDoc->documentElement; |
ここから、下の階層のノードへともぐっていくことに。
MSXML2::IXMLDOMNodeListPtr plChannel; plChannel = peNow->getElementsByTagName(_T("channel")); |
XMLでは、一つの階層に同じ名前のノードを複数置けるため、上記の関数ではノードのリストが取得できます。ノードのリストなので、ここから任意のノード(エレメント)を選択します。
MSXML2::IXMLDOMElementPtr peChannel = plChannel->Getitem(0); |
ここでやっとchannelのノード(エレメント)に到達です。このポインタはルートのpeRootと同じ型ですので、ここらからさらに下の階層に潜りたい場合は、また同じ操作を行えばOKです。
IXMLDOMElementPtrに対しては、
Getitem() getAttribute() |
とりあえず、ここまでの処理でWEBからRssの取得、取得したRssから情報を抜き出す、まで作成できました。
天気を取得するサイトは、ウェザーマップ(http://www.weathermap.co.jp/)を使用しました。一週間の天気・降水確率・気温などが取得できるので、必要そうな情報はそろえられそうです。