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