Office XP Web Services Toolkit 2.0 を使用して XML Web サービスで複合データ型を送受信する

Frank C. Rice
Microsoft Corporation

July 2002
日本語版最終更新日 2002 年 7 月 26 日

対象:
    Microsoft® Office XP Web Services Toolkit 2.0
    Microsoft SOAP Toolkit 3.0

概要 : Microsoft Office XP Web Services Toolkit 2.0 には、 XML Web サービスで単純データ型と複合データ型の使用を簡略化する Web Service References Tool 2.0 が含まれています。 この資料では、SOAP 3.0 DLL および Web Service References Tool 2.0 を使用して、 XML Web サービスで単純データ型と複合データ型を使用する方法を例示します。

目次

はじめに
SOAP 3.0 DLL
Web Service References Tool 2.0
Web Service References Tool 2.0 の使用
SalesRankNPrice XML Web サービス
プロキシ クラスの作成
プロキシ クラスのコードの調査
ユーザー定義の All 複合データ型
SalesRankNPrice XML Web サービスの呼び出し
単純データ型の使用
複合データ型としての XML の使用
複合データ型としての配列の使用
複合データ型としての列挙型の使用
まとめ

はじめに

一般的に、XML (Extensible Markup Language) Web サービスは、 SOAP (Simple Object Access Protocol) メッセージを送信するクライアント アプリケーションで構成されます。 このメッセージには、Web サーバー アプリケーションへの入力パラメータが含まれており、 メッセージは XML Web サービスを呼び出すために HTTP (ハイパーテキスト転送プロトコル) を使用して送信されます。 XML Web サービスの結果も SOAP メッセージ内部でクライアントに返されます。

これらの SOAP メッセージに含まれるデータは、 Web サーバー上に存在する WSDL (Web Services Description Language) の指定に従って、 単純データ型または複合データ型で構成できます。 一般的に、単純データ型は String 値、Integer 値、 または別の単一要素から成るデータ型を保持する単一値を含みます。 複合データ型は、配列、UDT (ユーザー定義型)、 列挙型または XMLノード リストなどの単純データ型の組み合わせを保持する構造体で構成されます。

注意    WSDL ファイルは、Web メソッドの名前や入出力を構成するパラメータなど、 XML Web サービスからクライアント アプリケーションに提供されるサービスに関する情報を識別します。

Microsoft SOAP 3.0 DLL (ダイナミック リンク ライブラリ) および Microsoft Office XP Web Services Toolkit 2.0 には、 XML Web サービスの作成および使用を支援するための多くの機能が含まれています。 この資料では、これらの機能について詳しく説明します。

この資料では、 SOAP 3.0 DLL と Web Service References Tool 2.0 を使用して、 XML Web サービスで単純データ型と複合データ型を使用する方法について説明します。 SOAP 3.0 DLL と Web Service References Tool 2.0 は、 共に Office XP Web Services Toolkit 2.0 で提供されます。

SOAP 3.0 DLL

SOAP 3.0 DLL は、 XML Web サービスで単純データ型と複合データ型を使用した作業を支援するために、 クライアント側とサーバー側の両方のコンポーネントを公開する高レベルの API (アプリケーション プログラミング インターフェイス) を提供します。

注意    SOAP 3.0 DLL は Office XP Web Services Toolkit 2.0 以外に、 SOAP Toolkit 3.0 でもユーザー ガイドと共に提供されます。

SoapClient30 オブジェクトを使用することにより、 クライアント アプリケーションはクライアントが Web サーバー上に存在しているかのように XML Web サービス操作を呼び出せるようになります。 SoapClient30 オブジェクトは、 各 XML Web サービスのメソッドを WSDL ファイルと WSML (Web Services Meta Language) ファイルで定義された対応する COM (コンポーネント オブジェクト モデル) オブジェクト メソッド呼び出しにマップして、 XML Web サービス内のメソッドへのアクセスを提供します。

注意    WSML ファイルは、 (WSDL ファイルで定義された) XML Web サービスのメソッドを XML Web サービスを実装する COM オブジェクトの特定のメソッドにマップします。 WSML ファイルは、Microsoft SOAP Toolkit を実装する場合にのみ必要になります。

SoapClient30 オブジェクトと SoapServer30 オブジェクトは、 単純データ型を認識して自動的に処理します。 ただし、これらのオブジェクトは複合データ型を認識せず、処理しません。 そのため、これらのオブジェクトと共に複合データ型を使用する場合、 複合データ型をオブジェクトが認識する単純データ型のセットに明示的に変換する必要があります。 SOAP 3.0 DLL では、この変換を行うために COM オブジェクトと UDT 用に型マッパー、 XML データ用に IXMLDOMNodeList インターフェイスを提供しています。

型マッパーが複合データ型を COM オブジェクトにマップする場合、 SOAP メッセージのシリアル化解除とこれらの COM オブジェクトのシリアル化の両方の処理を行います。 SOAP メッセージのシリアル化解除とは、 受信した SOAP メッセージを読み取り、さまざまな複合データ型に対して COM オブジェクトを構築することです。 COM オブジェクトのシリアル化とは、 送信する SOAP メッセージに COM オブジェクトを書き込むことです。

注意    シリアル化とは、オブジェクトを容易に転送できる形式に変換する処理です。 たとえば、オブジェクトをシリアル化し、 HTTP を使用してインターネット経由でクライアントとサーバー間でシリアル化したオブジェクトを転送できます。 それに対して、シリアル化解除とはストリームからオブジェクトを再構築する処理です。

SOAP 3.0 DLL では以下の型マッパーおよびインターフェイスを利用できます。

  • COM オブジェクトを使用して XML Web サービスを実装しているときは、 汎用型マッパーを使用して複合データ型を COM メソッドにマップできます。
  • COM オブジェクトの代わりに UDT を使用しているときは、 UDT マッパー (ユーザー定義データ型マッパー) を使用して複合データ型をメソッド呼び出しにマップできます。
  • カスタム型マッパーを使用すると、カスタム型マッピングを作成できるようになります。 SOAP 3.0 DLL には SoapTypeMapperFactory30 オブジェクトが含まれています。 このオブジェクトを使用して、単純データ型、配列、および登録されている複合データ型用のカスタム型マッピングを作成できます。
  • IXMLDOMNodeList インターフェイスを使用すると、 ノードの XML DOM (Document Object Model) リストに複合データ型をマップできます。

SOAP 3.0 DLL は、低レベルのインターフェイスも提供します。 クライアントおよびサーバーは、 これらのインターフェイスを使用して、 SOAP メッセージを生成、構築、交換、および処理できるようになります。 これらの低レベルのインターフェイスを使用すると、 高レベルの API にある SoapClient30 オブジェクトや SoapServer30 オブジェクトに依存せずに、 独自の SOAP サーバーと SOAP クライアントを作成できます。

