types定義

作成するメソッドは先にも書いたように3つ。この3つのメソッドが使用するデータ型を洗い出してみると

  1. ServiceStart()メソッドの戻り値であるboolean
  2. GetItemInfoByPrice()の引数であるInteger
  3. GetItemInfo()の戻り値であるItemInfoResultオブジェクトの配列

の3種類です。このうち、ServiceStart()の戻り値booleanとGetItemInfoByPrice()の引数であるunsigned intは単純型としてXSDに組みこまれていますのでここでは定義する必要はありません。残りのGetItemInfoByPrice()戻り値のItemInfoResultオブジェクトとその配列を定義します。

ItemInfoResult型の定義

ItemInfoResult型はC言語で書くと以下のような構造体であるとします。

struct {
  string name;
  unsigned int price;
} ItemInfoResult;

複合型の定義にはxsd:complexTypeを使用します。要素として名前(name)と価格(price)を文字列・符号なし整数として内包します。また、今回のサービスでは名前・価格の出現順序は(XML上)特に規定しませんのでxsd:allを指定します。string/unsigned intはそれぞれXML Schemaで定義されていますのでそれを使用します。その他、XML Schemaで定義されている単純型はこちらを参照してください。みてのとおり、struct構文とほぼ同様のXMLとなります。

<xsd:complexType name="ItemInfoResult">
  <xsd:all>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="price"  type="xsd:unsignedInt"/>
  </xsd:all>
</xsd:complexType>

配列の定義

XML Schemaでは新しい型を定義する場合、既存の型を拡張(または制限)する形で定義します。新しい配列型を定義する場合、WSDLの規定でsoapエンコードのArray(base="soapenc:Array")を指定の型(ItemInfoResult[])で制限(xsd:restriction)します。

<xsd:complexType name="ItemInfoResultArray">
  <xsd:complexContent>
    <xsd:restriction base="soapenc:Array">
      <xsd:attribute ref="soapenc:arrayType"
        wsdl:arrayType="typens:ItemInfoResult[]"/>
    </xsd:restriction>
  </xsd:complexContent>
</xsd:complexType>

typesタグでのnamespace(名前空間)

types定義するにあたり、namespaceに関して注意すべき点があります。

  1. ルート要素はsoap encodingのnamespaceを含んでいる必要があります。
  2. ルート要素はtargetNamespace属性を指定する必要があります。

先にも書いたように、新しい配列型を定義する場合SOAP encodingを必要とするため、WSDLルートでsoap encoding名前空間を含む必要があります。この例では、

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

としてdefinitions要素の属性として宣言しています。またtype要素で指定した型は後述するWSDL定義の中で参照されるためtyes要素はtargetNamespace属性を指定しておく必要があります。

最終的に、types要素は次のようになります。

<types>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:LovemacService">
    <xsd:complexType name="ItemInfoResult">
      <xsd:all>
        <xsd:element name="name" type="xsd:string"/>
        <xsd:element name="price"  type="xsd:unsignedInt"/>
      </xsd:all>
    </xsd:complexType>
    <xsd:complexType name="ItemInfoResultArray">
      <xsd:complexContent>
        <xsd:restriction base="soapenc:Array">
          <xsd:attribute ref="soapenc:arrayType"
            wsdl:arrayType="typens:ItemInfoResult[]"/>
        </xsd:restriction>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:schema>
</types>