技术开发 频道

简单对象访问协议(SOAP)规范


5-4-2  数组

  SOAP数组定义为具有"SOAP-ENC:Array"类型或一个从"SOAP-ENC:Array"衍生的类型(参见规则8)。数组表示为元素值,对元素的名没有特别的约束(正如元素值并不约束它们所属的元素)。数组可以包含任意类型的元素,包括嵌套数组。可以创建新的类型(受SOAP-ENC:Array类型限制)来表示数组,如整数数组或某些用户定义的枚举。数组值表示为组成这个数组的项的元素的规则序列。在数组值中,元素名对于区分accesor并不重要。元素可以有任意的名。实际上,元素常常用它们在schema中暗示或确定的数组类型来命名元素。并且一般情况下对于复合值来说,如果数组中数组项的值是single-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:  datatypes"规范中的简单类型一致。其中包括了对"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:array类型允许任意类型的成员,所以可以包含任意类型的混合除非使用arraytype属性加以特别的限制。在实例中,可以使用xsi:type指定成员元素的类型,或通过schema中成员元素的声明来指定。下面是两个例子。 

<SOAP-enc:array  SOAP-enc:arraytype="SOAP-enc:ur-type[4]">
<thing  xsi:type="xsd:int">12345</thing>
<thing  xsi:type="xsd:decimal">6.789</thing>
<thing  xsi:type="xsd:string">
Of  Mans  First  Disobedience,  and  the  Fruit
Of  that  Forbidden  Tree,  whose  mortal  tast
Brought  Death  into  the  World,  and  all  our  woe,
</thing>
<thing  xsi:type="xsd:uriReference">http://www.dartmouth.edu/~milton/reading_room/  </thing>
</SOAP-ENC:Array>
<SOAP-ENC:Array  SOAP-ENC:arrayType="SOAP-ENC:ur-type[4]">
<SOAP-ENC:int>12345</SOAP-ENC:int>
<SOAP-ENC:decimal>6.789</SOAP-ENC:decimal>
<xsd:string>
Of  Mans  First  Disobedience,  and  the  Fruit
Of  that  Forbidden  Tree,  whose  mortal  tast
Brought  Death  into  the  World,  and  all  our  woe,
</xsd:string>
<SOAP-ENC:uriReference>http://www.dartmouth.edu/~milton/reading_room/  </SOAP-ENC:uriReference  >
</SOAP-ENC:Array> 

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

<SOAP-enc:array  SOAP-enc:arraytype="xyz:order[2]">
<Order>
<Product>Apple</Product>
<Price>1.56</Price>
</Order>
<Order>
<Product>Peach</Product>
<Price>1.48</Price>
</Order>
</SOAP-ENC:Array> 

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

<SOAP-enc:array  SOAP-enc:arraytype="xsd:string[][2]">
<item  href="#array-1"/>
<item  href="#array-2"/>
</SOAP-ENC:Array>
<SOAP-ENC:Array  id="array-1"  SOAP-ENC:arrayType="xsd:string[2]">
<item>r1c1</item>
<item>r1c2</item>
<item>r1c3</item>
</SOAP-ENC:Array>
<SOAP-ENC:Array  id="array-2"  SOAP-ENC:arrayType="xsd:string[2]">
<item>r2c1</item>
<item>r2c2</item>
</SOAP-ENC:Array> 

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

<simpletype  name="phonenumber"  base="string"/>
<element  name="ArrayOfPhoneNumbers">
<complexType  base="SOAP-ENC:Array">
<element  name="phoneNumber"  type="tns:phoneNumber"  maxOccurs="unbounded"  />
</complexType>
<anyAttribute/>
</element>
<xyz:ArrayOfPhoneNumbers  SOAP-ENC:arrayType="xyz:phoneNumber[2]">
<phoneNumber>206-555-1212</phoneNumber>
<phoneNumber>1-888-123-4567</phoneNumber>
</xyz:ArrayOfPhoneNumbers> 

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

