人気ブログランキング | 話題のタグを見る

[CoveredCalc] なんちゃってDOM

CoveredCalc では、カバー定義と設定ファイルに XML を利用しています。
XML にすると汎用のパーサが使えたり、拡張がしやすかったりというメリットがあるからです。(と過去に自分が書いてます

汎用の XML パーサには、SAX と DOM の 2 種類があります。SAX はタグなどが見つかるたびに順に通知されるイベント型。お手軽で簡単な解析に向いています。DOM は XML 文書を解析したあとツリー構造をそのままオブジェクトにマッピングして、文書内のどこでも参照できるような高機能なものです。さらに、そのツリーに変更を加えて、XML 文書として書き出すこともできます。(SAX は読み込みしかしない)
作り始めた当初は、そんなに複雑にするつもりはなかったので、SAX パーサでお手軽にやればいいかと思っていました。でも、作ってみると(特にカバー定義が)思ったより複雑になってしまいました。SAX パーサからのイベントハンドリングは妙に複雑です。
さらに設定をファイルに落とすときに XML 文書を自分で書き出さなくてはいけないので割と面倒です。
これはカバー定義と設定項目の拡張を妨げる原因になっています。やる気がなくなるんだもん。

このあたりで、SAX パーサをやめて DOM パーサに変更しようかと思いました。
現在使っている Expat を採用した背景には、BeOS で使えたことと、ライセンスが希望に合うことがあります。(と、これもまた過去に書いてます
一方、DOM パーサとして有名なのは Xerces(C++ で利用するので Xerces C++)です(なお、Xerces は SAX パーサの機能も持っています)。最新バージョンは 2.6.0 のようですが、BeOS にも 2.4.0 がポーティングされているようです。ライセンスも Apache Software License 2.0 なので問題はないでしょう。
ただし、この BeOS ポートでは共有ライブラリ(.so)のバイナリしかありません。自分でビルドすればスタティックライブラリ(.a)も得られるんでしょうか。共有ライブラリでも構わない(むしろユーザからすればそっちの方がいい?)んですが、シンプルなファイル構成にしたいのと、ユーザの環境によってライブラリが異なっていると動きが変わったりするのを避けたいんです。

でも、そこまでしてフルスペックの DOM パーサがいるか?という気もしてきました。
当然、DOM パーサは処理も重いし、サイズも大きくなります。
Expat がうまく動いてくれていることはわかっているわけですから、解析にはこのまま SAX パーサを使うことにして、DOM ツリーの管理部分とツリーを XML に出力する部分だけを自力で作ればいいんじゃないかと。
別にフルスペック必要なわけではないので、自分が使うような機能だけを実装した「なんちゃってDOM」でいいんです。DOM の仕様を満たす必要なんか全然ありませんしね。

でも、これはそれなりに時間がかかりそうなので、他の機能を実装しながら、平行して進めようかなと思っています。パーサ自体は独立してるので、Subversion でブランチ切って作業してれば、最新ソースへのマージも楽かな~。
by hironytic | 2005-02-01 01:02 | 構想
<< [CoveredCalc] カ... [CoveredCalc] さ... >>