📄 soap协议规范.htm
字号:
<TR>
<TD width="23%">negativeInteger</TD>
<TD width="77%">-32768</TD></TR>
<TR>
<TD width="23%">string</TD>
<TD width="77%">Louis "Satchmo"
Armstrong</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>在XML
Schema规范中声明的数据类型可以直接用在元素schema中,也可以使用从这些类型衍生的新类型。一个schema和对应的具有这些类型的元素的数据实例的例子如下所示:</P>
<BLOCKQUOTE>
<P><element name="age" type="int"/> <BR><element name="height"
type="float"/> <BR><element name="displacement"
type="negativeInteger"/> <BR><element name="color">
<BR><simpleType base="xsd:string"> <BR><enumeration
value="Green"/> <BR><enumeration value="Blue"/>
<BR></simpleType> <BR></element>
<BR><age>45</age> <BR><height>5.9</height>
<BR><displacement>-450</displacement>
<BR><color>Blue</color></P></BLOCKQUOTE>
<P>所有简单值必须编码为元素的内容,它的类型或者在"XML Schema Part 2:
Datatypes"规范[11]中定义过,或者是基于一个用XML
Schema规范提供的机制能推衍生出的类型。如果一个简单值编码为独立元素或异质数组成员,那么有一个对应于数据类型的元素声明将会很方便。因为"XML
Schema Part 2: Datatypes"规范[11]包括了类型定义,但是不包括对应的元素声明,SOAP-ENC
schema和名域为每个简单数据类型声明了一个元素,如<SOAP-ENC:int
id="int1">45</SOAP-ENC:int></P>
<H4>5.2.1 字符串</H4>
<P>字符串数据类型的定义在"XML Schema Part 2:
Datatypes"规范[11]中。注意,这不同于许多数据库和程序语言中的"string"类型,特别的,字符串数据类型可能禁止某些在那些语言中允许的字符。(这些值必须用xsd:string之外的数据类型表示)一个字符串可能编码为一个single-reference
或 multi-reference值。包含字符串值的元素可能有一个"id"属性。附加的accessor元素可能有对应的"href"属性。
<BR>例如,同一字符串的两个accessor可能以如下形式出现:</P>
<BLOCKQUOTE>
<P><greeting id="String-0">Hello</greeting>
<BR><salutation href="#String-0"/> </P></BLOCKQUOTE>
<P>但是,如果两个accessor参考同一字符串实例(或字符串的子类型),这不是一个实质问题,它们可以编码为两个single-reference值,如下所示:</P>
<BLOCKQUOTE>
<P><greeting>Hello</greeting>
<BR><salutation>Hello</salutation></P></BLOCKQUOTE>
<P>这个例子的schema片断如下所示:</P>
<BLOCKQUOTE>
<P><element name="greeting" type="SOAP-ENC:string"/>
<BR><element name="salutation"
type="SOAP-ENC:string"/></P></BLOCKQUOTE>
<P>在这个例子中,SOAP-ENC:string类型用作元素的类型,这是声明数据类型是"xsd:string"且允许"id"
和"href"属性的元素的简便方法。精确定义参见SOAP编码schema。Schemas可以使用这些源自SOAP编码schema的声明,但也可以不这样做。</P>
<H4>5.2.2 Enumerations</H4>
<P>"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显示如下。</P>
<BLOCKQUOTE>
<P><element name="EyeColor" type="tns:EyeColor"/>
<BR><simpleType name="EyeColor" base="xsd:string">
<BR><enumeration value="Green"/> <BR><enumeration
value="Blue"/> <BR><enumeration value="Brown"/>
<BR></simpleType> <BR><Person> <BR><Name>Henry
Ford</Name> <BR><Age>32</Age>
<BR><EyeColor>Brown</EyeColor>
<BR></Person></P></BLOCKQUOTE>
<H4>5.2.3 字符数组</H4>
<P>一个字符数组可能编码为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。</P>
<BLOCKQUOTE>
<P><picture xsi:type="SOAP-ENC:base64">
<BR>aG93IG5vDyBicm73biBjb3cNCg== <BR></picture></P></BLOCKQUOTE>
<H4>5.3 多态accessor</H4>
<P>许多语言允许能够多态访问多种类型值的accessor,每种类型在运行时可用。一个多态accessor实例必须包含一个"xsi:type"属性描述实际值的类型。例如,一个名为"cost"类型值为"xsd:float"的多态accessor编码如下:</P>
<P><cost
xsi:type="xsd:float">29.95</cost>与之对比,类型值不变的accessor编码如下:</P>
<P><cost>29.95</cost></P>
<H4>5.4 Compound types复合类型</H4>
<P>SOAP定义了与下列常在程序语言中出现的结构性模式对应的类型:
<UL>
<LI>结构:一个"struct"是一个复合值,它的成员值的唯一区别是accessor名称,任意两个accessor名称都不相同。
<LI>数组:一个"array"是一个复合值,它的成员值的唯一区别是序数位置。 </LI></UL>
<P>SOAP也允许结构和数组之外的其它数据的序列化,例如Directed-Labeled-Graph Data
Model之类的数据中,单个节点有许多不同的accssor,有些不止出现一次。SOAP序列化规则不要求底层的数据模型在accssor之间区分次序,但如果有这样的次序的话,这些accssor必须按照这个顺序编码。</P>
<H4>5.4.1 复合值,结构和值引用</H4>
<P>复合值的成员编码为accessor元素。当accessor由名区分时(如结构),accessor名即作为元素名。名局部于类型的accessor有不受限的名,其它的accessor则有受限的名。下面的例子是类型为"Book"的结构:</P>
<BLOCKQUOTE>
<P><e:Book> <BR><author>Henry Ford</author>
<BR><preface>Prefatory text</preface> <BR><intro>This
is a book.</intro> <BR></e:Book></P></BLOCKQUOTE>
<P>以下是描述上面结构的schema片断:</P>
<BLOCKQUOTE>
<P><element name="Book"> <BR><complexType> <BR><element
name="author" type="xsd:string"/> <BR><element name="preface"
type="xsd:string"/> <BR><element name="intro"
type="xsd:string"/> <BR></complexType>
<BR></e:Book></P></BLOCKQUOTE>
<P>以下是一个同时具有简单和复杂成员类型的例子。它显示两层引用。注意"Author"accssor元素的"href"属性是对相应具有"id"属性的值的引用。"Address"与之类似。</P>
<BLOCKQUOTE>
<P><e:Book> <BR><title>My Life and Work</title>
<BR><author href="#Person-1"/> <BR></e:Book>
<BR><e:Person id="Person-1"> <BR><name>Henry
Ford</name> <BR><address href="#Address-2"/>
<BR></e:Person> <BR><e:Address id="Address-2">
<BR><email>mailto:henryford@hotmail.com</email>
<BR><web>http://www.henryford.com</web>
<BR></e:Address></P></BLOCKQUOTE>
<P>当"Person"的值和"Address"的值是multi-reference时,上面的形式是正确的。如果它
<BR>们是single-reference,就必须用嵌入的形式,如下所示:</P>
<BLOCKQUOTE>
<P><e:Book> <BR><title>My Life and Work</title>
<BR><author> <BR><name>Henry Ford</name>
<BR><address>
<BR><email>mailto:henryford@hotmail.com</email>
<BR><web>http://www.henryford.com</web> <BR></address>
<BR></author> <BR></e:Book></P></BLOCKQUOTE>
<P>如果添加一个限制,任意两个人都不会有相同的地址,并且地址可以是街道或Email地址,一本书可以有两个作者,编码如下:</P>
<BLOCKQUOTE>
<P><e:Book> <BR><title>My Life and Work</title>
<BR><firstauthor href="#Person-1"/> <BR><secondauthor
href="#Person-2"/> <BR></e:Book> <BR><e:Person
id="Person-1"> <BR><name>Henry Ford</name>
<BR><address xsi:type="m:Electronic-address">
<BR><email>mailto:henryford@hotmail.com</email>
<BR><web>http://www.henryford.com</web> <BR></address>
<BR></e:Person> <BR><e:Person id="Person-2">
<BR><name>Samuel Crowther</name> <BR><address
xsi:type="n:Street-address"> <BR><street>Martin Luther King
Rd</street> <BR><city>Raleigh</city>
<BR><state>North Carolina</state> <BR></address>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -