空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

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" );
        XAuto pzDOMDoc( 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" というのもあるようです。