MS VCでXmlを読み込む | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

MS VCでXmlデータを扱うには、標準クラスがないので
XML DOM Document(COM)を使用することになる。

XML DOM Documentを読み込むため下記のimportが必要になる。

#import "msxml6.dll" named_guids raw_interface_only

それと、COMなのでXML DOM Documentを使用する前後に下記の処理をしなければならない。
CoInitialize
CoUninitialize

言葉で説明するよりコードを見た方が理解しやすいと思うので
実際にXmlを読み込む処理を下記に記載する。

読み込むだけなら簡単である。

○ヘッダー(XmlSample.h)
#pragma once
#include
#include
using namespace std;

class XmlSample
{
public:
XmlSample(void);
~XmlSample(void);

//指定したファイルパスのXMLを読み込む
wstring FileReader(wstring path);
};


○実装(XmlSample.cpp)

#include "StdAfx.h"
#include "XmlSample.h"
#include

#import "msxml6.dll" named_guids raw_interface_only

XmlSample::XmlSample(void)
{
//COMの初期化
::CoInitialize(0);
}


XmlSample::~XmlSample(void)
{
//COMの解放
::CoUninitialize();
}

wstring XmlSample::FileReader(wstring path)
{
//xmlオブジェクト生成
MSXML2::IXMLDOMDocument2Ptr reader;
reader.CreateInstance(__uuidof(MSXML2::DOMDocument60),NULL,CLSCTX_INPROC_SERVER);

//ロード
VARIANT_BOOL isSuccessful;
reader->load(CComVariant(path.c_str()), &isSuccessful);

//xmlの読み込み
BSTR buf = 0;
wstring ret;
reader->get_xml(&buf);
ret.append(buf);
::SysFreeString(buf);

//xmlオブジェクト解放
reader.Release();

return ret;
}

上記のような読み込む処理だけでは、実践的ではないので
次に、実践でも使えそうな処理として
ネームスペースを使用しているXMLからXPathのNodeデータを取得するコードを記載する。

○ヘッダー(XmlSample.h)
#pragma once
#include
#include
using namespace std;

class XmlSample
{
public:
XmlSample(void);
~XmlSample(void);

// XMLデータから固定XPathのデータを取得
wstring GetNode(wstring xmldata);
};


○実装(XmlSample.cpp)

#include "StdAfx.h"
#include "XmlSample.h"
#include

#import "msxml6.dll" named_guids raw_interface_only

#define NAME_SPACE _T("xmlns:ns='hoge'")
#define XPATH _T("/ns;sample/ns:data")
XmlSample::XmlSample(void)
{
//COMの初期化
::CoInitialize(0);
}


XmlSample::~XmlSample(void)
{
//COMの解放
::CoUninitialize();
}

wstring XmlSample::GetNode(wstring xmldata)
{
//xmlオブジェクト生成
MSXML2::IXMLDOMDocument2Ptr reader;
reader.CreateInstance(__uuidof(MSXML2::DOMDocument60),NULL,CLSCTX_INPROC_SERVER);

//xpathをサポートするように設定
reader->setProperty(CComBSTR(L"SelectionLanguage"),CComVariant(L"XPath"));
//namespaceをサポートするように設定
reader->setProperty(CComBSTR(L"SelectionNamespaces"),CComVariant(NAME_SPACE));

//ロード
VARIANT_BOOL isSuccessful;
reader->loadXML(xmldata.c_str(),&isSuccessful);

//下記のxpathのデータを取得
// /sample/data
wstring ret;
MSXML2::IXMLDOMNodePtr node=0;
reader->selectSingleNode(XPATH,&node);

if(NULL != node)
{
//xpath(/sample/data)のデータを取得
BSTR value = 0;
node->get_text(&value);
ret.append(value);
::SysFreeString(value);
}

//xmlオブジェクト解放
reader.Release();

return ret;
}

ちなみに複数のネームスペースをサポートする際は、
#define NAME_SPACEの定義をスペースで区切ればよい。

以上。
@some