C++とXML !!注意!! ここに書かれている内容は不正確なものばかりです. このページの内容を参考にする場合は,正確な情報を得るために(最後にあげた)参考文献を必ず参照するようにしてください. C++ で XML 文書を扱う方法 †このページは C++ から XML 文書を扱う方法を調査した結果を書いたものです. XML についての漠然とした知識しかない C++ 開発者が,プログラム内で XML 文書を扱い,プログラムの入出力インタフェースとして XML 文書を用いることができるようになるまでを書いていくつもりです. 対象は「2004年3月時点での自分」とします. XML とは †ここから始めると途方もなく長い話になりそうです. 技術的な定義は他に譲るとして,自分の中での定義は「サービスやアプリケーション同士のデータ交換に便利でよく使われている拡張可能マークアップ言語」で,アプリケーションの内部形式として使われるよりも,他のアプリケーションに対してデータを公開したり抽出したりするいわゆるデータ交換用途に使われることの多い,すなわちアプリケーションの外部形式として使われることの多い文書と考えています. XML の基礎 †XML を扱うために必要なキーワード(ボキャブラリ)として以下のキーワードは理解しておくべきでしょう.(定義は適宜追加していきます)
文書の構造定義 †DTD or XML Schema が使われる.多くの場合 DTD が使われるが,DTD では表現不足な部分があり,XML Schema などの構造定義用の一種の言語が作られたらしい.DTD は SGML ベースであり,XML Schema は XML 1.0 ベースであるが,現在はほとんどの場合 DTD が使われているようだ. XML 開発者にとって DTD は必須の技術.必ずマスターしているべきもの.DTD の表現力に満足できなくなれば XML Schema や TREX,RELAX などを検討しよう. これらのすべては C++ から利用可能である. プログラミングインタフェース †XML 文書をアプリケーションが扱うためのプログラミングインタフェース(いわゆる API)にはいくつかの標準的なインタフェースがある.
2つのプログラミングインタフェース †アプリケーションが XML 文書を扱うための技術(概念といった方がいいだろうか)には,大きく分けて2種類ある. イベントモデルとオブジェクトモデルである.
それぞれに有名な標準があり,イベントモデルを用いたAPIには SAX が,オブジェクトモデルを用いたAPIには DOM がある.SAX は業界標準であり,DOM は W3C の標準である.そのため,XML を扱うための一般的なインタフェースは DOM であるが,C++ や Java などのアプリケーションから XML を扱うには DOM では効率が悪い場合があり,イベントモデルが用いられることも多い. もちろん,どちらのモデルにも非標準なものがある.実装毎に非標準があると思っていいだろう. さて,ここまでは基礎知識で実質的な利益のある情報ではない.C++ プログラマにとってこれら2つのプログラミングインタフェースの一番大きな違いは,XML 文書をメモり上に全部展開する必要があるかどうかかだろう. DOM はオブジェクトモデルであるため,一度 XML 文書を走査して内部的にツリー構造を 作り上げる必要がある.データにアクセスする際にはメモリ上にXML文書が存在するのだから,当然 XML 文書の大きさに応じたメモリが必要になる. SAX をはじめとするイベントモデルでは,XML 文書の走査中にユーザアプリケーションのコールバック関数が呼ばれる.XML 文書を解析するにはユーザアプリケーションが独自に解析ルーチンを持つ必要がある(と思う). SAX と DOM の実装 †SAX の実装系としては expat が有名だが,Microsoft 社が提供する MSXML や Gnome による libxml,Apache Software Foundation による Xerces なども SAX インタフェースを持つ. DOM の実装系としては上にあげた MSXML や libxml,Xerces などがある.逆に言えば MSXML,libxml,Xerces などは SAX と DOM の両方のインタフェースを持つ. [2] の 表.2 を参考にしよう. 参考文献 †
更新履歴 †2004-03-30 (火) 11:31:39 「SAX と DOM の実装」までを書いてみた. ![]() |