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のコピペです。
http://msdn.microsoft.com/en-us/library/ms765393%28v=vs.85%29.aspx
ソースコードを書く。
ここももちろんほぼここのまんまです。
http://msdn.microsoft.com/en-us/library/ms765465%28v=vs.85%29.aspx
ただし、一部かえています。
TCHAR使うようにしてsetlocal(LC_ALL, "")しなくてハマりましたが。
ヘッダーを書く。めんどいんで、実装を.hに書いちゃう。
COM特有のBSTRがやなかんじ。一度コンパイルしないとimportのところで赤線がでて、エラーっぽいことを言ってきますが、コンパイルすれば大丈夫です。
あぁ、それにしても、なんか前時代的なコードになってしまいますね……。
ソースコード
あとはビルドして「デバックなしで実行」でOKかと。
参考
http://msdn.microsoft.com/en-us/library/ms756005%28v=vs.85%29.aspx
日本語でOkですが。
……あっ、CoInitializeをコンストラクタに、CoIninitializeをデストラクタに入れるの忘れてました。まぁいいか。