また、SOAP Toolkit 3.0 では XML Web サービスを使用した作業を支援する以下のツールとユーティリティを提供します。

  • WSDL ファイルと WSML ファイルを生成する WSDL/WSML Generator ツール。
  • TCP/IP トレース ユーティリティ (MSSOAPT.EXE)。 このユーティリティを使用して、 SOAP クライアントと Web サーバー上に存在する XML Web サービス間で HTTP 経由で送信される SOAP メッセージを表示できます。

型マッパー、IXMLDOMNodeList インターフェイス、およびその他のツールの詳細については、 SOAP Toolkit 3.0 に含まれているヘルプ トピックを参照してください。

Web Service References Tool 2.0

Office XP Web Services Toolkit 2.0 は、 SOAP 3.0 DLL で提供する機能以外に、 XML Web サービスにアクセスし、利用するのを支援するための Web Service Refereneces Tool 2.0 を提供します。 クライアント アプリケーションで Web Service References Tool 2.0 を使用して、 WSDL ファイルまたは Microsoft Visual Studio ® .NET の探索ファイル (.vsdisco) から Microsoft Visual Basic® Applications (VBA) プロキシ クラス モジュールを作成できます。 このプロキシ クラスには、 クライアント アプリケーションが Web サーバー上に存在するかのように XML Web サービス メソッドを呼び出すことを可能にするメソッドおよびその他のコードが含まれます。

具体的には、Web Service References Tool 2.0 は以下の機能を提供します。

  • XML Web サービスの検出、テスト、および選択を支援するユーザー インターフェイス。
  • クライアント アプリケーション内のプロキシ オブジェクトを使用すると、 Web サーバー上に存在するオブジェクトおよびメソッドを直接呼び出せます。 これらのオブジェクトは、ファイル名が clsws_ で始まり、 その後に XML Web サービス名が続くクラス ファイルに含まれています。
  • WSDL ファイルで定義された UDT を定義するクラス。 これらの UDT は、ファイル名が struct_ で始まるクラス ファイルに含まれています。
  • UDT 内の XML Web サービスが返す XML IXMLDOMNode インターフェイスと、 Web Service References Tool 2.0 が作成したデータ構造体との間のマッピングを提供するクラス。 SOAP はこのマッピングを使用して XML をフォーマットし、 VBA でも使用できるようにします。 これらのクラス ファイル名は、clsof_Factory_ で始まり、 その後に XML Web サービス名が続きます。

この資料の後半で説明しますが、 Web Service References Tool 2.0 を使用すると、 XML Web サービスで複合データ型を使用することは比較的簡単な作業です。

Web Service References Tool 2.0 の使用

Web Service References Tool 2.0 を使用するには、 Office アプリケーション (たとえば、Microsoft Access、Microsoft Excel、Microsoft FrontPage® または Microsoft Outlook® など) の Visual Basic Editor (VBE) で [ツール] メニューの [Web Service References] をクリックします。 この操作により、 XML Web サービスを定義するメソッドを含む WSDL ファイル (または .vsdisco) を検索するのに使用できるユーザー インターフェイスが表示されます (図 1 参照)。 このファイルは、UDDI (Universal Description, Discovery, and Integration) ビジネス レジストリを検索するか、 またはファイルへの URL を直接指定して検出できます。 UDDI レジストリでは、企業名または XML Web サービスの種類を使用して検索できます。

WSDL ファイルを検出して、VBE で WSDL ファイルへの参照を設定すると、 Web Service References Tool 2.0 がファイルを読み取り、 XML Web サービスのメソッド名およびパラメータ情報を判断します。 次に、ツールはこの情報を使用してクライアント アプリケーション内にプロキシ クラスおよびその他のクラス ファイルを作成します。 任意の Office の組み込みオブジェクトやメソッドを使用する場合と同じように、 これらのプロキシ クラスを使用して、XML Web サービスにアクセスするオブジェクトを宣言したり、 インスタンスを作成したりできます。 また、デザイン時にクライアント アプリケーションでオブジェクトとメソッドを利用できるので、 Microsoft IntelliSense® や XML Web サービスに対する構文チェックを行えるという付加的な利点があります (これは "事前バインディング" とも呼ばれます)。

プロキシ クラスは、 XML Web サービスからの要求の送信および応答の受信の細部も処理します。 たとえば、クライアント アプリケーションで XML Web サービスを使用する準備が整うと、 プロキシ クラスがメソッド情報を含む SOAP メッセージを作成し、 次に HTTP 経由で SOAP パケットを Web サーバーに渡します。 要求がサーバー上で処理され、クライアント側に戻されると、 プロキシ クラスは応答を取得して、返された値をクライアント アプリケーションに渡します。 この値はクライアント アプリケーションで解析され、処理されます。

Web Service References Tool 2.0 を使用しない場合、 Office ソリューションから XML Web サービスを呼び出すには複雑かつエラーが発生しやすい一連の手順を実行する必要があります。 たとえば、XML Web サービスのメソッド名や入出力パラメータを取得するには、 XML Web サービスの WSDL ファイルの URL を知っている必要があります。 また、クライアント アプリケーションは、 実行時まで XML Web サービスのオブジェクトやメソッドに対してアクセス権がないので、 事前バインディングは行えず、IntelliSense や構文チェックの恩恵を得られません。

この資料の残りの部分では、 Web Service References Tool 2.0 を使用して単純データ型と複合データ型を使用する XML Web サービスにアクセスする方法を例示します。 この資料の一部の例では、 SalesRankNPrice XML Web サービスと Zip Code Resolver XML Web サービスを使用します。 その他の説明では、架空の XML Web サービスを使用します。

SalesRankNPrice XML Web サービス

SalesRankNPrice XML Web サービスを使用して、 AmazonBarnes & Noble のWeb サイトから購入できる書籍の ISBN (国際標準図書番号) を参照して売り上げランキングや価格を取得できます。 この XML Web サービスで公開されているいくつかのメソッドを以下に示します。 この資料では、Web Service References Tool 2.0 を使用してこれらのメソッドについて説明します。

  • GetBNPrice この Web メソッドは ISBN String 値を受け取り、 指定した書籍の BarnesAndNoble.com Price (US ドル) を String 値で返します。
  • GetAll この Web メソッドは ISBN String 値を受け取り、 指定した書籍の Amazon.com と BarnesAndNoble.com の売り上げランキングだけでなく、 Amazon.com と BarnesAndNoble.com の価格 (US ドル) を返します。 返されるデータは 4 つの String 値 ( AmazonSalesRank AmazonPrice BNSalesRank 、および BNPrice ) を持つ 1 つの構造体です。

SalesRankNPrice WSDL ファイルへの参照を設定した後 Web Service References Tool 2.0 が生成するコードを見てみましょう。

