asp学习网: 首页 >> asp.net >> SOAP:简单对象访问协议

SOAP:简单对象访问协议


5.2.3 字符数组
一个字符数组可能编码为single-reference 或multi-reference值。字符数组的编码规
则与字符串的编码规则类似。
特别的,包含字符数组的元素值可能由一个"id"属性,附加的accssor元素可能有相应的
"href"属性。
推荐使用定义在XML Schemas [10][11]中的'base64'编码(使用在2045 [13]中定义的b
ase64编码算法)表示模糊字符数组。不过,由于行长度(line length)的限制,通常
在MIME中应用base64编码,SOAP中一般不应用base64编码。但是提供了"SOAP-ENC:base
64"子类型使之能用于SOAP。
<picture xsi:type="SOAP-ENC:base64">
aG93IG5vDyBicm73biBjb3cNCg==
</picture>
5.3 多态accessor
许多语言允许能够多态访问多种类型值的accessor,每种类型在运行时可用。一个多态
accessor实例必须包含一个"xsi:type"属性描述实际值的类型。
例如,一个名为"cost"类型值为"xsd:float"的多态accessor编码如下:
<cost xsi:type="xsd:float">29.95</cost>
与之对比,类型值不变的accessor编码如下:
<cost>29.95</cost>
5.4 Compound types复合类型
SOAP定义了与下列常在程序语言中出现的结构性模式对应的类型:
结构
一个"struct"是一个复合值,它的成员值的唯一区别是accessor名称,任意两个access
or名称都不相同。
数组
一个"array"是一个复合值,它的成员值的唯一区别是序数位置。
SOAP也允许结构和数组之外的其它数据的序列化,例如Directed-Labeled-Graph Data
Model之类的数据中,单个节点有许多不同的accssor,有些不止出现一次。SOAP序列化
规则不要求底层的数据模型在accssor之间区分次序,但如果有这样的次序的话,这些a
ccssor必须按照这个顺序编码。
5.4.1 复合值,结构和值引用
复合值的成员编码为accessor元素。当accessor由名区分时(如结构),accessor名即
作为元素名。名局部于类型的accessor有不受限的名,其它的accessor则有受限的名。

