はかせのラボ

はかせのラボ

なんか好きなこと色々書きます

プログラミング 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使ってるんでタグ毎に分けるとかやりたいですね。

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

プログラミング #importができない・・・orz

あいさつ

どうも、はかせです。
今回は作品添削の時にもらったアドバイス
リソースの外出しをやってみようと思い、XML読み込みを実装しようとした話です。

MS標準のXMLパーサーを使いたかった

まずはいつも通りテストプロジェクトを作り
XMLの読み書きだけ実装しようとしてみました。

とりあえずググった感じ、<msxml6.dll>をimportして
その中のAPIを呼ぶというものが多かったので
今回はその方法でやってみようとしました。

#import <msxml6.dll> named_guids raw_interfaces_only 

importは指定したdllなどのタイプライブラリを使えるようにします。
named_guids、 raw_interfaces_only の二つはimport時に設定できる属性です。
docs.microsoft.com

基本的にここはネット上のコピペです。
ただここでさっそくエラーがでます。
f:id:hakase0274:20190616231406p:plain
なして!?

いやエラー出たこと自体はまぁいいんですけど(いいんかい)
問題なのはエラーで出てるパスが
明らかにプロジェクト直下なんですよね

今回は指定に<>使ってるんで検索には
PATHとかの環境変数で指定されてるとこに行くのでは・・・?

ネット上でググってもみんな当たり前のようにimport出来てるし
何個か見つけたやつも気づいたら治ってたみたいな感じで参考にならないし・・・

じゃあ今までのDirectXTexライブラリの時見たく
プロジェクトのプロパティから直接入れたら
どうだって思ってやってみたんですが
結果は使えず・・・orz

あとがき

今回はXML読み込みを実装しようとしたら
第一歩目から躓いた話でした。

正直importでこけるとは思ってませんでした。
一応自分の環境にdllがないんじゃないかと思い探したら
C:Windows/System32配下にがっつりあったんですよね。

もしかしてimport前に何かやらないといけないんですかね?
(よくあるやつだとコンパイルとか)

とりあえず、まずはimportについてもう少し勉強しなきゃですね。
それでは今回はこの辺でノシ