Xerces-C++ にて DOM の要素を手で組み立てる
頼まれて仕方なく Xerces-C++ をいじる。Xerces のコードは Java みたいで,色気が無くてあまり好きではない。でも流石に大手が参画しているだけあって,移植性が高いうえに高機能であるところは感心できる。
はまったのは,DOMImplementation クラスのオブジェクトを取得するところ。所望のオブジェクトが取得するには,getDOMImplementation() の引数 feature に "LS" (Load & Save らしい)*1という文字列を入れる必要があった。それさえ手に入れば,あとは例外処理とメモリリークに注意して組み立てるだけ。
void test() { XercesSession session; { XStr zStr( "LS" ); DOMImplementation *pzImpl = DOMImplementationRegistry::getDOMImplementation( zStr.x_str() ); zStr.reset( "Taco" ); XAutopzDOMDoc( pzImpl->createDocument(0,zStr.x_str(),0) ); XAuto pzWriter( pzImpl->createDOMWriter() ); zStr.reset( pzWriter->writeToString(*pzDOMDoc), true ); cout << zStr.c_str() << '?n'; } }
あまり本質ではないところだけど,以下はは自作クラス(なまえは適当)。探すのが面倒なのでつくってしまった。この手のツールを集めたライブラリで,SE 屋さん達の間で定番になっているものって,あるのだろうか?
- XercesSession は initialize() と terminate() を呼ぶだけ
- XStr は XMLCh* を char* に変換したり,その逆の変換を行ったり,リソース管理をしてくれる文字列もどきクラス
- XAuto は自動的に release() を呼ぶ auto_ptr もどきクラス。メモリリーク防止よう。
ともあれ,Xerces 様のおかげで一週間はかかるかなーと思っていた作業が一日で終りました。Apache ライセンス万歳!
*1:そのほかにも "LS-Async" というのもあるようです。