作成するメソッドは先にも書いたように3つ。この3つのメソッドが使用するデータ型を洗い出してみると
の3種類です。このうち、ServiceStart()の戻り値booleanとGetItemInfoByPrice()の引数であるunsigned intは単純型としてXSDに組みこまれていますのでここでは定義する必要はありません。残りのGetItemInfoByPrice()戻り値の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に関して注意すべき点があります。
先にも書いたように、新しい配列型を定義する場合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>