SOAP协议规范(二)


5.2  简单类型
SOAP采用了"XML  Schema  Part  2:  Datatypes"规范[11]"Built-in  datatypes"节中的所有类型作为简单类型,包括值和取值范围。例如:  

类型  举例
int  58502
float  314159265358979E+1
negativeInteger  -32768
string  Louis  "Satchmo"  Armstrong  

在xml  schema规范中声明的数据类型可以直接用在元素schema中,也可以使用从这些类型衍生的新类型。一个schema和对应的具有这些类型的元素的数据实例的例子如下所示:  










45
5.9
-450
Blue  

所有简单值必须编码为元素的内容,它的类型或者在"xml  schema  part  2:  datatypes"规范[11]中定义过,或者是基于一个用xml  schema规范提供的机制能推衍生出的类型。如果一个简单值编码为独立元素或异质数组成员,那么有一个对应于数据类型的元素声明将会很方便。因为"xml  schema  part  2:  datatypes"规范[11]包括了类型定义,但是不包括对应的元素声明,soap-enc  schema和名域为每个简单数据类型声明了一个元素,如45  

5.2.1  字符串
字符串数据类型的定义在"XML  Schema  Part  2:  Datatypes"规范[11]中。注意,这不同于许多数据库和程序语言中的"string"类型,特别的,字符串数据类型可能禁止某些在那些语言中允许的字符。(这些值必须用xsd:string之外的数据类型表示)一个字符串可能编码为一个single-reference  或  multi-reference值。包含字符串值的元素可能有一个"id"属性。附加的accessor元素可能有对应的"href"属性。
例如,同一字符串的两个accessor可能以如下形式出现:  

hello
 

但是,如果两个accessor参考同一字符串实例(或字符串的子类型),这不是一个实质问题,它们可以编码为两个single-reference值,如下所示:  

hello
Hello  

这个例子的schema片断如下所示:  


 

在这个例子中,soap-enc:string类型用作元素的类型,这是声明数据类型是"xsd:string"且允许"id"  和"href"属性的元素的简便方法。精确定义参见soap编码schema。schemas可以使用这些源自soap编码schema的声明,但也可以不这样做。  

5.2.2  enumerations
"XML  Schema  Part  2:  Datatypes"规范  [11]  定义了"enumeration."机制。SOAP数据模型直接采用了这种机制。但是,由于程序语言和其它语言在定义枚举时通常有些不同,所以我们在这里详细阐述了它的概念并描述了一个列表成员的可能取的值是如何编码的。"Enumeration"作为一个概念表示不同的名字的集合。一个特定的枚举就是对应于特定的基类型的不同的值的列表。例如,颜色集合("Green",  "Blue",  "Brown")可以定义为基于字符串类型的枚举,("1",  "3",  "5")可能是一个基于整型数的枚举,等等。"XML  Schema  Part  2:  Datatypes"  [11]支持除了布尔型以外所有简单类型的枚举。"XML  Schema  Part  1:  Structures"规范[10]的语言可以用来定义枚举类型。如果schema由另一个没有特定基类型适用的符号系统生成,就使用"string"。在下面schema的例子中,"EyeColor"定义为字符串,可能的值是"Green",  "Blue",  或"Brown"的枚举,数据实例按照schema显示如下。  








Henry  Ford
32
Brown
 

5.2.3  字符数组
一个字符数组可能编码为single-reference  或multi-reference值。字符数组的编码规则与字符串的编码规则类似。特别的,包含字符数组的元素值可能由一个"id"属性,附加的accssor元素可能有相应的"href"属性。推荐使用定义在XML  Schemas  [10][11]中的'base64'编码(使用在2045  [13]中定义的base64编码算法)表示模糊字符数组。不过,由于行长度(line  length)的限制,通常在MIME中应用base64编码,SOAP中一般不应用base64编码。但是提供了"SOAP-ENC:base64"子类型使之能用于SOAP。  


aG93IG5vDyBicm73biBjb3cNCg==
 

5.3  多态accessor
许多语言允许能够多态访问多种类型值的accessor,每种类型在运行时可用。一个多态accessor实例必须包含一个"xsi:type"属性描述实际值的类型。例如,一个名为"cost"类型值为"xsd:float"的多态accessor编码如下:  

29.95与之对比,类型值不变的accessor编码如下:  

29.95  

5.4  compound  types复合类型
SOAP定义了与下列常在程序语言中出现的结构性模式对应的类型:  

结构:一个"struct"是一个复合值,它的成员值的唯一区别是accessor名称,任意两个accessor名称都不相同。
数组:一个"array"是一个复合值,它的成员值的唯一区别是序数位置。
SOAP也允许结构和数组之外的其它数据的序列化,例如Directed-Labeled-Graph  Data  Model之类的数据中,单个节点有许多不同的accssor,有些不止出现一次。SOAP序列化规则不要求底层的数据模型在accssor之间区分次序,但如果有这样的次序的话,这些accssor必须按照这个顺序编码。  

5.4.1  复合值,结构和值引用
复合值的成员编码为accessor元素。当accessor由名区分时(如结构),accessor名即作为元素名。名局部于类型的accessor有不受限的名,其它的accessor则有受限的名。下面的例子是类型为"Book"的结构:  


