12.2.8 XML Schema記述時の注意事項
XML Schemaの要素を記述するときの注意事項について説明します。また,非サポート要素の代替記述についても説明します。
- 〈この項の構成〉
-
(1) maxOccurs属性を記述する場合の注意事項
-
element要素にmaxOccurs属性を指定する場合,アプリケーションではXML Schemaで指定されている値の範囲で配列を使用してください。
element要素にmaxOccursを記述した場合,生成されたソースでは,該当する要素は配列型の変数となりますが,配列の最大値は設定されません。したがって,要素の配列数はアプリケーションに依存することになります。スキーマに指定されている値より大きい配列をアプリケーションで指定すると,不正なSOAPメッセージが送信されることになります。
-
maxOccursを記述したelement要素をOUT属性およびINOUT属性にして使用することはできません。OUT属性およびINOUT属性にして使用した場合,不正なHolderクラスのソースが生成されます。
-
nonwrapped形式では,maxOccursを記述したelement要素は引数として使用できません。引数として使用した場合,配列の最初の要素しか取得できません。
(2) restriction要素を記述する場合の注意事項
-
simpleType要素の子要素として記述する場合
simpleType要素の子要素にrestriction要素を記述する場合には,base属性を指定し,その子要素にはenumeration要素だけを記述してください。この組み合わせ以外では,不正なソースが生成されます。
-
complexContent要素の子要素として記述する場合
complexContent要素の子要素にrestriction要素を記述する場合には,base属性を指定し,その属性値には"soapenc:Array"だけを指定できます。この組み合わせ以外では,不正なソースが生成されます。
(3) list要素を記述する場合の注意事項
list要素を記述する場合の注意事項を示します。
-
itemType属性を必ず指定してください。
-
子要素にsimpleType要素は記述できません。
-
list要素のitemType属性には,listデータ型は指定できません。例えば,次の例ではIntListList型は使用できません。
<simpleType name="IntList"> <list itemType="xsd:int"/> </simpleType> <simpleType name="IntListList"> <list itemType="intf:IntList"/> </simpleType>
記述できない要素および属性を記述した場合,不正なソースが生成されます。
(4) 単純型を基準型として拡張して,複合型を定義する場合の代替記述
simpleContent要素は非サポート要素です。単純型を拡張した複合型を定義するには,complexType要素を使用して記述してください。
単純型を基準型として拡張して,複合型を定義する場合の修正例を示します。
<修正前(非サポート)>
-
simpleContent要素を使用した記述
<xsd:element name="elm1"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="att1" type="xsd:int" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
-
XMLインスタンス
<elm1 att1="123">abc</elm1>
<修正後(代替記述)>
-
complexType要素を使用した記述
<xsd:element name="elm1"> <xsd:complexType> <xsd:sequence> <xsd:element name="data" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="att1" type="xsd:int"/> </xsd:complexType> </xsd:element>
-
XMLインスタンス
<elm1 att1="123"> <data>abc</data> </elm1>
(5) 単純型を使用した派生によって,制限された複合型を定義する場合の代替記述
simpleContent要素は非サポートです。complexType要素を使用して,別の型として定義してください。
単純型を使用した派生によって,制限された複合型を定義する場合の修正例を示します。
<修正前(非サポート)>
-
simpleContent要素を使用した記述
<xsd:complexType name="attDataBase" > <xsd:simpleContent > <xsd:extension base="xsd:int" > <xsd:attribute name="currency" type="xsd:string" /> <xsd:attribute name="country" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType > <xsd:element name="elm1"> <xsd:complexType> <xsd:simpleContent> <xsd:restriction base="intf:attDataBase" > <xsd:attribute name="currency" type="xsd:string" /> </xsd:restriction> </xsd:simpleContent> </xsd:complexType > </xsd:element>
-
XMLインスタンス
<elm1 currency="yen" > 1000 </elm1>
<修正後(代替記述)>
-
complexType要素を使用した記述
<xsd:element name="elm1" type="intf:attDataBase2"/> <xsd:complexType name="attDataBase1" > <xsd:sequence> <xsd:element name="price" type="xsd:int"/> </xsd:sequence> <xsd:attribute name="currency" type="xsd:string" /> <xsd:attribute name="country" type="xsd:string" /> </xsd:complexType > <xsd:complexType name="attDataBase2" > <xsd:sequence> <xsd:element name="price" type="xsd:int"/> </xsd:sequence> <xsd:attribute name="currency" type="xsd:string" /> </xsd:complexType >
-
XMLインスタンス
<elm1 currency="yen"> <price xmlns="">1000</price> </elm1>
(6) use属性の代替記述
attribute要素に指定するuse属性は非サポートです。attribute要素の出現可能性を型定義によって記述する場合には,その用途によってcomplexType要素を使用して,別の型として定義してください。
use属性を使用した記述の修正例を示します。
<修正前(非サポート)>
-
use属性を使用した記述
<xsd:complexType name="Use1"> <xsd:sequence> <xsd:element name="data1" type="intf:dataType" /> <xsd:element name="data2"> <xsd:complexType> <xsd:complexContent> <xsd:restriction base="intf:dataType"> <xsd:sequence> <xsd:element name="data" type="xsd:int"/> </xsd:sequence> <xsd:attribute name="currency" type="xsd:string" use="prohibited" /> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType > <xsd:complexType name="dataType" > <xsd:sequence> <xsd:element name="data" type="xsd:int"/> </xsd:sequence> <xsd:attribute name="currency" type="xsd:string" /> </xsd:complexType > <xsd:element name="use-1" type="intf:Use1"/>
-
XMLインスタンス
<use-1 xmlns="http://localhost"> <data1 currency="yen" xmlns="" > <data xmlns="">1000</data> </data1> <data2 xmlns="" > <data xmlns="">1000</data> </data2> </use-1>
<修正後(代替記述)>
-
complexType要素を使用した記述
<xsd:complexType name="Use1"> <xsd:sequence> <xsd:element name="data1" type="intf:dataType" /> <xsd:element name="data2" type="intf:dataType2" /> </xsd:sequence> </xsd:complexType > <xsd:complexType name="dataType" > <xsd:sequence> <xsd:element name="data" type="xsd:int"/> </xsd:sequence> <xsd:attribute name="currency" type="xsd:string" /> </xsd:complexType > <xsd:complexType name="dataType2" > <xsd:sequence> <xsd:element name="data" type="xsd:int"/> </xsd:sequence> </xsd:complexType > <xsd:element name="use-1" type="intf:Use1"/>
-
XMLインスタンス
修正前と同じです。
(7) default属性の代替記述
element要素またはattribute要素にdefault属性を指定する場合で,SOAPメッセージの送信側のアプリケーションで値を設定しないとき,default属性の属性値はSOAPメッセージに設定されません。
SOAPメッセージの受信側のアプリケーションで,該当する属性値がSOAPメッセージに設定されていない場合は,default属性の属性値に指定されている値を設定してください。
(8) fixed属性の代替記述
element要素またはattribute要素にfixed属性を指定する場合,SOAPメッセージの送信側のアプリケーションでどのような値を設定しても,fixed属性の属性値がSOAPメッセージに設定されません。
SOAPメッセージの受信側のアプリケーションで,fixed属性に指定されている値を設定してください。
(9) substitutionGroup属性の代替記述
substitutionGroup属性は非サポートです。グローバルのelement要素に非サポートであるsubstitutionGroup属性を指定することはできません。
次に示す修正例を基に,代替記述について説明します。
このスキーマのインスタンスでは,トップレベルの要素"SSG"は,子要素として,data要素を内容とする構造です。このdata要素は,dataPattern1要素,dataPattern2要素の代わりに使用できます。したがって,インスタンス2,インスタンス3も正しいXMLインスタンスとなります。Application Serverでは,substitutionGroup属性をサポートしないため,代替要素となる型(ここでは,dataPattern1要素,dataPattern2要素)を使用する場合は,別のWSDLで記述し,別のアプリケーションとする必要があります。
<修正前(非サポート)>
-
substitutionGroup属性を使用した記述
<xsd:complexType name="SSG"> <xsd:sequence> <xsd:element ref="intf:data" /> </xsd:sequence> </xsd:complexType> <xsd:element name="data" type="intf:dataType" /> <xsd:element name="dataPattern1" type="intf:dataPattern1Type" substitutionGroup="intf:data" /> <xsd:element name="dataPattern2" type="intf:dataPattern2Type" substitutionGroup="intf:data" /> <xsd:complexType name="dataType"> <xsd:sequence> <xsd:element name="pno" type="xsd:NMTOKEN" /> <xsd:element name="date" type="xsd:string" /> <xsd:element name="season" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="dataPattern1Type"> <xsd:complexContent> <xsd:extension base="intf:dataType" /> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="dataPattern2Type"> <xsd:complexContent> <xsd:extension base="intf:dataType"> <xsd:sequence> <xsd:element name="on" type="xsd:string" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="SSG" type="intf:SSG"/>
-
XMLインスタンス
インスタンス1 <SSG xmlns="http://localhost"> <data> <pno xmlns="">1967</pno> <date xmlns="">Date</date> <season xmlns="">SPRING</season> </data> </SSG> インスタンス2 <SSG xmlns="http://localhost"> <dataPattern1> <pno xmlns="">1967</pno> <date xmlns="">Date</date> <season xmlns="">SPRING</season> </dataPattern1> </SSG> インスタンス3 <SSG xmlns="http://localhost"> <dataPattern2> <pno xmlns="">1967</pno> <date xmlns="">Date</date> <season xmlns="">SPRING</season> <on xmlns="">OFF</on> </dataPattern2> </SSG>
<修正後(代替記述)>
-
インスタンスごとに記述
インスタンス1のスキーマ <xsd:complexType name="SSG"> <xsd:sequence> <xsd:element ref="intf:data" /> </xsd:sequence> </xsd:complexType> <xsd:element name="data" type="intf:dataType" /> <xsd:complexType name="dataType"> <xsd:sequence> <xsd:element name="pno" type="xsd:NMTOKEN" /> <xsd:element name="date" type="xsd:string" /> <xsd:element name="season" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="SSG" type="intf:SSG"/> インスタンス2のスキーマ <xsd:complexType name="SSG"> <xsd:sequence> <xsd:element ref="intf:dataPattern1Type" /> </xsd:sequence> </xsd:complexType> <xsd:element name="dataPattern1" type="intf:dataType" /> <xsd:complexType name="dataType"> <xsd:sequence> <xsd:element name="pno" type="xsd:NMTOKEN" /> <xsd:element name="date" type="xsd:string" /> <xsd:element name="season" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="SSG" type="intf:SSG"/> インスタンス3のスキーマ <xsd:complexType name="SSG"> <xsd:sequence> <xsd:element ref="intf:dataPattern2" /> </xsd:sequence> </xsd:complexType> <xsd:element name="dataPattern2" type="intf: dataPattern2Type" /> <xsd:complexType name="dataPattern2Type"> <xsd:sequence> <xsd:element name="pno" type="xsd:NMTOKEN" /> <xsd:element name="date" type="xsd:string" /> <xsd:element name="season" type="xsd:string" /> <xsd:element name="on" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="SSG" type="intf:SSG"/>
-
XMLインスタンス
修正前と同じです。
(10) mixed属性の代替記述
mixed属性は非サポートです。complexType要素,complexContent要素にmixed属性で実現する,内容の中に要素が入る構造は実現できません。SOAPメッセージで送信しなければならないデータを,それぞれ独立した要素となる型を作成してください。
mixed属性を使用した記述の修正例を示します。
<修正前(非サポート)>
-
mixed属性を使用した記述
<xsd:complexType name="mixed"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="address"> <xsd:complexType> <xsd:complexContent mixed="true" > <xsd:extension base="intf:addressType"> <xsd:sequence> <xsd:element name="postcode" type="xsd:int"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:complexType name="addressType" mixed="true" > <xsd:sequence> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:element name="mixed" type="intf:mixed"/>
-
XMLインスタンス
<mixed xmlns="http://localhost"> <name xmlns="" >abcdef</name> <address xmlns="" > abcde<street>XXXX51st.</street>fghijk<city>ZZZZZZ</city>lmnopqrstuvwxyz <postcode>045981</postcode> </address> </mixed>
<修正後(代替記述)>
-
独立した要素となる型を作成
<xsd:complexType name="mixed"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="address"> <xsd:complexType> <xsd:sequence> <xsd:element name="data1" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="data2" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="data3" type="xsd:string"/> <xsd:element name="postcode" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> <xsd:element name="mixed" type="intf:mixed"/>
-
XMLインスタンス
<mixed xmlns="http://localhost"> <name xmlns="" >abcdef</name> <address xmlns="" > <data1>abcde</data1> <street>XXXX51st.</street> <data2>fghijk</data2> <city>ZZZZZZ</city> <data3>lmnopqrstuvwxyz</data3> <postcode>045981</postcode> </address> </mixed>
(11) XML Schemaのビルトインデータ型使用時の注意事項
ENTITY型を指定してアプリケーションでデータを送受信できますが,ENTITY型としての機能は有効になりません。
(12) soapenc:Array型の制限に関する注意事項
WSDLのuse属性がliteralの場合,soapenc:Array型を制限した複合型を使用することはできません。配列を定義するには,代わりにmaxOccurs属性を指定した要素を子要素に持つ複合型を定義してください。
(13) wsdl:arrayType属性を記述する場合の注意事項
wsdl:arrayType属性を記述した場合の配列は,OUT属性およびINOUT属性で使用できません。
(14) ref属性,minOccurs属性,およびminOccurs属性を使用する場合の代替記述
ref属性,minOccurs属性,およびmaxOccurs属性を同じelement要素で使用した場合,不正なソースが生成されます。ref属性,minOccurs属性,およびmaxOccurs属性を同じelement要素で使用しないでください。
ref属性,minOccurs属性,およびmaxOccurs属性を使用する場合の修正例を示します。
<修正前(非サポート)>
-
ref属性,minOccurs属性,およびmaxOccurs属性を同じelement要素で使用した記述
<xsd:complexType name="getUserData"> <xsd:sequence> <xsd:element ref="intf:in0" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:element name="in0" type="xsd:string"/>
<修正後(代替記述)>
-
ref属性を使用しない記述
<xsd:complexType name="getUserData"> <xsd:sequence> <xsd:element name="in0" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType>
(15) sequence要素に指定する属性に関する注意
sequence要素の属性に,minOccurs属性およびmaxOccurs属性は使用しないでください。
minOccurs属性,maxOccurs属性のどちらか,または両方を指定した場合,WSDL2JavaのWSDL検証機能でエラーにならないで,ソースコードが生成されます。
(16) xsd:enumeration要素を使用した場合の注意
クライアントアプリケーションまたはサーバアプリケーションでは,xsd:enumeration要素を使用して列挙型として定義した値だけを指定してください。
xsd:enumeration要素を使用して定義した列挙型の値以外の値をクライアントアプリケーション,またはサーバアプリケーションで指定した場合,スキーマに違反したSOAPメッセージが送信されます。このとき,エラーになりません。
(17) xsd:string型のxsd:list型で空文字列の要素を含む配列を送信した場合の注意
RPC形態のアプリケーションの場合,itemTypeがxsd:string型のxsd:list型で,空文字列の要素を含む配列を送信すると,受信時に配列の要素から空文字が削除されます。
(18) xsd:schema要素のtargetNamespace属性に関する注意
WSDL2Javaコマンド実行時に,targetNamespace属性を省略したxsd:schema要素を記述しているWSDLファイルを指定しても,エラーになりません。WSDL2Javaコマンドで指定するWSDLファイル内でxsd:schema要素を記述する場合は,targetNamespace属性を持つxsd:schema要素を記述してください。
(19) 複数のxsd:schema要素を記述する場合の注意
WSDL2Javaコマンド実行時に,同じtargetNamespace属性値を持つxsd:schema要素をwsdl:types要素以下に複数記述しているWSDLファイルを指定しても,エラーになりません。WSDL2Javaコマンドで指定するWSDLファイル内でwsdl:types要素以下に複数のxsd:schema要素を記述する場合は,それぞれ異なるtargetNamespace属性値を持つxsd:schema要素を記述してください。
(20) element要素にnillable属性を指定していない場合の注意
nillable属性を指定していないelement要素に対してアプリケーションで値を設定しないと,要素にxsi:nil="true" 属性が設定された空要素が送信され,不正なSOAPメッセージになります。
次の条件がすべて重なる場合に問題が発生します。なお,element要素の型は問いません。
-
element要素にnillable属性が属性値"false"で指定されている,またはnillable属性が指定されていない。
-
minOccurs属性の属性値に"1"以上が設定されている(minOccurs属性の省略時も含む)。
-
アプリケーションで該当する要素のメンバに値を設定していない。
XML Schemaの指定で空要素指定がされていない要素には,アプリケーションで必ず値を設定してください。