特集

InfoPathの衝撃
- マイクロソフトの新しい戦略Officeスイート「InfoPath」によって、XML技術は新時代を迎える -

吉松史彰
2003/03/26


衝撃 3: XML Webサービスとの連携

 InfoPathは一言でいうと、Microsoft製のXMLエディタである。ユーザーの入力内容を、主にXML 1.0形式で保存することができる。ただし、保存する先はハードディスクだけに限定されてはいない。InfoPathには、XML Webサービスのサポートがデフォルトで組み込まれている。作成したXML文書をそのまま、例えばASP.NETで作成したXML Webサービスに「保存」することができるわけだ。

 InfoPathは、XML WebサービスをXMLで表現されたメッセージの送受信と見なしている。つまり、従来よくいわれていたようなJavaやC#によるメソッド呼び出しのXML化ではなく、XMLで作成したメッセージをほかのサービスに送信し、返されるメッセージを受信する仕組みとしてのXML Webサービスの利用法を提供している。上述したように、XMLをファイルとしてハードディスクに保存する代わりに、XMLをメッセージとしてXML Webサービスに「保存」するわけだ。

 InfoPathとXML Webサービスの連携をここで試してみよう。XML Webサービスの作成自体はInfoPathとは関係ないので、ここでは簡単に済ませる。IISが稼働しているマシンに.NET Frameworkがインストールされているものと仮定して、まずは冒頭で利用したXSD文書(ファイル名は「交通費.xsd」とする)を、.NET Framework SDKまたはVisual Studio .NETに付属のxsd.exeを使って、次のようにVisual Basic .NETのクラスに変換する。すると、「交通費.vb」というファイルが作成される。

C:\TEMP>xsd.exe /classes 交通費.xsd /language:VB

 作成された交通費.vbファイルを開いて、次のImports文とクラス定義を適切な場所に挿入する。

Imports System.Web.Services
Imports System
Imports System.IO
Imports System.Text

Public Class Expense
  <WebMethod>Public Sub SetExpense(ByVal exps As 交通費清算型)
    Dim w As New StreamWriter(File.OpenWrite("C:\InetPub\wwwroot\log.txt"), Encoding.Default)
    Dim exp As 交通費型
    For Each exp In exps.交通費
      w.WriteLIne(String.Format("{0}, {1}, {2}", exp.利用日付, exp.目的, exp.金額))
    Next
    w.Close()
  End Sub
End Class
xsd.exeにより作成された「交通費.vb」に追加するコード
交通費清算型を受け取り、それに含まれる交通費データをファイルに書き出すWebサービスとなるメソッド。交通費清算型や交通費型などのクラスの定義は、XSD文書からxsd.exeにより生成される。

 さらに、ファイルの先頭に次のWebServiceディレクティブを記述する。

<%@WebService Class="Expense"%>
「交通費.vb」の先頭に追加するWebServiceディレクティブ
このディレクティブを追加し、asmxという拡張子のファイルで、IISの仮想ディレクトリに保存すれば、XML Webサービスとしてアクセスできるようになる。

 このファイルをexpense.asmxという名前で、IISの仮想ディレクトリに保存しておく。これによって、expense.asmxというXML Webサービスが作成される。このXML Webサービスは、次のようなSOAPメッセージを受信して、単に内容をファイルに保存するだけの内容になっている。メッセージとして運ばれるXMLの内容は、先ほどファイルに保存したものと同じであることが分かる。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <SetExpense xmlns="http://tempuri.org/">
      <交通費清算 xmlns="http://example.org/expense">
        <交通費>
          <利用日付>date</利用日付>
          <目的>打ち合わせ or 問題対応 or 訪問 or その他</目的>
          <その他目的>token</その他目的>
          <金額>positiveInteger</金額>
        </交通費>
        <交通費>
          <利用日付>date</利用日付>
          <目的>打ち合わせ or 問題対応 or 訪問 or その他</目的>
          <その他目的>token</その他目的>
          <金額>positiveInteger</金額>
        </交通費>
      </交通費清算>
    </SetExpense>
  </soap:Body>
</soap:Envelope>
作成したXML Webサービスが受信するSOAPメッセージの例
このメッセージの内容は、交通費入力フォームで保存したものと同じであるのが分かる。

 このようなXML Webサービスがある場合、InfoPathでは、次のようにしてフォーム上に入力されたデータをXML Webサービスに送信できる。まず、先ほど作成した交通費.xsnのテンプレートをもう1度デザイン・モードで開く。次に、[ツール]メニューから[フォームの送信]を選択する。

フォームからXML Webサービスへの保存(1/6)
前半で作成した交通費.xsnのテンプレート(フォーム)を再度デザイン・モードで開き、[ツール]メニューから[フォームの送信]を選択する。

 すると、次の[フォームの送信]ダイアログ・ボックスが表示される。ここで、[送信を許可する]を選択し、[Webサービスに送信]が選択されているのを確認して、[Webサービスの選択]をクリックする。

フォームからXML Webサービスへの保存(2/6)
[フォームの送信]ダイアログ・ボックスで[送信を許可する]を選択してから、[Webサービスの選択]をクリックすると、「Webサービス送信にウィザード」が起動する。

 すると[Webサービス送信にウィザード]が表示されるので、WebサービスへのURLを入力して、[次へ]をクリックする。

フォームからXML Webサービスへの保存(3/6)
保存先となるXML Webサービスについて記述したWSDLのURL(今回のようにASP.NETで作成したWebサービスの場合はasmxファイルへのURLでも可)を指定する。

 すると、次のように、そのWebサービスでサポートされている処理の一覧が表示される。今回はSetExpenseしかないので、これを選択して次へ進む。