プロキシ クラスの作成

VBE で [ツール] メニューの [Web Service References] をクリックして、 WSDL ファイルへの参照を作成すると、次のダイアログ ボックスが表示されます。

Aa140321.odc_cmplxtypes01(ja-jp,office.10).gif
図 1. Web Service References Tool のユーザー インターフェイス。

[Web Service References] ダイアログ ボックスには、以下のユーザー インターフェイスがあります。

  • [Web サービスの検索] では、 キーワードやビジネス名を使用して UDDI ビジネス レジストリで XML Web サービスの検索を実行できます。
  • [Web サービス URL] では、 WSDL または .vsdisco ファイルへの特定の URL を使用して XML Web サービスの検索を実行できます。
  • [検索結果] では、 ツールを使用してプロキシ クラスを作成する対象となる XML Web サービスを選択できます。
  • [テスト] ボタンをクリックすると、 [検索結果] で選択した XML Web メソッドをテストできます (ただし、XML Web サービス管理者が対応する .asmx テスト ハーネス ページを提供している場合に限ります)。

XML Web サービスを選択して [追加] ボタンをクリックすると、 Web Service References Tool 2.0 は以下の操作を行います。

  • XML Web サービスが複合データ型を使用するメソッドを少なくとも 1 つ含んでいると仮定して、 サービスの複合データ型にマップする構造体を含むクラス モジュールを作成します。 各構造体のクラス ファイル名は struct_ で始まり、 その後に WSDL ファイルで定義されているユーザー定義のデータ型名が続きます。 たとえば、SaleRankNPrice XML Web サービスへの参照を設定後、 クラス struct_All が作成され、 GetAll Web メソッドで使用されるユーザー定義型はこのクラスに含まれます。
  • オブジェクト ファクトリ クラス ファイルを作成します。 XML Web サービスが複合データ型を使用するメソッドを含む場合、 このクラス ファイルは SOAP 3.0 DLL オブジェクト ファクトリへのインターフェイスを提供します。 オブジェクト ファクトリ クラスは、 サーバー上の型マッパーとクライアント上のユーザー定義型との間のマッピングを作成するのに使用されます。 ユーザー定義型は、IXMLDOMNode インターフェイスを使用して、 XML Web サービスから XML ドキュメントとして返されます。 クラス ファイル名は、clsof_Factory で始まり、 その後に XML Web サービス名が続きます。
  • 実装する XML Web サービスのデータ型に関係なく、 選択した XML Web サービスごとに XML Web サービス クラス ファイルを 1 つ作成します。 このファイル名は、clsws_ で始まり、 その後に XML Web サービス名が続きます。 たとえば、SalesRankNPrice XML Web サービスをプロジェクトに追加すると、 clsws_SalesRankNPrice クラス ファイルが作成されます。
  • XML Web サービスのインスタンスに対応する XML Web サービスのクラス ファイル内に Private SoapClient30 オブジェクト変数を作成します。 オブジェクト変数は、sc_ で始まり、 その後に XML Web サービス名が続きます。 SalesRankNPrice XML Web サービスの場合、 このオブジェクト変数は sc_SalesRankNPrice という名前になります。
  • XML Web サービスの WSDL ファイルへの URL を含む XMLWeb サービスのクラス ファイル内に Private 定数を 1 つ作成します。 この定数は、常に c_WSDL_URL という名前になります。
  • WSDL ファイルで指定された XML Web サービスの名前に対応する XML Web サービスのクラス ファイル内に 1 つの Private 定数を作成します。 この定数は、常に c_SERVICE という名前になります。 SalesRankNPrice XML Web サービスの場合、 この定数は値 SalesRankNPrice を含みます。
  • WSDL ファイルで指定された SOAP メッセージを受信する XML Web サービスのポートに対応する XML Web サービスのクラス ファイル内に Private 定数を 1 つ作成します。 この定数は、常に c_PORT という名前になります。 SalesRankNPrice XML Web サービスの場合、 この定数は値 SalesRankNPriceSoap を含みます。
  • WSDL ファイルで指定された XML Web サービスの名前空間に対応する XML Web サービスのクラス ファイル内に Private 定数を 1 つ作成します。 この定数は、常に c_SERVICE_NAMESPACE という名前になります。 SalesRankNPrice XML Web サービスの場合、 この定数は値 http://www.PerfectXML.com/NETWebSvcs/BookService を含みます。
  • XML Web サービスの str_WSML という名前のクラス ファイル内に連結した String 変数を 1 つ作成します。 XML Web サービスに複合データ型が含まれる場合、 str_WSML 定数は連結した String 値を含みます。 この値は、WSDL ファイルで定義された複合データ型をクライアント アプリケーション内のユーザー定義の構造体にリンクします。 複合データ型が定義されていないと、 この変数は Null 値を持ちます。 SalesRankNPrice XML Web サービスの場合、この定数は次の値を含みます。
    Dim str_WSML As String
    str_WSML = "<servicemapping name='SalesRankNPrice'>"
    str_WSML = str_WSML & "<service name='SalesRankNPrice'>"
    str_WSML = str_WSML & "<using PROGID='MSSOAP.GenericCustomTypeMapper30' cachable='0' ID='GCTM'/>"
    str_WSML = str_WSML & "<types>"
    str_WSML = str_WSML & "<type name='All' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_All'/>"
    str_WSML = str_WSML & "<type name='Prices' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_Prices'/>"
    str_WSML = str_WSML & "<type name='SalesRankNPrice1' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_SalesRankNPrice1'/>"
    str_WSML = str_WSML & "<type name='SalesRanks' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_SalesRanks'/>"
    str_WSML = str_WSML & "</types>"
    str_WSML = str_WSML & "</service>"
    str_WSML = str_WSML & "</servicemapping>"
  • XML Web サービスで公開されている Web メソッドごとに、 XML Web サービスのクラス ファイル内に Public 関数を 1 つ作成します。 関数名は、常に wsm_ で始まり、 その後に Web メソッド名と対応する入出力パラメータが続きます (パラメータは SOAP を使用して送受信されるので、 Web Service References Tool 2.0 は SOAP のデータ型を VBA の単純データ型に変換する必要があります)。 SalesRankNPrice XML Web サービスの GetAll Web メソッドの場合、 対応する関数は wsm_GetAll という名前になります。

プロキシ クラス コードの調査

Web Service References Tool 2.0 が、 SalesRankNPrice XML Web サービスに対して生成したプロキシ クラスのコードについて詳しく見ていきましょう。

WSDL ファイルへの参照を設定すると、 ツールは以下にリストするコードを含むクラス モジュール clsws_SalesRankNPrice を作成します。 最初のセクションは、このコードの作成過程を説明するコメントです。 後続のセクションでは、このクラスを宣言したり、このクラスのインスタンスを作成したりする方法に関する指示が提供されています。