<SOAP-enc:array  SOAP-enc:arraytype="xsd:string[2,3]">
<item>r1c1</item>
<item>r1c2</item>
<item>r1c3</item>
<item>r2c1</item>
<item>r2c2</item>
<item>r2c3</item>
</SOAP-ENC:Array> 

  虽然上面的例子把数组编码为独立的元素,但元素值也可以是嵌入形式,而且若元素值是single  reference时,必须编码为嵌入形式。下例是一个schema片断,电话号码数组嵌入到一个类型为"person"的结构中,并且通过accessor  "phone-numbers"访问它: 

<simpletype  name="phonenumber"  base="string"/>
<element  name="ArrayOfPhoneNumbers">
<complexType  base="SOAP-ENC:Array">
<element  name="phoneNumber"  type="tns:phoneNumber"  maxOccurs="unbounded"/>
</complexType>
<anyAttribute/>
</element>
<element  name="Person">
<complexType>
<element  name="name"  type="string"/>
<element  name="phoneNumbers"  type="tns:ArrayOfPhoneNumbers"/>
</complexType>
</element>
<xyz:Person>
<name>John  Hancock</name>
<phoneNumbers  SOAP-ENC:arrayType="xyz:phoneNumber[2]">
<phoneNumber>206-555-1212</phoneNumber>
<phoneNumber>1-888-123-4567</phoneNumber>
</phoneNumbers>
</xyz:Person> 

下面的例子中,数组值为single-reference,被编码为嵌入元素,包含它的元素名即为入口名: 

<xyz:purchaseorder>
<CustomerName>Henry  Ford</CustomerName>
<ShipTo>
<Street>5th  Ave</Street>
<City>New  York</City>
<State>NY</State>
<Zip>10010</Zip>
</ShipTo>
<PurchaseLineItems  SOAP-ENC:arrayType="Order[2]">
<Order>
<Product>Apple</Product>
<Price>1.56</Price>
</Order>
<Order>
<Product>Peach</Product>
<Price>1.48</Price>
</Order>
</PurchaseLineItems>
</xyz:PurchaseOrder> 

5-4-2-1  部分储值(partially  transmitted)数组

  SOAP提供了对部分储值(partially  transmitted)数组的支持,如某些上下文中的可变数组。一个partially  transmitted  数组由一个"SOAP-ENC:offset"属性(从第一个transmitted的元素开始的偏移量,基于0)指示。如果省略,偏移量取0。下面的例子中数组的大小为5,但只有从0起,第三和第四个元素被储值。 

<SOAP-enc:array  ;SOAP-enc:arraytype="xsd:string[5]"  ;SOAP-enc:offset="[2]">
<item>The  third  element</item>
<item>The  fourth  element</item>
</SOAP-ENC:Array> 

5-4-2-2  稀疏数组sparse  arrays

  SOAP提供了对稀疏数组的支持。每个表示成员值的元素包含一个"SOAP-ENC:position"属性,用来指示它在数组中的位置。下例是两维字符串稀疏数组的例子,数组大小是4,但只用到第2个。 

<SOAP-enc:array  SOAP-enc:arraytype="xsd:string[,][4]">
<SOAP-ENC:Array  href="#array-1"  SOAP-ENC:position="[2]"/>
</SOAP-ENC:Array>
<SOAP-ENC:Array  id="array-1"  SOAP-ENC:arrayType="xsd:string[10,10]">
<item  SOAP-ENC:position="[2,2]">Third  row,  third  col</item>
<item  SOAP-ENC:position="[7,2]">Eighth  row,  third  col</item>
</SOAP-ENC:Array> 

如果对array-1的引用仅发生在数组内部,上例也可以编码如下: 

<SOAP-enc:array  SOAP-enc:arraytype="xsd:string[,][4]">
<SOAP-ENC:Array  SOAP-ENC:position="[2]"  SOAP-ENC:arrayType="xsd:string[10,  10]>
<item  SOAP-ENC:position="[2,2]">Third  row,  third  col</item>
<item  SOAP-ENC:position="[7,2]">Eighth  row,  third  col</item>
</SOAP-ENC:Array>
</SOAP-ENC:Array>

0
相关文章