フォームからXML Webサービスへの保存(4/6)
指定したWebサービスがサポートしている処理一覧が表示される。ここに表示されているSetExpenseは先ほどVisual Basic .NETで記述したメソッドである。

 SetExpenseはXMLのメッセージを受け取るので、そのXMLが入力フォームのどこからか取得できなければならない。次の画面では、XML Webサービスに渡すXMLを取得できるテンプレート中のフィールドを選択する。

フォームからXML Webサービスへの保存(5/6)
XML Webサービスに送信するXMLデータを取得できるテンプレート中のフィールド(フォームの要素)を設定する。

 ここでは単純に交通費清算全体を選択すれば、要求どおりのメッセージが作成できる。さらに次へ進んで[完了]をクリックすれば、設定は終了だ。最後に[ファイルメニューで[送信]の表示を許可する]チェック・ボックスがオンになっているのを確認して、[OK]をクリックする。

フォームからXML Webサービスへの保存(6/6)
「Webサービス送信にウィザード」を完了し、[OK]をクリックすれば、XML Webサービスにデータを保存するテンプレートが完成する。

 これでXML Webサービスにデータを「保存」するテンプレートが作成できた。

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

 XML Webサービスを呼び出してデータを保存する手順はいたって簡単だ。作成したテンプレートをいったん閉じて、入力モードで再度開き、データを数件入力して、[ファイル]メニューを開く。すると、次のように[送信]というメニューが表示されるので、迷わずそれを選択すれば、それだけで入力データはXMLとしてXML Webサービスへ送られる。

XML Webサービスへのデータ保存の実行
[ファイル]メニューを開くと、追加した[送信]メニューが表示される。これを選択するだけで、データはXML Webサービスへ送信される。

 正しく処理されれば、最後にメッセージ・ボックスが表示される。これだけだ。実際には次のようなXML(SOAP)メッセージがXML Webサービスに送信される。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope
  xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema"
  xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
  <s0:SetExpense xmlns:s0="http://tempuri.org/">
    <s1:交通費清算 xmlns:s1="http://example.org/expense">
      <tns:交通費 xmlns:tns="http://example.org/expense">
        <tns:利用日付>2003-03-12</tns:利用日付>
        <tns:目的>打ち合わせ</tns:目的>
        <tns:その他目的></tns:その他目的>
        <tns:金額>120</tns:金額>
      </tns:交通費>
      <tns:交通費 xmlns:tns="http://example.org/expense">
        <tns:利用日付>2003-03-12</tns:利用日付>
        <tns:目的>その他</tns:目的>
        <tns:その他目的>いろいろ</tns:その他目的>
        <tns:金額>150</tns:金額>
      </tns:交通費>
    </s1:交通費清算>
  </s0:SetExpense>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
交通費入力フォームからXML Webサービスへ送信されるSOAPメッセージ例

 何度もいうようだが、ここまでInfoPathを使って行った作業では、一切のコードは書いていないことに注意してほしい。一切コードを記述せずに、これだけの機能を持ったクライアント・アプリケーションが作成できるということだ。

 InfoPathでは、デフォルトでは提供されていない機能をサポートするために、JScriptとVBScriptがサポートされている。また、フォームを開いたときや、データを送信するとき、整合性の検査を行うときなどにイベントが発生するので、そのイベントに対して適切なスクリプトを記述すれば、フォームに独自の操作を組み込むことも可能である。

InfoPathが示すXMLの近未来

 以上、Microsoft Officeの新しい一員となったInfoPathを紹介した。筆者がInfoPathに数日触れてみて抱いた感想は、一言でいって「もはやクライアント・アプリケーションを開発する必要はない」ということだ。InfoPathはOfficeの一員なので、Officeの操作性をそのまま踏襲している。入力時には[ファイル]メニューから[開く][保存][送信]を選択して処理ができるし、デザイン時におけるフォントの設定、コントロールの貼り付けなどもこれまでのOfficeの操作と同様なので、いわゆる開発者でなくてもすぐに覚えられるだろう。ということは、Visual BasicやC#やJavaを使って、XMLを操作するアプリケーションを開発するために、専門の開発者を雇う必要などないということだ。オフィスワーカーが、自分のその場その場のニーズに応じて、一切コードを記述せずに、ドラッグ&ドロップでクライアント・アプリケーションを作成できる時代が、InfoPathとともにやってきたのだ。

 また、InfoPathはXMLを扱っているにもかかわらず、XMLでおなじみの“<>”はおろか、タグの入力、階層構造の表現など、いわゆるXML文書を作成するための手順が一切必要ないことにも注目してほしい。InfoPathが扱っているのは、XMLが表現しているデータであって、XML 1.0で記述したデータの表現ではないのだ。XML技術は、<>やタグの処理から、DOM/SAXによるInfoSetの処理を経て、いまやXML Webサービスのようなスキーマ・ベースの抽象構造(abstraction)の処理へと進化した。InfoPathは、この世代の代表的ツールになると筆者は確信している。そして、この世代の開発者が持つべきXMLの知識も、従来のようなXML 1.0による表現方法とDOM/SAXのようなプログラミング言語に近いAPIに関する知識から、XMLスキーマやXPathやXSLTなどの、よりXMLにネイティブな機能や仕組みに関する知識へと進化していかなければならないのである。InfoPathはまさに、XML技術の世代交代を促すツールなのだ。End of Article

 

 INDEX
  [特集]InfoPathの衝撃
     1.衝撃 1: スキーマ・ベースの簡単なフォーム作成(1)
     2.衝撃 1: スキーマ・ベースの簡単なフォーム作成(2)
     3.衝撃 2: “100% Pure XML”のアウトプット
   4.衝撃 3: XML Webサービスとの連携
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH