Xerces3.0.0をC++Builder 2009でビルドする方法
Xerces3.0.0が動くらしいので、試してみた。手順は以下の通り。
- インストール先のprojects\Win32\BCB6\MakeBuildDirs.batを実行。
- インストール先のprojects\Win32\BCB6\Xerces-allにある、XercesLib.bprをC++Builder2009で読み込む。
- プロジェクトを変換して保存。ファイル名はXercesLib.cbprojとなるはず。
- XercesLib.cbprojをエディタで編集
<PropertyGroup Condition="'$(Base)'!=''"> <NoVCL>true</NoVCL> ←追加 (中略) <LinkPackageImports>rtl.bpi</LinkPackageImports> ←LinkPackageImportsタグの値をrtl.bpiのみに。 (中略) <UsePackages>false</UsePackages> ←UsePackagesタグの値をfalseに。 </PropertyGroup>
修正したプロジェクトをビルドすればあっさり動作。バイナリはインストール先のBuild\Win32\BCB6の下に、XercesLib.dllとXercesLib.libが生成される。
サンプルコードはこんな感じ。まず、メインで初期化が必要。
#include <xercesc/util/PlatformUtils.hpp> #pragma link "XercesLib.lib" using namespace xercesc; WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try { XMLPlatformUtils::Initialize(); // 初期化 Application->Initialize(); Application->MainFormOnTaskBar = true; Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); XMLPlatformUtils::Terminate(); // 終了処理 } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; }
実際にパースしてみる
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/dom/DOMNode.hpp> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; XERCES_CPP_NAMESPACE_USE //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { xercesc::XercesDOMParser* parser = new XercesDOMParser(); parser->parse("Test1.xml"); xercesc_3_0::DOMDocument* doc = parser->getDocument(); DOMElement* root = doc->getDocumentElement(); const wchar_t* NodeName = root->getNodeName(); UnicodeString us(NodeName); ShowMessage(us); delete parser; } //---------------------------------------------------------------------------
値はconst wchar_t*でやりとりするみたいなので、そのままUnicodeStringが使えそう。でも、何か嫌な予感が。