SOAP ノードは、スタイルが document (デフォルト) または rpc の、 特定の WSDL バインディングを使用して構成されます。 特定の WSDL バインディングに定義されたすべての操作は、通常は同じ使用方法 (use) で定義されます。使用法は、literal (デフォルト) または encoded のいずれかです。
rpc-encoded の SOAP メッセージの場合、SOAP エンコード方式の注釈を伝送できます。この注釈は、送信されるメッセージについての追加情報を受信側に提供することを意図したものです。 次の 4 つのタイプの注釈が一般的です。
xsi:type 属性をエレメントに追加して、エレメントのタイプを指定できます。 以下に例を示します。
<data xsi:type="xsd:string">text</data>
ここで、ネーム・スペース接頭部 xsi は、次のように定義されています。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
WSDL スキーマと XML スキーマから作成された Web サービスの場合、タイプ情報が最初から提供されるので、xsi:type は冗長になります。
通常、アウトバウンド・メッセージを作成する場合には、xsi:type 情報を追加しません。 以下の ESQL 例は、必要な場合に xsi:type 情報を追加する方法を示しています。
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE xsi NAMESPACE 'http://www.w3.org/2001/XMLSchema-instance';
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsd = xsd;
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsi = xsi;
SET OutputRoot.SOAP.Body.rpc:op1.part1.data.(SOAP.Attribute)xsi:type = 'xsd:string';
インバウンド・メッセージを構文解析する場合、以下のように、xsi:type 情報は他の属性と同じ方法で論理ツリーに追加されます。
(0x03000000:PCDataField):data = 'text' (CHARACTER)
(
(0x03000100:Attribute)http://www.w3.org/2001/XMLSchema-instance:type = 'xsd:string' (CHARACTER)
)
encodingStyle 属性をエレメントに追加して、使用する SOAP エンコード方式スタイルを指定できます。 以下に例を示します。
<tns:op1 soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
ここで、ネーム・スペース接頭部 soapenv は、ご使用の SOAP エンベロープのネーム・スペースとして次のように定義されています。
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" (SOAP 1.1)
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" (SOAP 1.2)
この値自体は URI のリストですが、通常の使用において、値は次のようになります。
"http://schemas.xmlsoap.org/soap/encoding/" (SOAP 1.1)
"http://www.w3.org/2003/05/soap-encoding" (SOAP 1.2)
SOAP 1.1 では、encodingStyle 属性はどのエレメントにも追加できます。 SOAP 1.2 では、encodingStyle 属性を追加できるのは、Body、Header、Detail の子に対してのみです。
通常、アウトバウンド・メッセージを作成する場合には、encodingStyle 属性を追加しません。 以下の ESQL 例は、必要な場合に encodingStyle 情報を追加する方法を示しています。
DECLARE soapenv NAMESPACE 'http://schemas.xmlsoap.org/soap/envelope/';
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
SET OutputRoot.SOAP.Body.tns:op1.(SOAP.Attribute)soapenv:encodingStyle = soapenc;
インバウンド・メッセージを構文解析する場合、以下のように、encodingStyle 属性は他の属性と同じ方法で論理ツリーに追加されます。
(0x03000100:Attribute)http://schemas.xmlsoap.org/soap/envelope/:encodingStyle =
'http://schemas.xmlsoap.org/soap/encoding/' (CHARACTER)
SOAP 配列は、同じタイプの一連の子エレメントが入っているエレメントです。 次の XML スキーマ例では、2 つのエレメント (単純ストリングと配列) が入っている data というタイプがあります。 このスキーマで、array というフィールドには不特定の数のストリング・タイプの子が入っています。 これらの子エレメントの名前は指定されていません。
<xsd:complexType name="ArrayOfString">
<xsd:complexContent mixed="false">
<xsd:restriction base="soapenc:Array">
<xsd:attribute wsdl:arrayType="xsd:string[]" ref="soapenc:arrayType"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="data">
<xsd:sequence>
<xsd:element name="simple" type="xsd:string"/>
<xsd:element name="array" type="tns:ArrayOfString"/>
</xsd:sequence>
</xsd:complexType>
この例で使用されているネーム・スペースは、以下のように WSDL 1.1 と SOAP 1.1 に由来するものです。
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
次の例は、このスキーマに合致する有効なインスタンス文書の一部です。
<array soapenc:arrayType="xsd:string[]">
<item>item1</item>
<item>item2</item>
</array>
アウトバウンド・メッセージを作成する場合、適切な属性を追加する必要があります。 例えば、以下の ESQL は arrayType 属性を追加する方法を示しています。
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsd = xsd;
SET OutputRoot.SOAP.Body.rpc:op1.p1.array.(SOAP.Attribute)soapenc:arrayType = 'xsd:string[]';
SOAP 1.1 と SOAP 1.2 で使用する属性は異なります。 SOAP 1.1 では arrayType 属性を使用します。 配列のサイズを指定することもできますが、必須ではありません。 SOAP 1.2 の場合、2 つの別個の属性を使用します。 前述の例に関して同等の SOAP 1.2 属性は soapenc:itemType="xsd:string" と soapenc:arraySize="2" で、ネーム・スペース接頭部は次のように定義されています。
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc=" http://www.w3.org/2003/05/soap-encoding"
SOAP 配列を含んだ SOAP エンコード・メッセージをメッセージ・フローが受信する場合は、妥当性検査を無効にする必要があります。 インバウンド・メッセージを構文解析する場合、スキーマに照らしてインスタンス文書を妥当性検査することはできません。配列項目の名前がスキーマで定義されていないためです。
以下の例は、op1 という名前の WSDL rpc-encoded 操作に関する SOAP 1.1 要求メッセージを示しています。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:rpc="http://example/rpc">
<rpc:op1>
<p1>
<simple>text</simple>
<array soapenc:arrayType="xsd:string[]">
<Item>item1</Item>
<Item>item2</Item>
</array>
</p1>
</rpc:op1>
</soapenv:Body>
</soapenv:Envelope>
SOAP 実装では、以下のように、この論理メッセージを再編成して多重参照エレメントを使用できます。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:rpc="http://example/rpc">
<rpc:op1>
<p1 href="#id1"/>
</rpc:op1>
<rpc:data id="id1">
<simple>text</simple>
<array href="#id2"/>
</rpc:data>
<soapenc:Array id="id2" soapenc:arrayType="xsd:string[]">
<Item>Array Element 0</Item>
<Item>Array Element 1</Item>
</soapenc:Array>
</soapenv:Body>
</soapenv:Envelope>
このメッセージは最初の例と論理的に同等ですが、エレメント p1 と array の子は別個の兄弟エレメントに分割され、href 属性を使用して参照されています。
<data> などの導入されたエレメントでは、以下が可能です。
こうした考慮事項は、いずれも前述の例には当てはまりません。
通常、アウトバウンド・メッセージを作成する場合には、多重参照エレメントをエンコードしません (メッセージがグラフを表す場合を除く)。 その他の場合には、多重参照エンコードはオプションです。 以下の ESQL 例は、多重参照エレメントをエンコードする方法を示しています。
-- ESQL namespace prefixes
DECLARE soapenc NAMESPACE 'http://schemas.xmlsoap.org/soap/encoding/';
DECLARE xsd NAMESPACE 'http://www.w3.org/2001/XMLSchema';
DECLARE rpc NAMESPACE 'http://example/rpc';
-- define XML namespace prefixes
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:soapenc = soapenc;
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:xsd = xsd;
SET OutputRoot.SOAP.Context.Namespace.(SOAP.NamespaceDecl)xmlns:rpc = rpc;
-- build request message
SET OutputRoot.SOAP.Body.rpc:op1.p1.(SOAP.Attribute)href = '#id1';
SET OutputRoot.SOAP.Body.rpc:data.(SOAP.Attribute)id = 'id1';
SET OutputRoot.SOAP.Body.rpc:data.simple = 'text';
SET OutputRoot.SOAP.Body.rpc:data.array.(SOAP.Attribute)href = '#id2';
SET OutputRoot.SOAP.Body.soapenc:Array.(SOAP.Attribute)id = 'id2';
SET OutputRoot.SOAP.Body.soapenc:Array.(SOAP.Attribute)soapenc:arrayType = 'xsd:string[]';
SET OutputRoot.SOAP.Body.soapenc:Array.Item[1] = 'item1';
SET OutputRoot.SOAP.Body.soapenc:Array.Item[2] = 'item2';
インバウンド・メッセージを構文解析する場合、多重参照エレメントは Web サービス WSDL の XML スキーマと一致しません。 SOAP ノードで妥当性検査が有効になっていると、例外がスローされます。 多重参照エンコードを使用している場合、妥当性検査を無効にする必要があります。
メッセージから作成した論理ツリーがある場合、このツリーを出力用に別の SOAP ノードに伝搬できます。 例えば、次の図に示されているようにファサード・フローで SOAPRequest ノードが多重参照エンコードを使用する応答を受信する場合、応答の論理ツリーを SOAPReply ノードに伝搬し、多重参照エンコードを使用する SOAP メッセージが元のクライアントに戻るようにできます。
元のクライアント側でも、多重参照エンコードを理解できなければなりません。
多重参照エンコード・メッセージの論理ツリーを操作するには、ESQL で href 属性と id 属性を処理します。 これらの属性は、SOAP 1.1 と SOAP 1.2 では以下のように若干異なります。