📄 soap4.htm
字号:
<P></P>
<P>SOAP数组必须包含一个“enc:arrayType”属性,其中定义的包含元素的值的类型与维数一起描述了该数组。”enc:arrayType”属性的值定义如下:</P>
<P></P>
<P><BR><BR>arrayTypeValue <BR>= <BR>atype asize </P>
<P><BR>atype <BR>= <BR>QName *( rank ) </P>
<P><BR>rank <BR>= <BR>"[" *( "," ) "]" </P>
<P><BR>asize <BR>= <BR>"[" #length "]" </P>
<P><BR>length <BR>= <BR>1*DIGIT </P>
<P><BR>“atype”结构是数组所包含的元素的类型的名,首先它包含一个QName表示,QName应在XML
Schema元素声明中的“type”属性中出现,QName是一个型约束(意味着所有其包含的元素都应宣称与该指明的类型相一致,也就是说,在enc:arrayType中引用的类型必须是所有数组元素的类型或超类型)。对于那些数组的数组或是“jagged
arrays”,使用rank结构来表示数组的元素是一个数组,同时该数组的具体类型将在下层具体成员数组的定义时数值实例化,rank中出现零个、一个到多个逗号,表明该成员变量是一维、二维或多维数组。对于多维数组,维数定义为一个由“,”分隔的维数序列,每个维数的记数基数为1。</P>
<P></P>
<P>“asize”结构包含一个由逗号分隔的由零个、一个或多个整数组成的序列指明的数组的每个维的长度。一个由零个整数组成的序列表明对数组打下并没有特别限制,不过具体的大小将由下层具体的成员来决定。</P>
<P></P>
<P>例如,一个有5个成员的数组,成员类型为integer数组,它的arrayTypeValue的值就应当是
“int[][5]”。其中,atype的值是“int[]”,asize的值是“[5]”。类似地,一个有3个成员的数组,成员类型为integer二维数组,它的arrayTypeValue的值就应当是
“int[,][3]”。其中,atype的值是“int[,]”,asize的值是“[3]”。</P>
<P></P>
<P>SOAP数组成员可以包含一个“enc:offset”属性来指明该成员在其装载的数组中的偏移量。这也可以用于指明在一个部分描述的数组中成员的偏移(参阅
section
5.4.2.1)。类似的,SOAP数组成员可以包含一个“enc:position”属性来指明该成员在其装载的数组中的位置。这也可以用于指明在一个稀疏描述的数组中成员的位置(参阅
section 5.4.2.2)。“enc:offset”和“enc:position”属性的值定义为:</P>
<P></P>
<P><BR><BR>arrayPoint <BR>= <BR>"[" #length "]" </P>
<P><BR>他们的基数都是0。</P>
<P></P>
<P></P>
<P>NULL值和默认值可以在存取标识元素中省略。NULL值可以在一个存取标识元素中使用一个值为1的属性xsi:null来指明,或者可以是其他依赖于应用程序的属性和值。</P>
<P></P>
<P>注意rule 2允许独立元素和数组中成员元素对于包含的类型可以有不同的名。</P>
<P></P>
<P>5.2 简单类型</P>
<P><BR>对于简单类型,SOAP采用了在“XML Schema Part 2: Datatypes”[11]的“Build-in
datatypes”节中定义的所有类型,包括值和词汇空间(lexical spaces)。例子包括:</P>
<P></P>
<P><BR><BR>Type <BR>Example </P>
<P><BR>int <BR>58502 </P>
<P><BR>float <BR>314159265358979E+1 </P>
<P><BR>negativeInteger <BR>-32768 </P>
<P><BR>string <BR>Louis "Satchmo" Armstrong </P>
<P><BR>在XML
Schema规范中声明的数据类型可以直接在元素模式中使用。而源于这些类型的类型也可以被使用。下面是一个模式片段和相应类型元素数据的例子:</P>
<P></P>
<P></P>
<P>Example 7</P>
<P><BR><!-- schema document --><xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element
name="age" type="xs:int" /> <xs:element name="height"
type="xs:float" /> <xs:element name="displacement"
type="xs:negativeInteger" /> <xs:element name="color" >
<xs:simpleType base="xsd:string"> <xs:restriction
base="xs:string" > <xs:enumeration value="Green"/>
<xs:enumeration value="Blue"/> </xs:restriction>
</xs:simpleType> </xs:element></xs:schema></P>
<P><BR>Schema with simple types</P>
<P><BR>以下是一些合法的元素实例:</P>
<P></P>
<P></P>
<P>Example 8</P>
<P><BR><!-- Example instance elements
--><age>45</age><height>5.9</height><displacement>-450</displacement><color>Blue</color></P>
<P><BR>Message fragment corresponding to the schema in Example 7</P>
<P><BR>无论简单值类型是在“XML Schema Part 2: Datatypes”规范[11]中定义,还是基于XML
Schema规范所提供的类型定义机制,都必须被编码为元素的内容。</P>
<P></P>
<P>如果一个简单值被编码为一个独立元素或一个异构数组的元素,这就很方便有一个对应于数据类型的元素声明。因为“XML Schema
Part 2:
Datatypes”规范[11]中包含了类型定义,但没有包含对应元素的声明,而enc模式和命名空间为每个简单数据类型声明了一个元素。这些是可以被使用的。</P>
<P></P>
<P></P>
<P>Example 9</P>
<P><BR><enc:int
xmlns:enc="http://www.w3.org/2001/06/soap-encoding"
id="int1">45</enc:int></P>
<P></P>
<P><BR>5.2.1 字符串</P>
<P><BR>“string”数据类型在“XML Schema Part 2:
Datatypes”[11]中被定义。值得注意的是在许多数据库或编程语言中,“string”类型并不是一致的,在某些特别的语言中,可能只允许一些字符能出现在“string”中。(这些值可能需要表示为xsd:string之外的一些数据类型)</P>
<P></P>
<P>一个字串可以被编码为一个单引用或多引用值。</P>
<P></P>
<P>包含string值的元素可以有一个“id”属性。额外的存取标识元素可以有匹配它的“href”属性。</P>
<P></P>
<P>例如,如果有两个对同一string的存取标识出现,则可以表现为:</P>
<P></P>
<P></P>
<P>Example 10</P>
<P><BR><greeting
id="String-0">Hello</greeting><salutation
href="#String-0"/></P>
<P><BR>Two accessors for the same string</P>
<P><BR>无论如何,事实上对一个string(或者是string的子类型)的实例加以两个引用与将他们编码成两个单引用值并没有本质的区别:</P>
<P></P>
<P></P>
<P>Example 11</P>
<P><BR><greeting>Hello</greeting><salutation>Hello</salutation></P>
<P><BR>Two accessors for the same string</P>
<P><BR>对于这些例子的模式描述可能是:</P>
<P></P>
<P></P>
<P>Example 12</P>
<P><BR><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:enc="http://www.w3.org/2001/06/soap-encoding" >
<xs:import namespace="http://www.w3.org/2001/06/soap-encoding"
/> <xs:element name="greeting" type="enc:string" />
<xs:element name="salutation" type="enc:string"
/></xs:schema></P>
<P><BR>Schema for Example 11</P>
<P><BR>(在这个例子中,用于描述元素类型的enc:string类型是一个方便的方法,来描述一个元素的类型是“xsd:string”,并且它可以附带“id”
和“href”属性。可以参阅SOAP Encoding模式来得到确切的定义。模式也可以使用这些SOAP
Encoding模式中的声明,但不是必须的。)</P>
<P></P>
<P>5.2.2 枚举</P>
<P><BR>“XML Schema Part 2:
Datatypes”规范[11]定义了一种称为“玫举(enumeration)”的机制。SOAP数据模型直接采用了这个机制。可是,由于编程语言及其他语言在定义玫举上存在着一些细微的差别,因此我们在这里描述了更详细的概念,并描述了如何将一个成为玫举列表成员的值进行编码。具体的,它编码为该值的名。</P>
<P></P>
<P>在概念上,“玫举”表示了一组不同的名。一个具体的玫举是一个符合基本类型的不同值的具体列表。例如,颜色名(“Green”,
“Blue”, “Brown”)的集合可以被定义为一个基于内置string类型的玫举, 值(“1”, “3”,
“5”)则可能是一个基于integer的玫举,等等。“XML Schema Part 2:
Datatypes”规范[11]支持除boolean外所有简单类型的玫举。“XML Schema Part 2:
Structures”规范[10]语言可以用于定义玫举类型。如果一个模式是从另一种符号体系生成过来而没有具体的基本类型可应用,那么就使用“string”。在下面的模式例子“EyeColor”被定义为一个string的玫举,其可能的值包括“Green”、“Blue”、“Brown”,同时实例数据也对应地给出了。</P>
<P></P>
<P></P>
<P>Example 13</P>
<P><BR><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.org/2001/06/samples"
targetNamespace="http://example.org/2001/06/samples" >
<xs:element name="EyeColor" type="tns:EyeColor" />
<xs:simpleType name="EyeColor" > <xs:restriction
base="xs:string" > <xs:enumeration value="Green" />
<xs:enumeration value="Blue" /> <xs:enumeration
value="Brown" /> </xs:restriction>
</xs:simpleType></xs:schema></P>
<P><BR>Schema with enumeration</P>
<P><BR> </P>
<P></P>
<P></P>
<P>Example 14</P>
<P><BR><p:EyeColor xmlns:p="http://example.org/2001/06/samples"
>Brown</p:EyeColor></P>
<P><BR>Message fragment corresponding to the schema in Example
13</P>
<P><BR>5.2.3 字节数组</P>
<P><BR>一个Byte数组可以编码为单引用或多引用值。Byte数组的编码规则与string是类似的。</P>
<P></P>
<P>特别的,包含Byte数组值的元素可以有一个“id”属性。额外的存取标识元素可以有一个用于匹配的“href”属性。</P>
<P></P>
<P>对一个不透明的Byte数组的推荐表示是使用在XML
Schema规范[10][11]中定义的“base64”编码方式,具体编码算法是在RFC
2045[13]中定义。不过,MIME中base64编码数据的数据行长度限制在SOAP中将不存在。SOAP中应使用“enc:base64”子类型来定义base64编码。</P>
<P></P>
<P></P>
<P>Example 15</P>
<P><BR><picture
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2001/06/soap-encoding"
xsi:type="enc:base64" >
aG93IG5vDyBicm73biBjb3cNCg==</picture></P>
<P><BR>Image with base64 encoding</P>
<P><BR>5.3 多态存取标识</P>
<P><BR>许多语言允许存取标识可以多态地访问数个类型的值,在运行时刻每个类型都是可使用的。一个多态存取标识实例必须包含一个“xsi:type”属性以描述类型的实际值。</P>
<P></P>
<P>例如,一个名为“cost”带有类型为“xsd:float”的值的多态存取标识可以编码为:</P>
<P></P>
<P></P>
<P>Example 16</P>
<P><BR><cost
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:float">29.95</cost></P>
<P><BR>Polymorphic accessor</P>
<P><BR>与之相对的是一个值类型不变的cost存取标识。</P>
<P></P>
<P></P>
<P>Example 17</P>
<P><BR><cost>29.95</cost></P>
<P><BR>Accessor whose value type is invariant</P>
<P><BR>5.4 复合类型</P>
<P><BR>SOAP依照在程序语言中常常看见的以下结构模式来定义复合类型:</P>
<P></P>
<P></P>
<P>Struct </P>
<P></P>
<P>“struct”是一个复合类型值,其成员的存取标识名是相互区别的唯一标志,应彼此各不相同。</P>
<P></P>
<P>Array </P>
<P></P>
<P>“array”是一个复合类型值,其成员的顺序位置是相互区别的唯一标志。</P>
<P></P>
<P>SOAP也允许数据的编序即不是Struct也不是Array,例如在Directed-Labeled-Graph数据模型中单个数据结点有很多不同的存取标识,其中有些会出现多次。SOAP遍序并不需要下层的数据模型要区别存取标识的次序区别,但如果有这种次序存在的话,那么存取标识必须按照该次序编码。</P>
<P></P>
<P>5.4.1 复合值及对值的引用</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -