ボーズにおねだりされまして。
「ドミニオンのサプライから10枚テケトーに選んでくれるアプリ作ってぇ」
「作っちゃるよー、んじゃ週末にちゃっちゃとね」
なんつー安請け合い。ま、どってことないんじゃね(ほじほじ)
元ネタとなるカードデータはツブシが効くようにXMLで用意しました:
<?xml version='1.0' encoding='shift_jis' ?>
<dominion>
<card>
<key>0.01</key>
<name>へそくり</name>
<series>プロモ</series>
<cost>5</cost>
<portion_cost>0</portion_cost>
<action>false</action>
<treasure>true</treasure>
<point>false</point>
<attack>false</attack>
<reaction>false</reaction>
<continuous>false</continuous>
</card>
<card>
<key>1.01</key>
<name>市場</name>
<series>無印</series>
<cost>5</cost>
<portion_cost>0</portion_cost>
<action>true</action>
<treasure>false</treasure>
<point>false</point>
<attack>false</attack>
<reaction>false</reaction>
<continuous>false</continuous>
</card>
...
</dominion>
.NETならSystem.Xml.Linqで
// dominion.xmlから<card>要素を列挙して
foreach ( XElement element in XElement.Load("dominion.xml").Elements("card") ) {
どーのこーの
}
すりゃえぇわけだが、ボーズのマシンがショボくてメモリかつかつで.NETなんつー大それたもんインスコしたくないとゆー。うんじゃnativeで書くかと。
ってわけでひさしぶりにApache Xerces-Cとかひっぱりだしてきたりする。
まずは手習いがてら<name>でも列挙してみっか:
#include <iostream>
#include <locale>
#include <memory>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
using namespace std;
using namespace xercesc;
int run(const wchar_t* target) {
unique_ptr<XercesDOMParser> parser(new XercesDOMParser());
unique_ptr<ErrorHandler> errHandler(static_cast<ErrorHandler*>(new HandlerBase()));
parser->setErrorHandler(errHandler.get());
try {
// パースして
parser->parse(target);
// ドキュメントのルートエレメント配下の<name>要素を抜き出して
DOMNodeList* nodes = parser->getDocument()->getDocumentElement()->getElementsByTagName(L"name");
// テキスト・コンテントをプリントしるー
for ( XMLSize_t i = 0; i < nodes->getLength(); ++i ) {
wcout << dynamic_cast<DOMElement*>(nodes->item(i))->getTextContent() << endl;
}
} catch ( ... ) {
wcout << L"Something wrong" << endl;
return -1;
}
return 0;
}
int main() {
wcout.imbue(locale("japanese"));
try {
XMLPlatformUtils::Initialize();
} catch ( const XMLException& ex ) {
wcout << ex.getMessage() << endl;
return -1;
}
int result = run(L"dominion.xml");
XMLPlatformUtils::Terminate();
return result;
}
実行結果:
へそくり
市場
改築
鍛冶屋
金貸し
木こり
議事堂
玉座の間
研究所
鉱山
工房
宰相
....
VS2010はnative-C++でのインテリセンスがひじょーにキモチ良く動いてくれるんで快適です。
ちょいと昔はマニュアル首っぴきで苦労したですが。