SOAP Version 1.2中文手冊4
5. SOAP编码
SOAP编码风格是基于一个简单类型系统,而这个系统是程序语言、数据库和半结构数据中类型系统的公共特性的泛化。一个类型要么是一个简单(可量化的)类型或是一个复合类型,这个复合类型由多个部分组成,每个部分是一个类型。下面会有类型的更为详细的描述。本节定义了一个编序规则,用于可类型化对象图的编序。它在两个级别上操作。首先,给出一个符号上一致化的由该类型系统描述的模式,构造一个XML语法层的模式。其次,提供一个类型系统的模式以及一个与该模式相一致的值的表示方法,构造一个XML实例层的模式。反之,先提供一个符合这些规则XML实例,然后再给出原始的模式、一个原始值表示,也是可以构造的。
在本节中定义的元素和属性所用到的命名空间标识是"http://www.w3.org/2001/06/soap-encoding"。而这些编码的例子中假定所有命名空间声明都是在更高的元素层次上。
在本节中描述的数据模型和编码风格的使用方式是被鼓励的而不是必备的,其他的数据模型和编码也是可以与SOAP联合使用的(参阅 section 4.1.1)。
5.1 使用XML进行类型编码的规则
XML允许非常柔性地编码数据。SOAP只定义了非常有限的编码规则。本节在一个高层次上定义编码规则,而下一节则描述明确类型的编码规则,当有更细节的需求的时候。本节中描述的编码可以与Section 7中描述的RPC调用和响应的映射联合使用。
为了描述编码,以下术语将被使用:
“value”值是一个字符串(string)、一个可量度对象(数字、日期、玫举)的名字、或是数个简单值的组合。所有的值都有明确的类型。
“易做图 value”简单值是是一个不可分的值,它不包含任意可以命名的部分。简单值的离子可以是特定的字符串、证书或玫举值等。
“compound value”复合值是一个值的关系的聚集。复合值的例子可以是特定的采购定单、存货报表、街道地址等。
在一个复合值中,每一个相关的值都可以用一个角色名来区分,也可以用一个序数来区分,当然也可以同时使用两者。这被称为“accessor”存取标识。复合值的离子包括特定的采购定单、存货报表等。数组也是复合值。它可以被看成是具有多个相同名字的存取标识(accessor)的复合值,例如RDF。
“array”数组是一个复合值,在其成员值之间仅有顺序位置不同。
“struct”结构是一个复合值,在其成员值之间的区分是依靠存取标识(accessor)。同时所有存取标识的名应不同。
“易做图 type”简单类型是简单值的类。简单类型的例子包括那些类“string”, “integer”,玫举类等。
“compound type”复合类型是复合值的类。复合类型的例子包括采购定单的抽象类型,这些由该类型派生的采购定单具备相同的存取标识(shipTo, totalCost等),当然他们有不同的值(也许对某些值还有约束)。
在一个复合类型中,一个存取标识在本符合类型中是唯一的,如果它和其他复合类型中的某个存取标识无法相区别,则该存取标识名加上复合类型的名字才能成为唯一标识,这个名称为"局部名"。无论该名是直接或间接基于一个URI,如果该存取标识不用加类型名约束就已经是唯一的,那该名就成为"全局名"。
值表的编序的模式中所给出的信息,是有可能能决定一些值只能关联一个存取标识的简单实例。对于其他可能的情况,则无法下这个断言。一个值被称为”single-reference”单引用,如果只有一个存取标识能够引用它。如果能被多个引用,无论是事实上还是潜在可能,那就是”multi-reference”多引用。注意有可能在一模式中有一个确定的值是单引用而其他则是多引用。
在句法上,一个元素可以是"独立的"或"嵌入的"。一个独立的元素是作为编序中一个顶级元素出现。而其他则是嵌入元素。
尽管使用xsi:type属性可以令值的表示为自描述的,也就是说即包含值的结构也包含值的类型,但编序规则允许值的类型可以仅仅引用模式(Schema)中的类型定义。而这些模式可以使用“XML Schema Part 1: Structures”[10]和“XML Schema Part 2: Datatypes”[11]中定义的规范来描述,当然也可以使用其他的模式定义来定义。注意尽管这样,但许多模式定义只支持结构(struct)和数组(array)类型,而编序规则则有可能要尝试使用结构(struct)和数组(array)类型之外的复合类型。
编序规则如下:
所有的值都应当表现为元素的内容(content)。一个多引用的值必须被表示为一个独立元素的内容。而一个单引用的值应该不如此(不过也可以如此)。
对每个包含一个值的元素,值的类型表示必须满足以下至少一个条件:(a) 包含该值的元素实例包含一个xsi:type属性,(b) 包含该值的元素实例包含在一个具备enc: arrayType属性的元素中(可能是被设置成default的),(c) 该元素的名带有一个类型的明确关联,而该类型由一个模式来决定。
一个简单值应被表示为字符数据(character data),也就是说,没有任何子元素。每一个简单值必须有一个类型,该类型要么是在XML Schema规范的DataTypes部分[11]中被罗列,要么它的源类型应当在该部分中被罗列(可参阅 section 5.2)。
一个复合值应当被编码为一个元素序列,其中每一个存取标识由一个嵌入元素来表示,他们的名是一一对应的。若存取标识的名在包含它的型中是局部的,则它有一个未修饰的元素名,而其他则应有完全修饰的名(可参阅 section 5.4)。
一个多引用的简单或复合值应当被编码为一个独立元素,该独立元素应包含一个局部的带有非限制名的“id”属性,该属性的类型为XML规范[7]中定义的ID类型。对该值的每一个存取标识是一个空元素,该空元素有一个局部的未修饰的属性“href”,该属性类型是XML Schema规范[11]中定义的“uri-reference”类型,“href”属性的值是一个引用该对应独立元素的URI片段标识。
字串和字节数组被表示为多引用简单类型,不过特别的规则也允许它们在通常情况下更有效地表示(可参阅 section 5.2.1以及section 5.2.3)。一个字串或字节数组的存取标识可以有一个在XML规范[7]中定义的名为”id”的ID类型的属性。如果这样的话,所有其他对该同一值的存取标识可以被编码为一个空元素,该空元素应包含一个局部的带有非限制名的“href”属性,该属性的类型为XML Schema规范[11]中定义的“uri-reference”类型,“href”属性的值是一个引用该对应独立元素的URI片段标识。
对一个值编码多个引用是允许的,看上去这些引用好象是引用了多个不同的值,但仅当从上下文中可得到该XML 实例的含义是未改变的的结论。
数组是复合值(可参阅 section 5.4.2)。SOAP数组被定义为类型是“enc:Array”或类型是源于“enc:Array”。
SOAP数组有一或易做图,而它的成员由顺序位置区分。一个数组的值被表示为一序列反映该数组的元素,这些成员按序数从小到大顺序出现。对于易做图数组,则元素维按从右到左顺序变化。没一个成员元素都被命名为一个独立元素(参阅 rule 2)。
SOAP数组可以是单引用值,也可以是多引用值,从而可以被表示为一个嵌入元素或一个独立元素。
SOAP数组必须包含一个“enc:arrayType”属性,其中定义的包含元素的值的类型与维数一起描述了该数组。”enc:arrayType”属性的值定义如下:
arrayTypeValue = atype asize atype = QName *( rank ) rank = "[" *( "," ) "]" asize = "[" #length "]" length = 1*DIGIT “atype”结构是数组所包含的元素的类型的名,首先它包含一个QName表示,QName应在XML Schema元素声明中的“type”属性中出现,QName是一个型约束(意味着所有其包含的元素都应宣称与该指明的类型相一致,也就是说,在enc:arrayType中引用的类型必须是所有数组元素的类型或超类型)。对于那些数组的数组或是“jagged arrays”,使用rank结构来表示数组的元素是一个数组,同时该数组的具体类型将在下层具体成员数组的定义时数值实例化,rank中出现零个、一个到多个逗号,表明该
补充:软件开发 , C# ,