C++とXML #contents '''''!!注意!!''''' ここに書かれている内容は不正確なものばかりです. このページの内容を参考にする場合は,正確な情報を得るために(最後にあげた)参考文献を必ず参照するようにしてください. * C++ で XML 文書を扱う方法 [#ff6fb8a6] このページは C++ から XML 文書を扱う方法を調査した結果を書いたものです. XML についての漠然とした知識しかない C++ 開発者が,プログラム内で XML 文書を扱い,プログラムの入出力インタフェースとして XML 文書を用いることができるようになるまでを書いていくつもりです. 対象は「2004年3月時点での自分」とします. * XML とは [#g9b5d368] ここから始めると途方もなく長い話になりそうです. 技術的な定義は他に譲るとして,自分の中での定義は「サービスやアプリケーション同士のデータ交換に便利でよく使われている拡張可能マークアップ言語」で,アプリケーションの内部形式として使われるよりも,他のアプリケーションに対してデータを公開したり抽出したりするいわゆるデータ交換用途に使われることの多い,すなわちアプリケーションの外部形式として使われることの多い文書と考えています. * XML の基礎 [#m320a54c] XML を扱うために必要なキーワード(ボキャブラリ)として以下のキーワードは理解しておくべきでしょう.(定義は適宜追加していきます) - XML - DTD - XML Schema - 整形式 - 名前空間 - パーサー - SAX - DOM - SOAP - XSLT ** 文書の構造定義 [#s7d0118d] DTD or XML Schema が使われる.多くの場合 DTD が使われるが,DTD では表現不足な部分があり,XML Schema などの構造定義用の一種の言語が作られたらしい.DTD は SGML ベースであり,XML Schema は XML 1.0 ベースであるが,現在はほとんどの場合 DTD が使われているようだ. XML 開発者にとって DTD は必須の技術.必ずマスターしているべきもの.DTD の表現力に満足できなくなれば XML Schema や TREX,RELAX などを検討しよう. これらのすべては C++ から利用可能である. * プログラミングインタフェース [#v0d5af8b] XML 文書をアプリケーションが扱うためのプログラミングインタフェース(いわゆる API)にはいくつかの標準的なインタフェースがある. >XML をアプリケーション上で扱うライブラリを作る場合,いろいろなインタフェースが考えられるが, >ライブラリ毎に全く異なるインタフェースを持っていると,別のライブラリを扱う場合に >一からインタフェースを勉強し直す必要がでてしまうなど,何かと不便.そのため,業界として標準的なインタフェースを決めたのだろう. >もちろん,ライブラリ固有の(業界非標準)インタフェースは数多くある. >ただ,業界の標準・非標準にかかわらず,「2つの方法のどちらか」といえる方法があるらしい. >下記に述べる「イベントモデル」と「オブジェクトモデル」である. ** 2つのプログラミングインタフェース [#hb805aee] アプリケーションが 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 の実装 [#i32a3581] ''SAX の実装系''としては ''expat'' が有名だが,Microsoft 社が提供する ''MSXML'' や Gnome による ''libxml'',Apache Software Foundation による ''Xerces'' なども SAX インタフェースを持つ. ''DOM の実装系''としては上にあげた MSXML や libxml,Xerces などがある.逆に言えば MSXML,libxml,Xerces などは SAX と DOM の両方のインタフェースを持つ. [2] の 表.2 を参考にしよう. * 参考文献 [#f87c6d30] -[1] C++ による XML 開発技法 -- ファビオ・アルシニェガス著 -- ピアソン・エデュケーション -- ISBN 4894714140 -[2] C/C++ developers: XMLツールボックスの中身を充実させる -- http://www-6.ibm.com/jp/developerworks/xml/020118/j_x-ctlbx.html * 更新履歴 [#x8910ac0] 2004-03-30 (火) 11:31:39 「SAX と DOM の実装」までを書いてみた.