Henry  Ford
Prefatory  text
This  is  a  book.
 

以下是描述上面结构的schema片断:  







 

以下是一个同时具有简单和复杂成员类型的例子。它显示两层引用。注意"author"accssor元素的"href"属性是对相应具有"id"属性的值的引用。"address"与之类似。  


My  Life  and  Work



Henry  Ford



mailto:henryford@hotmail.com
http://www.henryford.com
 

当"person"的值和"address"的值是multi-reference时,上面的形式是正确的。如果它
们是single-reference,就必须用嵌入的形式,如下所示:  


My  Life  and  Work

Henry  Ford

mailto:henryford@hotmail.com
http://www.henryford.com


 

如果添加一个限制,任意两个人都不会有相同的地址,并且地址可以是街道或email地址,一本书可以有两个作者,编码如下:  


My  Life  and  Work




Henry  Ford

mailto:henryford@hotmail.com
http://www.henryford.com



Samuel  Crowther

Martin  Luther  King  Rd
Raleigh
North  Carolina

 

序列化可以包含对不在同一个资源的值的引用:  


Paradise  Lost

 

以下是描述上面结构的schema片断:  



<!--  Either  the  following  group  must  occur  or  else  the
href  attribute  must  appear,  but  not  both.  --&gt











<!--  Either  the  following  group  must  occur  or  else  the
href  attribute  must  appear,  but  not  both.  --&gt










<!--  Either  the  following  group  must  occur  or  else  the
href  attribute  must  appear,  but  not  both.  --&gt








 

5.4.2  数组
SOAP数组定义为具有"SOAP-ENC:Array"类型或一个从"SOAP-ENC:Array"衍生的类型(参见规则8)。数组表示为元素值,对元素的名没有特别的约束(正如元素值并不约束它们所属的元素)。数组可以包含任意类型的元素,包括嵌套数组。可以创建新的类型(受SOAP-ENC:Array
类型限制)来表示数组,如整数数组或某些用户定义的枚举。数组值表示为组成这个数组的项的元素的规则序列。在数组值中,元素名对于区分accesor并不重要。元素可以有任意的名。实际上,元素常常用它们在schema中暗示或确定的数组类型来命名元素。并且一般情况下对于复合值来说,如果数组中数组项的值是single-reference值,则这个数组项包含它的值,否则,该数组项通过"href"属性引用这个值。下面的例子是一个整型数组的schema片断:  

type="SOAP-ENC:Array"/>
SOAP-ENC:arrayType="xsd:int[2]">
3
4
 

在这个例子中,数组"myfavoritenumbers"包括几个成员,每个成员是一个类型为soap-enc:int的值。注意soap-enc:array允许不受限制的元素名,它们不传达任何类型信息,所以在使用时,或者它们有xsi:type属性,或者它们所属的元素有soap-enc:arraytype属性。自然,由soap-enc:array衍生的类型可以声明局部元素,但这种情况下要包括类型信息。上面已经提到,soap-enc  schema包含了元素的声明,元素名与"xml  schema  part  2:  datatypes"规范[11]中的简单类型一致。其中包括了对"array"的声明。于是,我们可以这样写:  


3
4
 

数组可以包含特定arraytype的任意子类型的实例。即,数组成员可以是arrytype属性值指定的类型的任意子类型,这个类型对于arraytype属性中指定的类型来说是可替换的(根据schema中的替换规则)。例如,一个整型数组可以包含从整型衍生的任意类型(如"int"或任意用户定义的从整型衍生的类型)。同样,一个"address"数组可能包含一个address的受限类型或扩展类型如"internationaladdress"。因为提供的soap-enc:array类型允许任意类型的成员,所以可以包含任意类型的混合除非使用arraytype属性加以特别的限制。在实例中,可以使用xsi:type指定成员元素的类型,或通过schema中成员元素的声明来指定。下面是两个例子。  


12345
6.789

Of  Mans  First  Disobedience,  and  the  Fruit
Of  that  Forbidden  Tree,  whose  mortal  tast
Brought  Death  into  the  World,  and  all  our  woe,

http://www.dartmouth.edu/~milton/reading_room/ 


12345
6.789

Of  Mans  First  Disobedience,  and  the  Fruit
Of  that  Forbidden  Tree,  whose  mortal  tast
Brought  Death  into  the  World,  and  all  our  woe,

http://www.dartmouth.edu/~milton/reading_room/ 
 

数组值可以是结构或其它复合值。例如"xyz:order"结构数组:  



Apple
1.56


Peach
1.48

 

数组成员值也可以是数组。下例是两个字符串数组组成的数组:  






r1c1
r1c2
r1c3


r2c1
r2c2
 

包含数组的元素无需命名为"soap-enc:array"。它可以有任意的名,只要元素的类型是soap-enc:array或由之衍生的类型。例如,下面是一个schema片断和与之一致的数组实例。  









206-555-1212
1-888-123-4567
 

数组可能是多维的。在这种情况下,在arraytype属性的asize部分将不止有一个值:  


r1c1
r1c2
r1c3
r2c1
r2c2
r2c3
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25897606/viewspace-756793/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25897606/viewspace-756793/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值