SOAP メッセージでのデータセットの使用
このトピックでは、%XML.DataSet について説明します。これは、Web サービスと Web クライアントの両方が InterSystems IRIS を基盤とする場合や、いずれかが .NET を使用する場合に、SOAP メッセージで使用できる XML 対応のデータセットです。他の SOAP ベンダは、データセットをサポートしていません。
データセットについて
データセットとは、Microsoft 社によって定義され (また、.NET で使用され)、InterSystems IRIS でもサポートされている XML 形式の結果セットです。Web サービスと Web クライアントの両方が InterSystems IRIS を基盤とする場合や、いずれかが .NET を使用する場合、データセットを Web メソッドへの入力または Web メソッドからの出力として使用できます。他の SOAP テクノロジでは、この形式は認識されません。
InterSystems IRIS で Web サービスまたは Web クライアントを使用して作業する場合には、データセットを表現するために %XML.DataSetOpens in a new tab (またはカスタム・サブクラス) を使用します。%XML.DataSetOpens in a new tab の使用の詳細は、クラス参照を参照してください。
サンプル Web サービス SOAP.Demo (SAMPLES ネームスペース内にあります) では、InterSystems IRIS でのデータセットの例を示します。具体的には、以下の Web メソッドでデータセットを使用します。
-
GetByName()
-
GetDataSetByName()
-
QueryByName()
Java ベースの Web クライアントで使用できるようにクエリの結果を出力するには、%ListOfObjectsOpens in a new tab サブクラスを使用します。SOAP.Demo に例があります。
typed データセットの定義
データセットではすべて、取得するデータを指定するクエリが使用されます。コンパイル時にクエリが既知のとき、データセットは typed となり、それ以外の場合は untyped となります。typed データセットは多くの場面で便利に使うことができます。例えば、.NET では、typed データセットによって Microsoft Visual Studio のコードを実行できます。
typed データセットを定義するには、%XML.DataSetOpens in a new tab のサブクラスを作成し、QUERYNAME パラメータと CLASSNAME パラメータを指定します。これらのパラメータは共に、特定の 1 つの SQL クエリを参照します。データセットのスキーマを生成すると、%XML.DataSetOpens in a new tab ではカスタム・データ型の LogicalToXSD() メソッドなど、クラスとプロパティのメタデータが考慮されます。
データセットとスキーマの XML としての表示
%XML.DataSetOpens in a new tab を拡張するデータセットには、XML の生成に使用できるユーティリティ・メソッドがあります。これらのメソッドはすべて現在のデバイスに書き込みます。
-
WriteXML() は、XML としてデータセットを書き込みます。オプションで、XML スキーマが前に付きます。このメソッドには、最上位の要素の名前、ネームスペースの使用、NULL の扱いなどを制御するオプションの引数があります。前のセクションの設定で指定されているように、既定では、このメソッドはデータセットの形式を考慮します。出力が DiffGram 形式かどうかなどを制御するオプションの引数に値を指定することによって、この結果を上書きできます。詳細は、%XML.DataSetOpens in a new tab のクラス・ドキュメントを参照してください。
-
XMLExport() は、データセットの XML スキーマを書き込み、その後ろに XML としてのデータセットを書き込みます。
-
WriteSchema() は、データセットの XML スキーマのみを書き込みます。
-
XMLSchema() は、データセット・クラスの Microsoft 専用の XML 表現を書き込みます。
XML 対応のオブジェクトからの XML スキーマの生成については、"XML ツールの使用法" を参照してください。
WSDL への影響
InterSystems IRIS Web サービスで %XML.DataSetOpens in a new tab を Web メソッドに対する入力または出力として使用する場合、WSDL に影響を与え、InterSystems IRIS および .NET 以外のクライアントで WSDL の利用に問題が発生します。
typed データセットの場合、WSDL では (<types> セクション内に) 以下の要素が含まれます。
<s:element name="GetDataSetByNameResponse">
<s:complexType>
<s:sequence>
<s:element name="GetDataSetByNameResult" type="s0:ByNameDataSet" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ByNameDataSet">
<s:sequence>
<s:any namespace="http://tempuri.org/ByNameDataSet" />
</s:sequence>
</s:complexType>
untyped データセットの場合、WSDL では以下の要素が含まれます。
<s:element name="GetByNameResponse">
<s:complexType>
<s:sequence>
<s:element name="GetByNameResult" type="s0:DataSet" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="DataSet">
<s:sequence>
<s:element ref="s:schema" />
<s:any />
</s:sequence>
</s:complexType>
後者の場合、InterSystems IRIS または .NET 以外のツール内で Web クライアントを生成しようとすると、そのツールに関する十分な情報がないためにエラーが発生します。Metro の場合は、WSDL を利用しようとする前に、追加のスキーマ情報をロードできます。そのためには、wsimport と呼ばれるコマンドライン・ツールを使用できます。この手法によって、クライアントを生成するのに十分な情報を提供することができます。
ただし、どの場合でも、クライアントが適切な形式でメッセージを解釈または生成できるようにコードを記述するには、相当の作業が必要です。