あいさつ
どうも、はかせです。
今回は前回の続きでxml読み込みです。
importできない問題
前回msxml6.dllがimportできないと嘆いていました。
その問題を色々ググってたらですね、
こんなものを見つけました。
qiita.com
この記事にあるWindows Universal CRT SDKというものを
vsにインストールしたら解決しました。
ちなみにインストール自体は秒で終わりました。
xml読み込み
importさえできればこっちのものです。
さっそくネットで見つけたサンプルコードを試してみます。
#include "pch.h" #include "XMLPerser.h" #include<Shlwapi.h> #pragma comment(lib, "Shlwapi.lib") #import <msxml6.dll> named_guids raw_interfaces_only XMLPerser::XMLPerser() { ::CoInitialize(0); } XMLPerser::~XMLPerser() { ::CoUninitialize(); } HRESULT XMLPerser::FileLoad(std::string inPath) { //渡されたパスのファイルが存在するか if(!PathFileExistsA(inPath.c_str())) { return E_FAIL; } //load関数の成否が格納される VARIANT_BOOL fSuccess; //xmlを読み込むDOM MSXML2::IXMLDOMDocument2Ptr pDoc; //DOMインスタンスを作る pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60)); // 同期読み込みに設定 pDoc->put_async(VARIANT_FALSE); // 妥当性確認しない pDoc->put_validateOnParse(VARIANT_FALSE); //読み込み if(FAILED(pDoc->load(_variant_t(inPath.c_str()),&fSuccess)) || fSuccess != VARIANT_TRUE) { pDoc.Release(); CoUninitialize(); return E_FAIL; } MSXML2::IXMLDOMElementPtr pRoot; char szText[4096]; // BSTRはCOMで利用される一般的な文字列。そのスマートポインタがbstr_t。 bstr_t bstrWork; // XMLドキュメントツリーのルートを取得 pDoc->get_documentElement(&pRoot); // 子ノードの内容をまとめた文字列を取得 pRoot->get_text(&bstrWork.GetBSTR()); // bstr_tをcharに変換 sprintf_s(szText, 4096, "%s", (LPCSTR)bstrWork); //表示 printf("%s", szText); // 後始末 pRoot.Release(); pDoc.Release(); return S_OK; }
使いやすいように戻り値をHRESULTにしたり、
ファイルの有無を確認してみたりと独自の改造もしましたが、
概ねネット上のサンプルと同じです。
それでは実行です。
まずは読み込むxmlファイルです。
こちらもネット上で見つけたものをそのままコピーしています。
<?xml version="1.0" encoding="Shift-Jis" standalone="yes"?> <member> <person gen="1"> <name>Isono Namihei</name> <sex>Male</sex> <occupation>Office worker</occupation> </person> <person gen="1"> <name>Isono Fune</name> <sex>Female</sex> <occupation>Homemaker</occupation> </person> <person gen="2"> <name>Fuguta Sazae</name> <sex>Female</sex> <occupation>Homemaker</occupation> </person> <person gen="2"> <name>Fuguta Masuo</name> <sex>Male</sex> <occupation>Office worker</occupation> </person> <person gen="2"> <name>Isono Katsuo</name> <sex>Male</sex> <occupation>Pupil</occupation> </person> <person gen="2"> <name>Isono Wakame</name> <sex>Female</sex> <occupation>Pupil</occupation> </person> <person gen="2"> <name>Namino Norisuke</name> <sex>Male</sex> <occupation>Office worker</occupation> </person> <person gen="3"> <name>Fuguta Tarao</name> <sex>Male</sex> <occupation>Child</occupation> </person> <person gen="3"> <name>Namino Ikura</name> <sex>Male</sex> <occupation>Child</occupation> </person> </member>
読み込み結果です。
画像が小さくて少し見にくいですが、
ちゃんと順番に読み込むことに成功しています。