'*****************************************************************
'このクラスは、Web Service References Tool 2.0 によって作成されました。
'
'作成日 : 7/17/2002 05:17:54 PM
'
'説明 :
'このクラスは、Web サービスの
'VBA クラスで、 http://www.perfectxml.net/WebServices/SalesRankNPrice/BookService.asmx?wsdl で定義されています。
'
'使用法 :
'clsws_SalesRankNPrice を参照する変数を定義し、
'クラスのメソッドを使用するためのコードを記述します。
'例 :
' Dim ExampleVar as New clsws_SalesRankNPrice
' debug.print ExampleVar.wsm_GetAmazonSalesRank("Sample Input")
'
'詳細については、Web Service References Tool 2.0 ヘルプにある、
'「複合型」を参照してください。
'
'このクラス内のコードを変更する場合は、コードの内容を十分理解した上で行ってください。
'
'*****************************************************************

次に、内部クラス変数が宣言されます。 これらの変数は、 それぞれ SoapClient30 オブジェクトと XML Web サービスの WSDL ファイルへの URL を表します。 SoapClient30 オブジェクトは、 常に sc_ で始まり、 その後に XML Web サービス名が続きます。 定数 c_WSDL_URL は、 クラス ファイルに関係なく常に同じ名前を保持します。

...
'プライベート変数を定義します。
Private sc_SalesRankNPrice As SoapClient30
Private Const c_WSDL_URL As String = "http://www.perfectxml.net/WebServices/SalesRankNPrice/BookService.asmx?wsdl"
...

その後、別の変数が宣言されます。 これらの変数は、それぞれサービス名、SOAP 要求を受け取るポート、および XML Web サービスの名前空間を表します。

...
Private Const c_SERVICE As String = "SalesRankNPrice"
Private Const c_PORT As String = "SalesRankNPriceSoap"
Private Const c_SERVICE_NAMESPACE As String = "http://www.PerfectXML.com/NETWebSvcs/BookService"
...

Class_Initialize イベント プロシージャは、 まず連結した String 変数を宣言します。 この変数は、XML Web サービスの All 複合データ型 (GetAll Web メソッドで使用されます) を、 ファイル struct_Allstr_WSML として定義されているプロキシ構造体にマップします。

Private Sub Class_Initialize()
    '*****************************************************************
    'クラスがインスタンス化されるたびに、このサブルーチンが呼び出されます。
    '変数 sc_ComplexTypes に SoapClient30 を割り当てます。
    'http://www.perfectxml.net/WebServices/SalesRankNPrice/BookService.asmx?wsdl にある WSDL ファイルで
    'sc_ComplexTypes.mssoapinit2 を初期化します。
    '*****************************************************************

    Dim str_WSML As String
    str_WSML = "<servicemapping>"
    str_WSML = str_WSML & "<service name='SalesRankNPrice'>"
    str_WSML = str_WSML & "<using PROGID='MSSOAP.GenericCustomTypeMapper30' cachable='0' ID='GCTM'/>"
    str_WSML = str_WSML & "<types>"
    str_WSML = str_WSML & "<type name='All' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_All'/>"
    str_WSML = str_WSML & "<type name='Prices' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_Prices'/>"
    str_WSML = str_WSML & "<type name='SalesRankNPrice1' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_SalesRankNPrice1'/>"
    str_WSML = str_WSML & "<type name='SalesRanks' targetNamespace='http://www.PerfectXML.com/NETWebSvcs/BookService' uses='GCTM' targetClassName='struct_SalesRanks'/>"
    str_WSML = str_WSML & "</types>"
    str_WSML = str_WSML & "</service>"
    str_WSML = str_WSML & "</servicemapping>"

    Set sc_SalesRankNPrice = New SoapClient30

    sc_SalesRankNPrice.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
    'ProxyServer を <CURRENT_USER> に設定し、Internet Explorer の LAN 設定で定義されている
    'プロキシ サーバーを使用します。
    sc_SalesRankNPrice.ConnectorProperty("ProxyServer") = "<CURRENT_USER>"
    'Internet Explorer が自動検出に設定されている場合、EnableAutoProxy を True に設定して、
    'プロキシ設定を自動検出するようにします。
    sc_SalesRankNPrice.ConnectorProperty("EnableAutoProxy") = True

    Set sc_SalesRankNPrice.ClientProperty("GCTMObjectFactory") = New clsof_Factory_SalesRankNPri

End Sub

All 複合データ型は、 SalesRankNPrice XML Web サービスの WSDL ファイルで次のコードを使用して定義されています。

...
<s:element name="GetAll">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ISBN" type="s:string" /> 
        </s:sequence>
    </s:complexType>
</s:element>
<s:element name="GetAllResponse">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetAllResult" type="s0:All" /> 
        </s:sequence>
    </s:complexType>
</s:element>
<s:complexType name="All">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="AmazonSalesRank" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" name="AmazonPrice" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" name="BNSalesRank" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" name="BNPrice" type="s:string" /> 
    </s:sequence>
</s:complexType>
...

次に Class_Initialize イベント プロシージャは、 SoapClient30 プロキシ オブジェクトの MSSoapInit2 メソッドを使用して、 sc_SalesRankNPrice オブジェクトのインスタンスを作成します。 その後、SoapClient30 オブジェクトの ClientProperty メソッドを使用して、 clsof_Factory_SalesRankNPri クラスの新しいインスタンスが作成されます。

Class_Terminate イベントは不要なリソースをクリーン アップするのに使用されます。 この場合、具体的には SoapClient30 プロキシ オブジェクトがクリーン アップされます。

Private Sub Class_Terminate()
    '*****************************************************************
    'クラスが消滅するたびに、このサブルーチンが呼び出されます。
    '変数 sc_ComplexTypes を Nothing に設定します。
    '*****************************************************************

    'エラー処理
    On Error GoTo Class_TerminateTrap

    Set sc_SalesRankNPrice = Nothing

Exit Sub

Class_TerminateTrap:
    SalesRankNPriceErrorHandler ("Class_Terminate")
End Sub

SalesRankNPriceErrorHandler サブルーチンは、 XML Web サービスをホストしている Web サーバーで発生したエラーを処理するのに使用されます。 このサブルーチン名は、常に XML Web サービス名で始まり、 その後にテキスト ErrorHandler が続きます。

Private Sub SalesRankNPriceErrorHandler(str_Function As String)
    '*****************************************************************
    'このサブルーチンは、クラス エラー処理ルーチンです。
    'サブルーチン、または関数でエラーが発生したときに呼び出されます。
    'エラーが発生したサブルーチン名、または関数名とエラー内容を返します。
    '*****************************************************************

    'SOAP エラー
    If sc_SalesRankNPrice.FaultCode <> "" Then
        Err.Raise vbObjectError, str_Function, sc_SalesRankNPrice.FaultString
    'SOAP 以外のエラー
    Else
        Err.Raise Err.Number, str_Function, Err.Description
    End If

