はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング import出来たしxmlも読めた話

あいさつ

どうも、はかせです。
今回は前回の続きで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>

読み込み結果です。
f:id:hakase0274:20190617221918p:plain

画像が小さくて少し見にくいですが、
ちゃんと順番に読み込むことに成功しています。

あとがき

今回はxml読み込みができた話でした。
importができない問題は必要SDKがないという極めて基本的な問題でしたね。

importエラー以外は特に詰まることもなく、
スイスイ進みました。
(ネットの写経だしね)

今回はただ読んだだけでしたが、
xml使ってるんでタグ毎に分けるとかやりたいですね。

それでは今回はこの辺でノシ