ドキュメント オブジェクト モデル(DOM)の使用
ドキュメント オブジェクト モデル(DOM)は、解析された XML ドキュメントを表すための一連の標準インターフェイスです。これらのインターフェイスは、さまざまなサードパーティ ベンダによって実装されています。RAD Studio に付属しているデフォルトの実装を使用しない場合は、ユーザーが追加の XML ベンダを XML フレームワークに統合できる登録メカニズムが用意されています。
Xml.xmldom ユニットには、W3C XML DOM レベル 2 仕様で定義されたすべての DOM インターフェイスの宣言が含まれています。各 XML ベンダが、これらのインターフェイスの実装を提供しています。
DOM インターフェイスを直接操作して、XML ドキュメントを解析および編集することができます。GetDOM 関数を呼び出すだけで IDOMImplementation
インターフェイスが得られ、それを出発点として使用できます。
- メモ: DOM インターフェイスの詳細については、Xml.xmldom ユニット内の宣言、ご利用の XML ベンダから提供されているドキュメント、あるいは W3C の Web サイト(www.w3.org)で公開されている仕様を参照してください。
DOM インターフェイスを直接扱うよりも、特別な XML クラスを使用する方が便利な場合があります。それらについては、以下を参照してください。
組み込み XML ベンダの一覧
RAD Studio でデフォルトでサポートされている XML ベンダの比較を次の表に示します。
実装 | ユニット | グローバル変数 | 説明 |
---|---|---|---|
|
RAD Studio の組み込み XML ベンダの中で最速です。Windows 専用。デフォルト。 クロスプラットフォーム対応にするには、別の XML ベンダを選ぶ必要があります。別の XML ベンダを指定しない場合、アプリケーションは Windows 以外のプラットフォームでは XML をサポートせず、他のプラットフォームでアプリケーションを実行すると、実行時例外が発生します。 | ||
|
|
ADOM よりはるかに高速ですが、MSXML よりやや低速です。クロスプラットフォーム対応。 | |
|
|
RAD Studio の他の組み込み XML ベンダより低速です。クロスプラットフォーム対応。 |
XML ベンダの選択
アプリケーションをビルドする際に、RAD Studio ではデフォルトの組み込み XML ベンダ MSXML が使用されます。
別の XML ベンダを指定しない場合、アプリケーションは Windows 以外のプラットフォームでは XML をサポートせず、他のプラットフォームでアプリケーションを実行すると、実行時例外が発生します。クロスプラットフォーム アプリケーションの場合は、OmniXML が現時点では最も良い選択肢です。ADOM よりパフォーマンスがはるかに良いからです。
別の XML ベンダを選択するには、RTL の XML 機能(たとえば TXMLDocument クラスなど)を使用するユニットに、選択するベンダのユニットへの参照を追加します。複数の XML ベンダ ユニットを追加した場合は、最初に参照されたユニットが XML ベンダとして使用されます。この動作をオーバーライドする必要がある場合は、グローバル変数 DefaultDOMVendor の値を、使用する XML ベンダのグローバル変数に変更します。
- メモ: 各 XML ベンダのユニットおよびグローバル変数については、上記の「組み込み XML ベンダの一覧」で参照できます。
TXMLDocument コンポーネントを使用する場合は、その DOMVendor プロパティを使って XML ベンダを選択できます。DOMVendor の値を変更すると、このコンポーネントを使用しているユニットは指定の XML ベンダを使用するように構成されるため、ユニット参照または DefaultDOMVendor グローバル変数を手動で変更する必要はありません。
プラットフォームごとに異なる XML ベンダを使用する
プラットフォームごとに異なる XML ベンダ(たとえば、Windows では MSXML、その他のプラットフォームでは OmniXML)を使用するには、次のような条件付きコンパイルを使用します。
たとえば、各プラットフォームで実現し得る最高のパフォーマンスを得るには、次のようなコードを使用できます。
Delphi の場合:
uses
// …
{$IFDEF MSWINDOWS}Xml.Win.msxmldom{$ELSE}Xml.omnixmldom{$ENDIF};
C++ の場合:
#ifdef MSWINDOWS
#include <Xml.Win.msxmldom.hpp>
#else
#include <Xml.omnixmldom.hpp>
#endif
カスタム XML ベンダを使用する
上記の組み込み XML ベンダ以外の XML ベンダを使用するには、Xml.xmldom.TDOMVendor クラスの下位クラスを定義するユニットを作成する必要があります。このユニットはその後、組み込み XML ベンダの 1 つのように機能でき、プロジェクトに組み込まれると、作成した XML ベンダが使用可能になります。
この下位クラスでは、2 つのメソッドをオーバーライドする必要があります。ベンダを識別する文字列を返す Description メソッドと、トップレベル インターフェイス(IDOMImplementation)を返す DOMImplementation メソッドです。
新規ユニットでは、グローバル手続き RegisterDOMVendor を呼び出して、独自の XML ベンダを登録する必要があります。この呼び出しは通常、ユニットの initialization セクションで行われます。
読み込み解除されると、ユニットは自分自身を登録解除して、独自の XML ベンダがもう使用可能でないことを示す必要があります。グローバル手続き UnRegisterDOMVendor を呼び出すと、XML ベンダを登録解除できます。この呼び出しは通常、ユニットの finalization セクションで行われます。
XML ベンダの中には、標準の DOM インターフェイスに対する拡張機能を提供しているものがあります。これらの拡張機能を使用できるようにするために、Xml.xmldom ユニットでは IDOMNodeEx インターフェイスも定義しています。IDOMNodeEx
は標準の IDOMNode の下位インターフェイスで、これらの拡張機能のうち最も有用なものがそこに含まれています。