End Sub

最後に、XML Web サービスのメソッドに対応するプロキシ メソッドが生成されます。 [Web Service References] ダイアログ ボックスで SalesRankNPrice XML Web サービスを選択すると、 このサービスで利用できるすべてのメソッドが取得されます。 このセクションでは、 複合データ型を使用する GetAll Web メソッドについてのみ説明します。 Web Service References Tool 2.0 によって作成される Web メソッドのシグネチャには次の特徴があることに注意してください。

  • 常に Public Function として宣言されます。
  • 常にテキスト wsm_ で始まり、 その後に Web メソッド名が続きます。
  • データ型で始まり、 その後に Web メソッドのパラメータが続く形式で入力パラメータを一覧します。

以下に生成されたコードを示します。

Public Function wsm_GetAmazonSalesRank(ByVal str_ISBN As String) As String
    '*****************************************************************
    'http://www.perfectxml.net/WebServices/SalesRankNPrice/BookService.asmx?wsdl から作成されたプロキシ関数です。
    '*****************************************************************

    'エラー処理
    On Error GoTo wsm_GetAmazonSalesRankTrap

    wsm_GetAmazonSalesRank = sc_SalesRankNPrice.GetAmazonSalesRank(str_ISBN)

Exit Function
wsm_GetAmazonSalesRankTrap:
    SalesRankNPriceErrorHandler "wsm_GetAmazonSalesRank"
End Function

SalesRankNPrice プロキシ クラスの wsm_GetAll メソッドは、 String ISBN を指定して呼び出されます。 次に、sc_SalesRankNPrice オブジェクトが、 XML Web サービスの GetAll Web メソッドを呼び出します。 XML Web サービスからの結果は、 クラス ファイルで定義されたように struct_All 構造体として呼び出し側メソッドに返されます。

ユーザー定義の All 複合データ型

Web Service References Tool 2.0 は、 SalesRankNPrice XML Web サービスに対して複合データ型オブジェクト ファクトリ クラス clsof_Factory_SalesRankNPrice クラスを作成します。 このクラスは、型マッパーを使用してクライアント上のユーザー定義型を Web サーバー上の対応する COM オブジェクトにマップします。 ユーザー定義型は、 IXMLDOMNode インターフェイスを使用して XML Web サービスから XML ドキュメントとして返されます。 clsof_Factory_SalesRankNPrice クラスには、以下のコードが含まれます。

'*****************************************************************
'このクラスは、Web Service References Tool 2.0 によって作成されました。
'
'作成日 : 7/17/2002 05:17:54 PM
'
'説明 :
'ジェネリック タイプ マッパーは、ほとんどのユーザー COM オブジェクトをマッピングできる
'(XML?へのシリアル化と XML へのシリアル化の解除) SOAP Toolkit カスタム タイプ マッパーの実装です。
'詳細については、Web Service References Tool 2.0 ヘルプの「オブジェクト ファクトリ」を
'参照してください。
'
'このクラス内のコードを変更する場合は、コードの内容を十分理解した上で行ってください。
'
'*****************************************************************

Implements IGCTMObjectFactory

Private Function IGCTMObjectFactory_CreateObject(ByVal par_WSMLNode As MSXML2.IXMLDOMNode) As Object
    Dim node As IXMLDOMNode

    On Error GoTo IGCTMObjectFactoryTrap

    Set node = par_WSMLNode.Attributes.getNamedItem("targetClassName")

    Set IGCTMObjectFactory_CreateObject = Nothing

    If Not (node Is Nothing) Then
        Select Case node.nodeValue
            Case "struct_All"
                Set IGCTMObjectFactory_CreateObject = New struct_All
            Case "struct_Prices"
                Set IGCTMObjectFactory_CreateObject = New struct_Prices
            Case "struct_SalesRankNPrice1"
                Set IGCTMObjectFactory_CreateObject = New struct_SalesRankNPrice1
            Case "struct_SalesRanks"
                Set IGCTMObjectFactory_CreateObject = New struct_SalesRanks
        End Select
    End If

Exit Function

IGCTMObjectFactoryTrap:
    Err.Raise Err.Number, "clsof_Factory_SalesRankNPri", Err.Description
End Function

struct_All クラスにはユーザー定義型をマップするコードが含まれているだけでなく、 SalesRankNPrice XML Web サービスで利用できる別のユーザー定義型のコードも含まれています。

struct_All クラス ファイルは、ユーザー定義型の構造体を含む次のコードを含んでいます。

...
'*****************************************************************
'このクラスは、Web Service References Tool 2.0 によって作成されました。
'
'作成日 : 7/17/2002 05:17:54 PM
'
'説明 :
'このクラスは、ユーザー定義型の VBA クラスで、
'http://www.perfectxml.net/WebServices/SalesRankNPrice/BookService.asmx?wsdl で定義されています。
'
'このクラスは、WSDL で定義された、
'All のみを含みます。
'
'このクラス内のコードを変更する場合は、コードの内容を十分理解した上で行ってください。
'
'*****************************************************************

Public AmazonSalesRank As String
Public AmazonPrice As String
Public BNSalesRank As String
Public BNPrice As String
...

おわかりいただけるように、 このユーザー定義型はある書籍の Amazon と Barnes & Noble での売り上げランキングと価格を格納するのに使用される 4 つの String 値で構成されています。

SalesRankNPrice XML Web サービスの呼び出し

この後行うべきことは、 GetAll Web メソッドをテストするサブルーチンを作成することだけです。 SOAP 3.0 DLL が SoapClient30 オブジェクトを提供し、 Web Service References Tool 2.0 がオブジェクトのインスタンス作成に関するすべての詳細部分およびデータを含む SOAP メッセージの送受信を処理するので、 SalesRankNPrice XML Web サービスを使用するのに必要な作業はほとんどありません。 次のコードを見てみましょう。

Private Sub TestGetAllMethod()
    Dim ComplexTypes As New clsws_SalesRankNPrice
    Dim TestOutput As New struct_All
    Dim strISBN As String
        
    strISBN = "0735612420"
        
    ' XML Web サービスを呼び出します。
    Set TestOutput = ComplexTypes.wsm_GetAll(strISBN)
        
    MsgBox "Amazon ranks the book at " & TestOutput.AmazonSalesRank & _
        " and charges " & TestOutput.AmazonPrice & ". " & _
        "Barnes & Noble ranks the book at " & TestOutput.BNSalesRank & _
        " and charges " & TestOutput.BNPrice & "."
End Sub

