[1] [DFN[[RUBYB[SOAP 符号化][SOAP Encoding]]]]は、
[[SOAPデータ・モデル]]のデータを [[XML情報集合]]で表現
([[直列化]]) する方法です。

-'''[CODE[[QN[env:[[encodingStyle]]][http://www.w3.org/2003/05/soap-envelope]]]]''':
[CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]]

[2] 仕様書:
-[[SOAP 1.2]]
--[CSECTION[3. SOAP Encoding]]
<IW:SOAP2:"soapenc">
--正誤表 [CSECTION[E2/9 - Clarification. (2004-07-05)]]
<http://www.w3.org/2003/06/REC-soap12-20030624-errata.html#E29>

* 直列化

[5]
- [CODE(InfoItem)[[[要素]]情報項目]]
-- [[グラフ辺]]を表します。 [SRC[SOAP 1.2 Part 2 3.1.1]]
-- [CODE(InfoProp)[[[属性]]]]
--- [CODE(XMLa)[[QN[enc:[[id]]][http://www.w3.org/2003/05/soap-encoding]]]]
[CODE(InfoItem)[[[属性]]情報項目]]
----[CODE(XMLa)[[QN[enc:[[ref]]][http://www.w3.org/2003/05/soap-encoding]]]]
[CODE(InfoItem)[[[属性]]情報項目]]から[[参照]]するための固有識別子です。
[SRC[SOAP 1.2 Part 2 3.1.5.1]]。
----[CODE(InfoProp)[[[局所名]]]]: [CODE(XMLa)[[[id]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.1]]
----[CODE(InfoProp)[[[名前空間名]]]]: [CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.1]]
----[CODE(InfoProp)[[[指定]]]]: [CODE(XML)[[[true]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.1]]
----型: [CODE(XML)[[QN[xs:[[ID]]][]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.1]]
--- [CODE(XMLa)[[QN[enc:[[ref]]][http://www.w3.org/2003/05/soap-encoding]]]] 
[CODE(InfoItem)[[[属性]]情報項目]]
---- この[[グラフ辺]]が終わる[[グラフ節点]]の[CODE(InfoItem)[[[要素]]情報項目]]
[WEAK[([CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]] [CODE(XMLa)[[QN[enc:[[encodingStyle]]][http://www.w3.org/2003/05/soap-encoding]]]] の範囲内になければ'''なりません'''。)]] の
[CODE(XMLa)[[QN[enc:[[id]]][http://www.w3.org/2003/05/soap-encoding]]]]
[CODE(InfoItem)[[[属性]]情報項目]]の値を指定します。
[SRC[SOAP 1.2 Part 2 3.1.1]]
該当する[CODE(InfoItem)[[[要素]]情報項目]]は丁度1つでなければ'''なりません'''。
[SRC[SOAP 1.2 Part 2 3.1.5.3]]
----[CODE(InfoProp)[[[局所名]]]]: [CODE(XMLa)[[[ref]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.2]]
----[CODE(InfoProp)[[[名前空間名]]]]: [CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.2]]
----[CODE(InfoProp)[[[指定]]]]: [CODE(XML)[[[true]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.2]]
----型: [CODE(XML)[[QN[xs:[[IDREF]]][]]]]
[SRC[SOAP 1.2 Part 2 3.1.5.2]]
---- この[CODE(InfoItem)[[[属性]]情報項目]]がなければ、
この[CODE(InfoItem)[[[要素]]情報項目]]が終点の[[グラフ節点]]をも[DFN[[RUBYB[表現][represent]]]]します。
[SRC[SOAP 1.2 Part 2 3.1.1]]
----[CODE(XMLa)[[QN[enc:[[id]]][http://www.w3.org/2003/05/soap-encoding]]
[CODE(InfoItem)[[[属性]]情報項目]]が存在する[CODE(InfoItem)[[[要素]]情報項目]]に出現しては'''なりません'''。
[SRC[SOAP 1.2 Part 2 3.1.5.3]]
--- [CODE(XMLa)[[[nodeType]]]] [CODE(InfoItem)[[[属性]]情報項目]]
([[単純値]]節点を現す場合、[[複合値]]接点を表す場合)
--- [CODE(XMLa)[[QN[enc:[[nodeType]]][http://www.w3.org/2003/05/soap-encoding]]]] 
[CODE(InfoItem)[[[属性]]情報項目]]
----[[グラフ節点]]が表す[[値]]の種類を表します
[SRC[SOAP 1.2 Part 2 3.1.7]]。
----[CODE(InfoProp)[[[局所名]]]]: [CODE(XMLa)[[[nodeType]]]]
[SRC[SOAP 1.2 Part 2 3.1.7]]
----[CODE(InfoProp)[[[名前空間名]]]]: [CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]]
[SRC[SOAP 1.2 Part 2 3.1.7]]
----[CODE(InfoProp)[[[指定]]]]: [CODE(XML)[[[true]]]]
[SRC[SOAP 1.2 Part 2 3.1.7]]
----型: [CODE(XMLa)[[QN[enc:[[nodeType]]][http://www.w3.org/2003/05/soap-encoding]]]]: 
[CODE(XML)[[[simple]]]] ([[単純型]]),
[CODE(XML)[[[struct]]]] ([[複合型]]: [[構造体]]),
[CODE(XML)[[[array]]]] ([[複合型]]: [[配列]])
[SRC[SOAP 1.2 Part 2 3.1.7]]
--- [CODE(XMLa)[[QN[enc:[[itemType]]][http://www.w3.org/2003/05/soap-encoding]]]]
[CODE(InfoItem)[[[属性]]情報項目]]
----[[配列]]を表す場合指定して'''構いません'''
[SRC[SOAP 1.2 Part 2 3.1.3]]。
----[CODE(InfoProp)[[[局所名]]]]: [CODE(XMLa)[[[itemType]]]]
[SRC[SOAP 1.2 Part 2 3.1.4.1]]
----[CODE(InfoProp)[[[名前空間名]]]]: [CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]]
[SRC[SOAP 1.2 Part 2 3.1.4.1]]
----[CODE(InfoProp)[[[指定]]]]: [CODE(XML)[[[true]]]]
[SRC[SOAP 1.2 Part 2 3.1.4.1]]
----型: [CODE(XML)[[QN[xs:[[QName]]][]]]]
[SRC[SOAP 1.2 Part 2 3.1.4.1]]
----[[配列]]の要素に当たる[[グラフ節点]]の[[型名]]を指定します
[SRC[SOAP 1.2 Part 2 3.1.4]]。
--- [CODE(XMLa)[[QN[enc:[[arraySize]]][http://www.w3.org/2003/05/soap-encoding]]]]
[CODE(InfoItem)[[[属性]]情報項目]]
----[[配列]]を表す場合指定して'''構いません'''
[SRC[SOAP 1.2 Part 2 3.1.3]]。
----[[多次元配列]]のようなプログラムの[[データ構造]]に写像できることを示します。
[SRC[SOAP 1.2 Part 2 E29]]
----[CODE(InfoProp)[[[局所名]]]]: [CODE(XMLa)[[[arraySize]]]]
[SRC[SOAP 1.2 Part 2 3.1.6]]
----[CODE(InfoProp)[[[名前空間名]]]]: [CODE(URI)[[[http://www.w3.org/2003/05/soap-encoding]]]]
[SRC[SOAP 1.2 Part 2 3.1.6]]
----型: [CODE(XML)[[QN[enc:[[arraySize]]][]]]]:
[CODE(ABNF)[(1*[[DIGIT]] / "*") *(([[U+0009]] / [[U+000A]] / [[U+000D]] / [[U+0020]]) 1*[[DIGIT]])]]
[SRC[SOAP 1.2 Part 2 3.1.6]]
----[[配列]]中の各[[次元]]の大きさを示します。
項目の数が次元数となります。星は大きさ未指定を表します。
最初の方が添え字がゆっくり動く次元、最後の方が添え字が速く動く次元です。
[SRC[SOAP 1.2 Part 2 3.1.6, E29]]
----この[[属性]]を省略した時の既定値は [CODE(XML)[*]] です。
[SRC[SOAP 1.2 Part 2 3.1.6, E29]]
--- [CODE(XMLa)[[QN[xn:[[nil]]]]
[CODE(InfoItem)[[[属性]]情報項目]]
---- [[節点]]を表す場合に指定できます。
---- [CODE(XML)[[[true]]]] なら、[[グラフ節点]]で終わらない辺であることを表します。
この場合は[[グラフ辺]]を表す[CODE(InfoItem)[[[要素]]情報項目]]自体を省略できます。
[SRC[SOAP 1.2 Part 2 3.1.3]]
-- [CODE(InfoProp)[[[子供]]]]
---[CODE(InfoItem)[[[文字]]情報項目]]
([CODE(InfoItem)[[[要素]]情報項目]]が[[グラフ節点]]
([[単純値]]) を表現する場合)
---- [[グラフ節点]]の[[字句値]]で、[[単純値]]を表します。
[SRC[SOAP 1.2 Part 2 3.1.2]]
--- [CODE(InfoItem)[[[要素]]情報項目]]
([CODE(InfoItem)[[[要素]]情報項目]]が[[グラフ節点]]
([[複合値]]) を表現する場合)
[SRC[SOAP 1.2 Part 2 3.1.3]]
---- [[外向き辺]]を表します。
---- [[辺札]]で区別される場合、子供[CODE(InfoItem)[[[要素]]情報項目]]の[CODE(InfoProp)[[[局所名]]]]と[CODE(InfoProp)[[[名前空間名]]]]で[[辺札]]の値を決定します。
---- [[位置]]で区別される場合、
[[グラフ辺]]の順序位置は子供[CODE(InfoItem)[[[要素]]情報項目]]の兄弟間の相対位置に対応します。
[CODE(InfoProp)[[[局所名]]]]と[CODE(InfoProp)[[[名前空間名]]]]は意味を持ちません。

[6] '''グラフ節点の型名''':
[[グラフ節点]]の[[型名]]は符号化された情報集合から次の方法で得ることができます。
なお、[[型名]]は[[名前空間名]]と[[局所名]]の組で、
[[名前空間接頭辞]]は [[SOAP]] の[[グラフ]]が持つ情報とは考えません。
[SRC[SOAP 1.2 Part 2 3.1.4]]

= [[グラフ節点]]を表現する[CODE(InfoItem)[[[要素]]情報項目]]が
[CODE(XMLa)[[QN[xsi:[[type]]]]]] [CODE(InfoItem)[[[属性]]情報項目]]を持つなら、
その値が[[型名]]です。
= [CODE(InfoProp)[[[親]]]][CODE(InfoItem)[[[要素]]情報項目]]が
[CODE(XMLa)[[QN[enc:[[itemType]]][http://www.w3.org/2003/05/soap-encoding]]]] [CODE(InfoItem)[[[属性]]情報項目]]を持つなら、
その値が[[型名]]です。
= [[型名]]は未指定です。

注意: [[SOAP]] の[[グラフ]]は[[型名]]の情報を持っていますが、
[[SOAP]] 自体としては特定の型システムや妥当性検証を求めてはいません。[SRC[SOAP 1.2 Part 2 3.1.4]]


[4] '''複数の表現''':
1つの[[グラフ]]に複数の表現方法があるかもしれません。
直列化器はどの表現を使っても'''構いません'''し、
解直列化器はどの表現も受け付けなければ'''なりません'''。
[SRC[SOAP 1.2 Part 2 3.1]]

[[#comment]]

* 失敗の処理

[7] [[SOAP]] [[受信者]]が [[SOAP符号化]]を解直列化しようとした時、
- [CODE(XMLa)[[QN[enc:[[ref]]][http://www.w3.org/2003/05/soap-encoding]]]] 
[CODE(InfoItem)[[[属性]]情報項目]]の[[参照]]先がなければ、
[[SOAP失敗]]
[CODE(XML)[[QN[enc:[[Sender]]][http://www.w3.org/2003/05/soap-encoding]]]] 
(亜符号
[CODE(XMLa)[[QN[enc:[[MissingID]]][http://www.w3.org/2003/05/soap-encoding]]]])
を生成する'''べきです'''。
[SRC[SOAP 1.2 Part 2 3.2]]
- [CODE(XMLa)[[QN[enc:[[ref]]][http://www.w3.org/2003/05/soap-encoding]]]] 
[CODE(InfoItem)[[[属性]]情報項目]]の[[参照]]先が複数あれば、
[[SOAP失敗]]
[CODE(XML)[[QN[enc:[[Sender]]][http://www.w3.org/2003/05/soap-encoding]]]] 
(亜符号
[CODE(XMLa)[[QN[enc:[[DupulicateID]]][http://www.w3.org/2003/05/soap-encoding]]]])
を生成する'''べきです'''。
[SRC[SOAP 1.2 Part 2 3.2]]
- [[型名]]が指定されていなければ、
[CODE(XML)[[QN[enc:[[Sender]]][http://www.w3.org/2003/05/soap-encoding]]]] 
(亜符号
[CODE(XMLa)[[QN[enc:[[UntypedValue]]][http://www.w3.org/2003/05/soap-encoding]]]])
を生成して'''構いません'''。
[SRC[SOAP 1.2 Part 2 3.2]]

[[#comment]]

* 関連

[3] '''SOAP の他の部分との関係''':
-[[SOAP符号化]]や [[SOAPデータ・モデル]]の実装は'''任意選択'''です。
-[[SOAP RPC表現]]は [[SOAP符号化]]を使用しています。

[[#comment]]

* メモ
