読者です 読者をやめる 読者になる 読者になる

Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

MSXML 6.0を使ってみた。

スポンサードリンク

f:id:fa11enprince:20150731124157j:plain
Microsoft謹製のMSXML 6.0っていうXMLパーサを使ってみましたよ。
っていうかこれマジモンのCOMじゃないすか。かかわりたくない。COM…。
BSTRとかVARIANTとか出てくるのでびみょーな感じです。回避方法あるのかもしれないですが。調べようと思ったけど英語の情報ばっかりで、英語翻訳で眠くなる……。
設定ファイルといえば、CSVファイル、TSVファイル、固定長ファイル、INIファイル、XMLファイル、YAML、JSON…などがありますが、時代はXMLですね。
この中でCSVファイル、TSVファイル、固定長ファイルは用途がすこし違いますけど……。
というわけで、XMLのパーサに関してはいろいろなものがあります。
C++に限って言うとMSXML、Xerces、TinyXMLなどがあります。
というわけで初めてMSXMLを使ってみました。
ただし、ほんの入り口部分だけ。
開発・実行環境はWindows8.1 (64bit)、Visual Studio 2013 Professional、MSXML 6.0です。
Visual StudioはExpressでも問題ないかと思います。
なお、OSはWindows XP SP3以降であればMSXMLが勝手に入っているはずなので、特に何も意識しなくていいはずです。32bitでもいいです。

環境構築

MSXML 6.0を使うので
Windows XP SP3以降のマシンなら何もする必要なし。
とりあえずSystemフォルダにmsxml6.dllがあればOK。
私の環境ではC:\Windows\System32にありました(64bit環境)
あと、Visual Studio 2008 Express以降のエディションがあればOKだと思います。

開発

Visual Studioを立ち上げてプロジェクトを新規作成します。
今回は楽なコンソールアプリにしようと思います。
ファイル > 新規 > プロジェクト > Win32コンソールアプリケーション
名前はテキトーに決めちゃってください。僕はMSXMLTestにしました。
OKを押して、次へをクリックし、追加のオプションの
「空のプロジェクト」にチェックを入れます。
あとは特になにもいじらなくてOKです。

xmlを作成する。

今回は次のXMLを使います。
デフォルトの設定(WindowsVista以降?)ならプロジェクトのフォルダ
C:\Users\[ユーザ名]\Documents\visual studio 2013\Projects\MSXMLTest\MSXMLTest
にstocks.xmlを作ります。

stocks.xml

<?xml version="1.0"?>
<?xml:stylesheet type="text/xsl" href="stock.xsl"?>
<portfolio xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <stock exchange="nasdaq">
    <name>new</name>
    <symbol>zzzz</symbol>
    <price dt:dt="number">20.313</price>
  </stock>
  <stock exchange="nyse">
    <name>zacx corp</name>
    <symbol>ZCXM</symbol>
    <price dt:dt="number">28.875</price>
  </stock>
  <stock exchange="nasdaq">
    <name>zaffymat inc</name>
    <symbol>ZFFX</symbol>
    <price dt:dt="number">92.250</price>
  </stock>
  <stock exchange="nasdaq">
    <name>zysmergy inc</name>
    <symbol>ZYSZ</symbol>
    <price dt:dt="number">20.313</price>
  </stock>
</portfolio>

もちろんここはMSDNのコピペです。
Resource: stocks.xml (loadDOM Example)

ソースコードを書く。

ここももちろんほぼここのまんまです。
Source: loadDOM.cpp
ただし、一部かえています。
TCHAR使うようにしてsetlocal(LC_ALL, "")しなくてハマりましたが。

ヘッダーを書く。めんどいんで、実装を.hに書いちゃう。
COM特有のBSTRがやなかんじ。一度コンパイルしないとimportのところで赤線がでて、エラーっぽいことを言ってきますが、コンパイルすれば大丈夫です。
あぁ、それにしても、なんか前時代的なコードになってしまいますね……。

ソースコード


あとはビルドして「デバックなしで実行」でOKかと。

参考

How Do I Use DOM?
日本語でOkですが。

……あっ、CoInitializeをコンストラクタに、CoIninitializeをデストラクタに入れるの忘れてました。まぁいいか。