まず、XML Web サービスからの結果を保持するための SoapClient30 オブジェクトを表すオブジェクトと、 struct_All ユーザー定義型を表すオブジェクトを宣言します。 その後、strISBN String 変数に ISBN を設定後、 wsm_GetAll プロキシ メソッドを呼び出して、 結果を代入します。 次に結果を表示します。 図 2 に示している結果が表示されます。

Aa140321.odc_cmplxtypes02(ja-jp,office.10).gif
図 2. GetAll メソッドの結果。


Web Service References Tool 2.0 でユーザー定義型を含む XML Web サービスを使用することは簡単であることがおわかりいただけたと思うので、 今度は単純データ型の使用について簡単に見てみましょう。

単純データ型の使用

単純データ型の使用を例示するために、 SaleRankNPrice XML Web サービスの GetBNPrice Web メソッドを使用します。 このメソッドは ISBN String 値を受け取り、 指定された書籍の BarnesAndNoble.com Price (US ドル) を String 値として返します。

All 複合データ型は、 WSDL ファイルで次のコードを使用して定義されています。

...
<s:element name="GetBNPrice">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="ISBN" type="s:string" /> 
        </s:sequence>
    </s:complexType>
</s:element>
<s:element name="GetBNPriceResponse">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetBNPriceResult" type="s:string" /> 
        </s:sequence>
    </s:complexType>
</s:element>
...

Web Service References Tool 2.0 は、次のプロキシ関数を作成してこのメソッドを呼び出します。

Public Function wsm_GetBNPrice(ByVal str_ISBN As String) As String
    '*****************************************************************
    'http://www.perfectxml.net/WebServices/SalesRankNPrice/BookService.asmx?wsdl から作成されたプロキシ関数です。
    '*****************************************************************

    'エラー処理
    On Error GoTo wsm_GetBNPriceTrap

    wsm_GetBNPrice = sc_SalesRankNPrice.GetBNPrice(str_ISBN)

Exit Function
wsm_GetBNPriceTrap:
    SalesRankNPriceErrorHandler "wsm_GetBNPrice"
End Function

この関数は str_ISBN パラメータを使用して、 sc_SalesRankNPrice オブジェクトの GetBNPrice Web メソッドを呼び出し、 価格を String 値として返します。 このメソッドのテストを行うには、次のコードを使用します。

Sub TestGetBNPriceMethod()
    Dim ComplexTypes As New clsws_SalesRankNPrice
    Dim strISBN As String
    Dim strPrice As String
    
    strISBN = "0735612420"
    
    strPrice = ComplexTypes.wsm_GetBNPrice(strISBN)

    MsgBox "The returned price is " & strPrice
    
End Sub

図 3 に示した結果を返します。

Aa140321.odc_cmplxtypes03(ja-jp,office.10).gif
図 3. GetBNPrice メソッドの結果。

このプロシージャでは、 まず clsws_SalesRankNPrice プロキシ クラスを表す変数を宣言します。 その後、サンプルの ISBN 値を strISBN String 変数に代入します。 次に、wsm_GetBNPrice プロキシ メソッドを呼び出し、 XML Web サービスからの結果を strPrice 変数に代入します。 最後に、結果を表示するダイアログ ボックスを表示します。

この例からおわかりいただけるように、 Web Service References Tool 2.0 が大部分の作業を行うので、 単純データ型を含む XML Web サービスを使用することは、 複合データ型を含む XML Web サービスを使用する場合よりもさらに簡単になります。

今度は、データを XML ノードのリストとして返す XML Web サービスについて見てみましょう。

複合データ型としての XML の使用

以下の例では、 Zip Code Resolver XML Web サービスを使用します。 このサービスに有効な番地、市、州を指定すると、 適切な Zip Code、Zip Code + 4、または USPS 調整後の住所を返します。 このサービスは CorrectedAddressXML メソッドを含めて 5 つのメソッドを公開します。 CorrectedAddressXML メソッドは引数として 4 つの String 値を受け取ります。

  • accessCode - テストの目的で "0" または "9999" を使用します。
  • address - 番地 (例、"One Microsoft Way")。
  • city - 都市名 (例、"Redmond")。
  • state - 2 文字の州の郵便用省略形 (例、"WA")。

このメソッドは、 以下のような XML 要素を保持する SOAP 複合データ型として USPS の住所を返します。

<Street>1 MICROSOFT WAY</Street> 
<City>REDMOND</City> 
<State>WA</State> 
<ShortZIP>98052</ShortZIP> 
<FullZIP>98052-8300</FullZIP>

以下のコードは、 Web Service References Tool 2.0 が生成するコードを使って、 SOAP 要求を構築し、 CorrectedAddressXML メソッドを呼び出し、 MSXML XML 4.0 パーサーを使用して SOAP 応答を解析します。

注意    MSXML XML 4.0 パーサーは Office XP Web Services Toolkit 2.0 と SOAP Toolkit 3.0 に含まれています。

Zip Code Resolver XML Web サービスへの参照を設定後、 Web Service References Tool 2.0 は以下のファイルを作成します。

  • clsof_Factory_ZipCodeResolver struct_USPSAddress ファイル内の構造体を、 Web サーバーの COM オブジェクト内のメソッドにマップするコードを保持します。
  • struct_USPSAddress streetcitystateshortzip、 および fullzip 変数を持つ USPSADDRESS 構造体を保持します。
  • clsws_ZipCodeResolver ZIP Code Resolver XML Web サービス メソッドをカプセル化するコードを保持します。

clws_ZipCodeResolver クラス モジュールに生成されたコードを簡単に見ていきましょう。

...
Private sc_ZipCodeResolver As SoapClient30
Private Const c_WSDL_URL As String = "http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx?WSDL"
...

以前の例と同様に、 SoapClient30 プロキシ オブジェクトと、 XML Web サービスの WSDL ファイルへの URL を表す 2 つの変数が宣言されています。

...
Private Const c_SERVICE As String = "ZipCodeResolver"
Private Const c_PORT As String = "ZipCodeResolverSoap"
Private Const c_SERVICE_NAMESPACE As String = "http://webservices.eraserver.net/"
...

次に、サービスの名前、SOAP 要求を受け取るポート、 および XML Web サービス名前空間をそれぞれ表すその他の変数が宣言されます。