下面的例子是类型为"Book"的结构:
<e:Book>
<author>Henry Ford</author>
<preface>Prefatory text</preface>
<intro>This is a book.</intro>
</e:Book>
以下是描述上面结构的schema片断:
<element name="Book">
<complexType>
<element name="author" type="xsd:string"/>
<element name="preface" type="xsd:string"/>
<element name="intro" type="xsd:string"/>
</complexType>
</e:Book>
以下是一个同时具有简单和复杂成员类型的例子。它显示两层引用。注意"Author"accs
sor元素的"href"属性是对相应具有"id"属性的值的引用。"Address"与之类似。
<e:Book>
<title>My Life and Work</title>
<author href="#Person-1"/>
</e:Book>
<e:Person id="Person-1">
<name>Henry Ford</name>
<address href="#Address-2"/>
</e:Person>
<e:Address id="Address-2">
<email>mailto:henryford@hotmail.com
<web>http://www.henryford.com
</e:Address>
当"Person"的值和"Address"的值是multi-reference时,上面的形式是正确的。如果它
们是single-reference,就必须用嵌入的形式,如下所示:
<e:Book>
<title>My Life and Work</title>
<author>
<name>Henry Ford</name>
<address>
<email>mailto:henryford@hotmail.com
<web>http://www.henryford.com
</address>
</author>
</e:Book>
如果添加一个限制,任意两个人都不会有相同的地址,并且地址可以是街道或Email地址
,一本书可以有两个作者,编码如下:
<e:Book>
<title>My Life and Work</title>
<firstauthor href="#Person-1"/>
<secondauthor href="#Person-2"/>
</e:Book>
<e:Person id="Person-1">
<name>Henry Ford</name>
<address xsi:type="m:Electronic-address">
<email>mailto:henryford@hotmail.com
<web>http://www.henryford.com
</address>
</e:Person>
<e:Person id="Person-2">
<name>Samuel Crowther</name>
<address xsi:type="n:Street-address">
<street>Martin Luther King Rd</street>
<city>Raleigh</city>
<state>North Carolina</state>
</address>
</e:Person>
序列化可以包含对不在同一个资源的值的引用:
<e:Book>
<title>Paradise Lost</title>
<firstauthor href="http://www.dartmouth.edu/~milton//>
</e:Book>
以下是描述上面结构的schema片断:
<element name="Book" type="tns:Book"/>
<complexType name="Book">
<!-- Either the following group must occur or else the
href attribute must appear, but not both. -->
<sequence minOccurs="0" maxOccurs="1">
<element name="title" type="xsd:string"/>
<element name="firstauthor" type="tns:Person"/>
<element name="secondauthor" type="tns:Person"/>
</sequence>
<attribute name="href" type="uriReference"/>
<attribute name="id" type="ID"/>
<anyAttribute namespace="##other"/>
</complexType>
<element name="Person" base="tns:Person"/>
<complexType name="Person">
<!-- Either the following group must occur or else the
href attribute must appear, but not both. -->
<sequence minOccurs="0" maxOccurs="1">
<element name="name" type="xsd:string"/>
<element name="address" type="tns:Address"/>
</sequence>
<attribute name="href" type="uriReference"/>
<attribute name="id" type="ID"/>
<anyAttribute namespace="##other"/>
</complexType>
<element name="Address" base="tns:Address"/>
<complexType name="Address">
<!-- Either the following group must occur or else the
href attribute must appear, but not both. -->
<sequence minOccurs="0" maxOccurs="1">
<element name="street" type="xsd:string"/>
<element name="city" type="xsd:string"/>
<element name="state" type="xsd:string"/>
</sequence>
<attribute name="href" type="uriReference"/>
<attribute name="id" type="ID"/>
<anyAttribute namespace="##other"/>
</complexType>
5.4.2 数组
SOAP数组定义为具有"SOAP-ENC:Array"类型或一个从"SOAP-ENC:Array"衍生的类型(参
见规则8)。数组表示为元素值,对元素的名没有特别的约束(正如元素值并不约束它们
所属的元素)。
数组可以包含任意类型的元素,包括嵌套数组。可以创建新的类型(受SOAP-ENC:Array
类型限制)来表示数组,如整数数组或某些用户定义的枚举。
数组值表示为组成这个数组的项的元素的规则序列。在数组值中,元素名对于区分acce
sor并不重要。元素可以有任意的名。实际上,元素常常用它们在schema中暗示或确定的
数组类型来命名元素。并且一般情况下对于复合值来说,如果数组中数组项的值是sing
le-reference值,则这个数组项包含它的值,否则,该数组项通过"href"属性引用这个
值。
下面的例子是一个整型数组的schema片断:
<element name="myFavoriteNumbers"
type="SOAP-ENC:Array"/>
<myFavoriteNumbers
SOAP-ENC:arrayType="xsd:int[2]">
<number>3</number>
<number>4</number>
</myFavoriteNumbers>
在这个例子中,数组"myFavoriteNumbers"包括几个成员,每个成员是一个类型为SOAP-
ENC:int的值。注意SOAP-ENC:Array允许不受限制的元素名,它们不传达任何类型信息,
所以在使用时,或者它们有xsi:type属性,或者它们所属的元素有SOAP-ENC:arrayType
属性。自然,由SOAP-ENC:Array衍生的类型可以声明局部元素,但这种情况下要包括类
型信息。
上面已经提到,SOAP-ENC schema包含了元素的声明,元素名与"XML Schema Part 2: D
atatypes"规范[11]中的简单类型一致。其中包括了对"Array"的声明。于是,我们可以
这样写:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:int[2]">
<SOAP-ENC:int>3</SOAP-ENC:int>
<SOAP-ENC:int>4</SOAP-ENC:int>
</SOAP-ENC:Array>
数组可以包含特定arrayType的任意子类型的实例。即,数组成员可以是arryType属性值
指定的类型的任意子类型,这个类型对于arrayType属性中指定的类型来说是可替换的(
根据schema中的替换规则)。例如,一个整型数组可以包含从整型衍生的任意类型(如
"int"或任意用户定义的从整型衍生的类型)。同样,一个"address"数组可能包含一个
address的受限类型或扩展类型如"internationalAddress"。因为提供的SOAP-ENC:Arra
y类型允许任意类型的成员,所以可以包含任意类型的混合除非使用arrayType属性加以
特别的限制。

from:asp学习网/title:SOAP:简单对象访问协议/ time:2007-6-18 10:41:59

本文主题SOAP

asp教程 ©2006-2007 aspxuexi.com | 关于站点 | 版权隐私 | 站内搜索
复制或者翻版 请于夜间进行