Private Sub Class_Initialize()
    '*****************************************************************
    'クラスがインスタンス化されるたびに、このサブルーチンが呼び出されます。
    '変数 sc_ComplexTypes に SoapClient30 を割り当てます。
    'http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx?WSDL にある WSDL ファイルで
    'sc_ComplexTypes.mssoapinit2 を初期化します。
    '*****************************************************************

    Dim str_WSML As String
    str_WSML = ""
    str_WSML = str_WSML & ""
    str_WSML = str_WSML & ""
    str_WSML = str_WSML & ""
    str_WSML = str_WSML & ""
    str_WSML = str_WSML & ""
    str_WSML = str_WSML & ""
    str_WSML = str_WSML & ""

    Set sc_ZipCodeResolver = New SoapClient30

    sc_ZipCodeResolver.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
    'ProxyServer を  に設定し、Internet Explorer の LAN 設定で定義されている
    'プロキシ サーバーを使用します。
    sc_ZipCodeResolver.ConnectorProperty("ProxyServer") = ""
    'Internet Explorer が自動検出に設定されている場合、EnableAutoProxy を True に設定して、
    'プロキシ設定を自動検出するようにします。
    sc_ZipCodeResolver.ConnectorProperty("EnableAutoProxy") = True

    Set sc_ZipCodeResolver.ClientProperty("GCTMObjectFactory") = New clsof_Factory_ZipCodeResolv

End Sub

Private Sub Class_Terminate()
    '*****************************************************************
    'クラスが消滅するたびに、このサブルーチンが呼び出されます。
    '変数 sc_ComplexTypes を Nothing に設定します。
    '*****************************************************************

    'エラー処理
    On Error GoTo Class_TerminateTrap

    Set sc_ZipCodeResolver = Nothing

Exit Sub

Class_TerminateTrap:
    ZipCodeResolverErrorHandler ("Class_Terminate")
End Sub

Private Sub ZipCodeResolverErrorHandler(str_Function As String)
    '*****************************************************************
    'このサブルーチンは、クラス エラー処理ルーチンです。
    'サブルーチン、または関数でエラーが発生したときに呼び出されます。
    'エラーが発生したサブルーチン名、または関数名とエラー内容を返します。
    '*****************************************************************

    'SOAP エラー
    If sc_ZipCodeResolver.FaultCode <> "" Then
        Err.Raise vbObjectError, str_Function, sc_ZipCodeResolver.FaultString
    'SOAP 以外のエラー
    Else
        Err.Raise Err.Number, str_Function, Err.Description
    End If

End Sub

Class_Initialize イベント プロシージャでは、 連結した String 変数を宣言して、 Web サーバー上の XML Web サービスの USPSAddress 構造体を、 struct_USPSAddress クラス ファイルで定義されたプロキシ構造体にマップします。 その後、SoapClient30 プロキシ オブジェクトのインスタンスを作成し、 クライアントと Web サーバー間の Web サービス呼び出しに渡します。 Class_Terminate イベントと ZipCodeResolverErrorHandler サブルーチンは、 以前の例で説明したのと同じ機能を実行します。

Public Function wsm_CorrectedAddressHtml(ByVal str_accessCode As String, ByVal str_address As String, ByVal str_city As String, ByVal str_state As String) As String
    '*****************************************************************
    'http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx?WSDL から作成されたプロキシ関数です。
    '*****************************************************************

    'エラー処理
    On Error GoTo wsm_CorrectedAddressHtmlTrap

    wsm_CorrectedAddressHtml = sc_ZipCodeResolver.CorrectedAddressHtml(str_accessCode, str_address, str_city, str_state)

Exit Function
wsm_CorrectedAddressHtmlTrap:
    ZipCodeResolverErrorHandler "wsm_CorrectedAddressHtml"
End Function

wsm_CorrectedAddressXml プロシージャは、 アクセス コード、番地、市、および州を表す 4 つの String 値を受け取ります。 プロシージャはその後 sc_ZipCodeResolver オブジェクトの CorrectedAddressXml メソッドを呼び出します。 最後に、呼び出し側のプロシージャに struct_USPSAddress 構造体として結果を返します。

struct_USPSAddress クラス ファイルは以下のコードを保持しています。

...
'*****************************************************************
'このクラスは、Web Service References Tool 2.0 によって作成されました。
'
'作成日 : 7/17/2002 05:54:00 PM
'
'説明 :
'このクラスは、ユーザー定義型の VBA クラスで、
'http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.asmx?WSDL で定義されています。
'
'このクラスは、WSDL で定義された、
'USPSAddress のみを含みます。
'
'このクラス内のコードを変更する場合は、コードの内容を十分理解した上で行ってください。
'
'*****************************************************************

Public Street As String
Public City As String
Public State As String
Public ShortZIP As String
Public FullZIP As String
...

Web Service References Tool 2.0 は、 以下のように返された複合データ型を表すオブジェクト ファクトリ クラスも作成します。

...
'*****************************************************************
'このクラスは、Web Service References Tool 2.0 によって作成されました。
'
'作成日 : 7/17/2002 05:54:00 PM
'
'説明 :
'ジェネリック タイプ マッパーは、ほとんどのユーザー COM オブジェクトをマッピングできる
'(XML?へのシリアル化と XML へのシリアル化の解除) SOAP Toolkit カスタム タイプ マッパーの実装です。
'詳細については、Web Service References Tool 2.0 ヘルプの「オブジェクト ファクトリ」を
'参照してください。
'
'このクラス内のコードを変更する場合は、コードの内容を十分理解した上で行ってください。
'
'*****************************************************************

Implements IGCTMObjectFactory

Private Function IGCTMObjectFactory_CreateObject(ByVal par_WSMLNode As MSXML2.IXMLDOMNode) As Object
    Dim node As IXMLDOMNode

    On Error GoTo IGCTMObjectFactoryTrap

    Set node = par_WSMLNode.Attributes.getNamedItem("targetClassName")

    Set IGCTMObjectFactory_CreateObject = Nothing

    If Not (node Is Nothing) Then
        Select Case node.nodeValue
            Case "struct_USPSAddress"
                Set IGCTMObjectFactory_CreateObject = New struct_USPSAddress
        End Select
    End If

Exit Function

IGCTMObjectFactoryTrap:
    Err.Raise Err.Number, "clsof_Factory_ZipCodeResolv", Err.Description
End Function
...

以下のコードを使用して、 Zip Code Resolver XML Web サービスの CorrectedAddressXml Web メソッドをテストできます。

Public Sub GetAddressedAsXML()
    Dim objResolver As clsws_ZipCodeResolver
    Dim objNewAddr As struct_USPSAddress
    Dim str_accessCode As String
    Dim str_address As String
    Dim str_city As String
    Dim str_state As String
    Const TEST_ACCESS_CODE = "9999"
           
    ' 入力文字列を設定します。
    str_accessCode = TEST_ACCESS_CODE
    str_address = "One Microsoft Way"
    str_city = "Redmond"
    str_state = "WA"
    
    Set objResolver = New clsws_ZipCodeResolver
    Set objNewAddr = New struct_USPSAddress
    
    Set objNewAddr = objResolver.wsm_CorrectedAddressXml(str_accessCode, str_address, str_city, str_state)

    MsgBox "Street: " & objNewAddr.Street & vbCrLf & _
        " City: " & objNewAddr.City & vbCrLf & _
        " State: " & objNewAddr.State & vbCrLf & _
        " ShortZIP: " & objNewAddr.ShortZIP & vbCrLf & _
        " FullZIP: " & objNewAddr.FullZIP

End Sub

このコードの詳細部分は、 SaleRankNPrice XML Web サービスで使用したプロシージャに似ています。 結果は、図 4 のように表示されます。

Aa140321.odc_cmplxtypes04(ja-jp,office.10).gif
図 4. ISBN 0735612420 の検索結果

では、次に Web Service References Tool 2.0 でのその他の複合データ型の使用について見てみましょう。

複合データ型としての配列の使用

配列は、同じデータ型の複数の値を同時に保持できる構造体です。 配列は、配列内のすべての要素と同じデータ型指定を持ちます。 たとえば、Visual Basic で String 型の配列として配列を宣言することは、 配列に含まれるすべての要素が String 型になることを意味します。

...
Dim arArray(4) As String
...

上記のステートメントは、 arArray(0) から arArray(3) までの範囲の 4 つの String 要素を持つ arArray という名前の配列を宣言しています。

XML Web サービスの観点からは、 配列は複数の値を表す要素を保持するので、 複合データ型と考えられます。

Web Service References Tool 2.0 により、 配列を利用する XML Web サービスを使用することが、 これまで説明してきた他のすべての構造体よりも困難になることはありません。 たとえば、SortArray Web メソッドを持つ ArraysSample XML Web サービスにアクセスすることを考えてみましょう。 この SortArray Web メソッドは、 名前の配列を受け取り、名前を逆アルファベット順に並べ替えた要素を持つ配列を返します。 Web サーバーでのこのメソッドのプロシージャ宣言は以下のようになります。

<WebMethod>
Private Function SortArray(ByVal arUnsortedArray As String) As String

XML Web サービスの WSDL ファイルへの参照を設定後、 Web Service References Tool 2.0 は対応するメソッドを以下のように作成します。

Public Function wsm_SortArray(ByVal arUnsortedArray As Variant) As Variant
    '*****************************************************************
    'http://SortArraysSample.asmx?wsdl から作成されたプロキシ関数です。
    '
    '" arUnsortedArray " は String として定義された要素を持つ配列です。
    '配列の実装の詳細については、Web Service References Tool 2.0 ヘルプの
    '「Complex Type: Arrays」を参照してください。
    '*****************************************************************

    'エラー トラップ
    On Error GoTo wsm_ SortArray Trap

    wsm_SortArray = sc_ComplexTypes.SortArray(ar_SortArray)

Exit Function
wsm_SortArray Trap:
    ComplexTypesErrorHandler "wsm_SortArray "

End Function

並べ替えられていない配列と返される配列は共に Variant データ型として宣言されていることに注目してください。 Web Service References Tool 2.0 は、配列や配列パラメータを常に Variant データ型として定義します。 受け取った構造体のデータ型が期待するデータ型と異なるときは、 受け取り側のプロシージャは通常 (常にではありません)、 受け取ったデータ型を期待するデータ型に強制的に (変換) しようとします。 この場合、配列は String データ型の要素を保持するので、 強制変換は成功しそうです。 しかし、適切なプログラミング慣習は、 常にできる限り入力引数と出力引数のデータ型を一致させようとすることです。 残念ながら、Web Service References Tool 2.0 は Variant データ型として宣言された配列だけを使用します。

以下のコードを使用して、配列を ArraysSample XML Web サービスに送信できます。

Sub sort_array()
    Dim objSort As New clsws_ComplexTypes
    Dim x(4) As String
    Dim z As Variant
    Dim idx As Integer
    
        x(0) = "Cat"
        x(1) = "Dog"
        x(2) = "Baseball"
        x(3) = "Apple"
    
    z = ExampleVar.wsm_SortArray(x)
    
    For idx = 0 To 3
        Debug.Print z(idx)
    Next idx

End Sub

このコードの実行後には、 Web Service References Tool 2.0 をホストするアプリケーションのイミディエイト ウィンドウに以下の結果が表示されるでしょう。

Apple
Baseball
Cat
Dog

では、次に複合データ型としての列挙型を見てみましょう。

複合データ型としての列挙値の使用

アプリケーションを開発しているときに、 あるプロパティやメソッド用に一連の定数を定義する必要が生じることがよくあります。 列挙型はコードの利便性を向上します。 たとえば、曜日に序数値を使用するカレンダー アプリケーションを開発しているとしましょう。 以下の列挙型の定義は、 これらの値をユーザーに馴染みやすい方法で表現する手段を提供します。

...
Public Enum DaysOfWeek
    Sunday = 1
    Monday = 2
    Tuesday = 3
    Wednesday = 4
    Thursday = 5
    Friday = 6
    Saturday = 7
End Enum
...

列挙型 DaysOfWeek を使用するために、 ステートメント FirstDayofWeek = Sunday を使用できます。 これは、ステートメント FirstDayofWeek = 1 を使用するよりもはるかに便利です。 ご想像通り、 XML Web サービスを使用しているときは、 列挙型も複合データ型と考えられます。

Web Service References Tool 2.0 は、 String 型として XML Web サービスに送信する列挙値を定義します。 XML Web サービスから受け取る列挙値は XML データとして定義され、 MSXML2.IXMLDOMSelection インターフェイスを使用します。

列挙型を XML Web サービスに送信するのは簡単です。

Private Sub SendEnum()
    Dim SampleWebService As New clsws_SampleWebService
    Debug.Print SampleWebService.wsm_SendEnum("Sunday")
End Sub

このプロシージャでは、 XML Web サービス クラスのインスタンスとして SampleWebService 変数を宣言します。 その後、列挙データを XML Web サービス プロキシ メソッドに渡します。

列挙型を返すには、さらに少しコードが必要になります。

Private Sub ReceiveEnum()
    Dim SampleWebService As New clsws_SampleWebService
    Dim x As MSXML2.IXMLDOMSelection

    Set x = SampleWebService.wsm_ReturnEnum
    Debug.Print x.Content.nodeTypedValue
End Sub

このプロシージャでは、 XML Web サービス クラスのインスタンスとして SampleWebService 変数を宣言します。 その後、MSXML2.IXMLDOMSelection として変数を宣言します。 次に、MSXML2.IXMLDOMSelection 変数に XML Web サービスの戻り値を設定し、 結果を表示します。

まとめ

この資料では、 SOAP 3.0 DLL と Web Services References Tool 2.0 を使って、 XML Web サービスで単純データ型と複合データ型を使用する方法を例示しました。 この資料で説明した技法やツールを使って、 開発中の XML Web サービスを使用するアプリケーションの効果を上げることができます。

Page view tracker