直播中
SOAP編碼風格是基于一個簡單類型系統(tǒng),而這個系統(tǒng)是程序語言、數據庫和半結構數據中類型系統(tǒng)的公共特性的泛化。一個類型要么是一個簡單(可量化的)類型或是一個復合類型,這個復合類型由多個部分組成,每個部分是一個類型。下面會有類型的更為詳細的描述。本節(jié)定義了一個編序規(guī)則,用于可類型化對象圖的編序。它在兩個級別上操作。首先,給出一個符號上一致化的由該類型系統(tǒng)描述的模式,構造一個XML語法層的模式。其次,提供一個類型系統(tǒng)的模式以及一個與該模式相一致的值的表示方法,構造一個XML實例層的模式。反之,先提供一個符合這些規(guī)則XML實例,然后再給出原始的模式、一個原始值表示,也是可以構造的。
在本節(jié)中定義的元素和屬性所用到的命名空間標識是"http://www.w3.org/2001/06/soap-encoding"。而這些編碼的例子中假定所有命名空間聲明都是在更高的元素層次上。
在本節(jié)中描述的數據模型和編碼風格的使用方式是被鼓勵的而不是必備的,其他的數據模型和編碼也是可以與SOAP聯(lián)合使用的(參閱 section 4.1.1)。
5.1 使用XML進行類型編碼的規(guī)則
XML允許非常柔性地編碼數據。SOAP只定義了非常有限的編碼規(guī)則。本節(jié)在一個高層次上定義編碼規(guī)則,而下一節(jié)則描述明確類型的編碼規(guī)則,當有更細節(jié)的需求的時候。本節(jié)中描述的編碼可以與Section 7中描述的RPC調用和響應的映射聯(lián)合使用。
為了描述編碼,以下術語將被使用:
“value”值是一個字符串(string)、一個可量度對象(數字、日期、玫舉)的名字、或是數個簡單值的組合。所有的值都有明確的類型。
“simple value”簡單值是是一個不可分的值,它不包含任意可以命名的部分。簡單值的離子可以是特定的字符串、證書或玫舉值等。
“compound value”復合值是一個值的關系的聚集。復合值的例子可以是特定的采購定單、存貨報表、街道地址等。
在一個復合值中,每一個相關的值都可以用一個角色名來區(qū)分,也可以用一個序數來區(qū)分,當然也可以同時使用兩者。這被稱為“accessor”存取標識。復合值的離子包括特定的采購定單、存貨報表等。數組也是復合值。它可以被看成是具有多個相同名字的存取標識(accessor)的復合值,例如RDF。
“array”數組是一個復合值,在其成員值之間僅有順序位置不同。
“struct”結構是一個復合值,在其成員值之間的區(qū)分是依靠存取標識(accessor)。同時所有存取標識的名應不同。
“simple type”簡單類型是簡單值的類。簡單類型的例子包括那些類“string”, “integer”,玫舉類等。
“compound type”復合類型是復合值的類。復合類型的例子包括采購定單的抽象類型,這些由該類型派生的采購定單具備相同的存取標識(shipTo, totalCost等),當然他們有不同的值(也許對某些值還有約束)。
在一個復合類型中,一個存取標識在本符合類型中是唯一的,如果它和其他復合類型中的某個存取標識無法相區(qū)別,則該存取標識名加上復合類型的名字才能成為唯一標識,這個名稱為"局部名"。無論該名是直接或間接基于一個URI,如果該存取標識不用加類型名約束就已經是唯一的,那該名就成為"全局名"。
值表的編序的模式中所給出的信息,是有可能能決定一些值只能關聯(lián)一個存取標識的簡單實例。對于其他可能的情況,則無法下這個斷言。一個值被稱為”single-reference”單引用,如果只有一個存取標識能夠引用它。如果能被多個引用,無論是事實上還是潛在可能,那就是”multi-reference”多引用。注意有可能在一模式中有一個確定的值是單引用而其他則是多引用。
在句法上,一個元素可以是"獨立的"或"嵌入的"。一個獨立的元素是作為編序中一個頂級元素出現(xiàn)。而其他則是嵌入元素。
盡管使用xsi:type屬性可以令值的表示為自描述的,也就是說即包含值的結構也包含值的類型,但編序規(guī)則允許值的類型可以僅僅引用模式(Schema)中的類型定義。而這些模式可以使用“XML Schema Part 1: Structures”[10]和“XML Schema Part 2: Datatypes”[11]中定義的規(guī)范來描述,當然也可以使用其他的模式定義來定義。注意盡管這樣,但許多模式定義只支持結構(struct)和數組(array)類型,而編序規(guī)則則有可能要嘗試使用結構(struct)和數組(array)類型之外的復合類型。
編序規(guī)則如下:
所有的值都應當表現(xiàn)為元素的內容(content)。一個多引用的值必須被表示為一個獨立元素的內容。而一個單引用的值應該不如此(不過也可以如此)。
對每個包含一個值的元素,值的類型表示必須滿足以下至少一個條件:(a) 包含該值的元素實例包含一個xsi:type屬性,(b) 包含該值的元素實例包含在一個具備enc: arrayType屬性的元素中(可能是被設置成default的),(c) 該元素的名帶有一個類型的明確關聯(lián),而該類型由一個模式來決定。
一個簡單值應被表示為字符數據(character data),也就是說,沒有任何子元素。每一個簡單值必須有一個類型,該類型要么是在XML Schema規(guī)范的DataTypes部分[11]中被羅列,要么它的源類型應當在該部分中被羅列(可參閱 section 5.2)。
一個復合值應當被編碼為一個元素序列,其中每一個存取標識由一個嵌入元素來表示,他們的名是一一對應的。若存取標識的名在包含它的型中是局部的,則它有一個未修飾的元素名,而其他則應有完全修飾的名(可參閱 section 5.4)。
一個多引用的簡單或復合值應當被編碼為一個獨立元素,該獨立元素應包含一個局部的帶有非限制名的“id”屬性,該屬性的類型為XML規(guī)范[7]中定義的ID類型。對該值的每一個存取標識是一個空元素,該空元素有一個局部的未修飾的屬性“href”,該屬性類型是XML Schema規(guī)范[11]中定義的“uri-reference”類型,“href”屬性的值是一個引用該對應獨立元素的URI片段標識。
字串和字節(jié)數組被表示為多引用簡單類型,不過特別的規(guī)則也允許它們在通常情況下更有效地表示(可參閱 section 5.2.1以及section 5.2.3)。一個字串或字節(jié)數組的存取標識可以有一個在XML規(guī)范[7]中定義的名為”id”的ID類型的屬性。如果這樣的話,所有其他對該同一值的存取標識可以被編碼為一個空元素,該空元素應包含一個局部的帶有非限制名的“href”屬性,該屬性的類型為XML Schema規(guī)范[11]中定義的“uri-reference”類型,“href”屬性的值是一個引用該對應獨立元素的URI片段標識。
對一個值編碼多個引用是允許的,看上去這些引用好象是引用了多個不同的值,但僅當從上下文中可得到該XML 實例的含義是未改變的的結論。
數組是復合值(可參閱 section 5.4.2)。SOAP數組被定義為類型是“enc:Array”或類型是源于“enc:Array”。
SOAP數組有一或多維,而它的成員由順序位置區(qū)分。一個數組的值被表示為一序列反映該數組的元素,這些成員按序數從小到大順序出現(xiàn)。對于多維數組,則元素維按從右到左順序變化。沒一個成員元素都被命名為一個獨立元素(參閱 rule 2)。
SOAP數組可以是單引用值,也可以是多引用值,從而可以被表示為一個嵌入元素或一個獨立元素。
SOAP數組必須包含一個“enc:arrayType”屬性,其中定義的包含元素的值的類型與維數一起描述了該數組?!眅nc:arrayType”屬性的值定義如下:
arrayTypeValue
=
atype asize
atype
=
QName *( rank )
rank
=
"[" *( "," ) "]"
asize
=
"[" #length "]"
length
=
1*DIGIT
“atype”結構是數組所包含的元素的類型的名,首先它包含一個QName表示,QName應在XML Schema元素聲明中的“type”屬性中出現(xiàn),QName是一個型約束(意味著所有其包含的元素都應宣稱與該指明的類型相一致,也就是說,在enc:arrayType中引用的類型必須是所有數組元素的類型或超類型)。對于那些數組的數組或是“jagged arrays”,使用rank結構來表示數組的元素是一個數組,同時該數組的具體類型將在下層具體成員數組的定義時數值實例化,rank中出現(xiàn)零個、一個到多個逗號,表明該成員變量是一維、二維或多維數組。對于多維數組,維數定義為一個由“,”分隔的維數序列,每個維數的記數基數為1。
“asize”結構包含一個由逗號分隔的由零個、一個或多個整數組成的序列指明的數組的每個維的長度。一個由零個整數組成的序列表明對數組打下并沒有特別限制,不過具體的大小將由下層具體的成員來決定。
例如,一個有5個成員的數組,成員類型為integer數組,它的arrayTypeValue的值就應當是 “int[][5]”。其中,atype的值是“int[]”,asize的值是“[5]”。類似地,一個有3個成員的數組,成員類型為integer二維數組,它的arrayTypeValue的值就應當是 “int[,][3]”。其中,atype的值是“int[,]”,asize的值是“[3]”。
SOAP數組成員可以包含一個“enc:offset”屬性來指明該成員在其裝載的數組中的偏移量。這也可以用于指明在一個部分描述的數組中成員的偏移(參閱 section 5.4.2.1)。類似的,SOAP數組成員可以包含一個“enc:position”屬性來指明該成員在其裝載的數組中的位置。這也可以用于指明在一個稀疏描述的數組中成員的位置(參閱 section 5.4.2.2)?!癳nc:offset”和“enc:position”屬性的值定義為:
arrayPoint
=
"[" #length "]"
他們的基數都是0。
NULL值和默認值可以在存取標識元素中省略。NULL值可以在一個存取標識元素中使用一個值為1的屬性xsi:null來指明,或者可以是其他依賴于應用程序的屬性和值。
注意rule 2允許獨立元素和數組中成員元素對于包含的類型可以有不同的名。
5.2 簡單類型
對于簡單類型,SOAP采用了在“XML Schema Part 2: Datatypes”[11]的“Build-in datatypes”節(jié)中定義的所有類型,包括值和詞匯空間(lexical spaces)。例子包括:
Type
Example
int
58502
float
314159265358979E+1
negativeInteger
-32768
string
Louis "Satchmo" Armstrong
在XML Schema規(guī)范中聲明的數據類型可以直接在元素模式中使用。而源于這些類型的類型也可以被使用。下面是一個模式片段和相應類型元素數據的例子:
Example 7
<!-- 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>
Schema with simple types
以下是一些合法的元素實例:
Example 8
<!-- Example instance elements --><age>45</age><height>5.9</height><displacement>-450</displacement><color>Blue</color>
Message fragment corresponding to the schema in Example 7
無論簡單值類型是在“XML Schema Part 2: Datatypes”規(guī)范[11]中定義,還是基于XML Schema規(guī)范所提供的類型定義機制,都必須被編碼為元素的內容。
如果一個簡單值被編碼為一個獨立元素或一個異構數組的元素,這就很方便有一個對應于數據類型的元素聲明。因為“XML Schema Part 2: Datatypes”規(guī)范[11]中包含了類型定義,但沒有包含對應元素的聲明,而enc模式和命名空間為每個簡單數據類型聲明了一個元素。這些是可以被使用的。
Example 9
<enc:int xmlns:enc="http://www.w3.org/2001/06/soap-encoding" id="int1">45</enc:int>
5.2.1 字符串
“string”數據類型在“XML Schema Part 2: Datatypes”[11]中被定義。值得注意的是在許多數據庫或編程語言中,“string”類型并不是一致的,在某些特別的語言中,可能只允許一些字符能出現(xiàn)在“string”中。(這些值可能需要表示為xsd:string之外的一些數據類型)
一個字串可以被編碼為一個單引用或多引用值。
包含string值的元素可以有一個“id”屬性。額外的存取標識元素可以有匹配它的“href”屬性。
例如,如果有兩個對同一string的存取標識出現(xiàn),則可以表現(xiàn)為:
Example 10
<greeting id="String-0">Hello</greeting><salutation href="#String-0"/>
Two accessors for the same string
無論如何,事實上對一個string(或者是string的子類型)的實例加以兩個引用與將他們編碼成兩個單引用值并沒有本質的區(qū)別:
Example 11
<greeting>Hello</greeting><salutation>Hello</salutation>
Two accessors for the same string
對于這些例子的模式描述可能是:
Example 12
<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>
Schema for Example 11
(在這個例子中,用于描述元素類型的enc:string類型是一個方便的方法,來描述一個元素的類型是“xsd:string”,并且它可以附帶“id” 和“href”屬性??梢詤㈤哠OAP Encoding模式來得到確切的定義。模式也可以使用這些SOAP Encoding模式中的聲明,但不是必須的。)
5.2.2 枚舉
“XML Schema Part 2: Datatypes”規(guī)范[11]定義了一種稱為“玫舉(enumeration)”的機制。SOAP數據模型直接采用了這個機制。可是,由于編程語言及其他語言在定義玫舉上存在著一些細微的差別,因此我們在這里描述了更詳細的概念,并描述了如何將一個成為玫舉列表成員的值進行編碼。具體的,它編碼為該值的名。
在概念上,“玫舉”表示了一組不同的名。一個具體的玫舉是一個符合基本類型的不同值的具體列表。例如,顏色名(“Green”, “Blue”, “Brown”)的集合可以被定義為一個基于內置string類型的玫舉, 值(“1”, “3”, “5”)則可能是一個基于integer的玫舉,等等?!癤ML Schema Part 2: Datatypes”規(guī)范[11]支持除boolean外所有簡單類型的玫舉?!癤ML Schema Part 2: Structures”規(guī)范[10]語言可以用于定義玫舉類型。如果一個模式是從另一種符號體系生成過來而沒有具體的基本類型可應用,那么就使用“string”。在下面的模式例子“EyeColor”被定義為一個string的玫舉,其可能的值包括“Green”、“Blue”、“Brown”,同時實例數據也對應地給出了。
Example 13
<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>
Schema with enumeration
Example 14
<p:EyeColor xmlns:p="http://example.org/2001/06/samples" >Brown</p:EyeColor>
Message fragment corresponding to the schema in Example 13
5.2.3 字節(jié)數組
一個Byte數組可以編碼為單引用或多引用值。Byte數組的編碼規(guī)則與string是類似的。
特別的,包含Byte數組值的元素可以有一個“id”屬性。額外的存取標識元素可以有一個用于匹配的“href”屬性。
對一個不透明的Byte數組的推薦表示是使用在XML Schema規(guī)范[10][11]中定義的“base64”編碼方式,具體編碼算法是在RFC 2045[13]中定義。不過,MIME中base64編碼數據的數據行長度限制在SOAP中將不存在。SOAP中應使用“enc:base64”子類型來定義base64編碼。
Example 15
<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>
Image with base64 encoding
5.3 多態(tài)存取標識
許多語言允許存取標識可以多態(tài)地訪問數個類型的值,在運行時刻每個類型都是可使用的。一個多態(tài)存取標識實例必須包含一個“xsi:type”屬性以描述類型的實際值。
例如,一個名為“cost”帶有類型為“xsd:float”的值的多態(tài)存取標識可以編碼為:
Example 16
<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>
Polymorphic accessor
與之相對的是一個值類型不變的cost存取標識。
Example 17
<cost>29.95</cost>
Accessor whose value type is invariant
5.4 復合類型
SOAP依照在程序語言中常??匆姷囊韵陆Y構模式來定義復合類型:
Struct
“struct”是一個復合類型值,其成員的存取標識名是相互區(qū)別的唯一標志,應彼此各不相同。
Array
“array”是一個復合類型值,其成員的順序位置是相互區(qū)別的唯一標志。
SOAP也允許數據的編序即不是Struct也不是Array,例如在Directed-Labeled-Graph數據模型中單個數據結點有很多不同的存取標識,其中有些會出現(xiàn)多次。SOAP遍序并不需要下層的數據模型要區(qū)別存取標識的次序區(qū)別,但如果有這種次序存在的話,那么存取標識必須按照該次序編碼。
5.4.1 復合值及對值的引用
復合值的成員被編碼為存取標識元素。存取標識由他們的名字來相區(qū)別(例如在struct里面),而元素名就是存取標識名。存取標識名是局部的,作用域是包含他們的類型中,具備一個未修飾的元素名,而其他則有完全修飾名。
下面是一個“Book”結構的例子:
Example 18
<e:Book xmlns:e="http://example.org/2001/06/books" > <author>Henry Ford</author> <preface>Prefactory text</preface> <intro>This is a book.</intro></e:Book>
Book structure
下面則是一個描述該結構的模式片段:
Example 19
<xs:element name="Book" xmlns:xs='http://www.w3.org/2001/XMLSchema' > <xs:complexType> <xs:sequence> <xs:element name="author" type="xs:string" /> <xs:element name="preface" type="xs:string" /> <xs:element name="intro" type="xs:string" /> </xs:sequence> </xs:complexType></xs:element>
Schema for Example 18
下面是一個即包含簡單類型成員也包含復合類型成員的類型的例子。它顯示了兩層的引用。注意“Author”存取標識元素的“href”屬性一個對匹配“id”值對應的值的引用?!癆ddress”中的情況也是類似的。
Example 20
<e:Book xmlns:e="http://example.org/2001/06/books" > <title>My Life and Work</title> <author href="#Person-1"/></e:Book><e:Person xmlns:e="http://example.org/2001/06/books" id="Person-1" > <name>Henry Ford</name> <address href="#Address-2"/></e:Person><e:Address xmlns:e="http://example.org/2001/06/books" id="Address-2" > <email>mailto:henryford@hotmail.com</email> <web>http://www.henryford.com</web></e:Address>
Book with muli-reference addresses
當“Person”和“Address”的值是需要多引用的時候,上述描述是合適的。如果使用單引用來描述,則應該是嵌入的,如下:
Example 21
<e:Book xmlns:e="http://example.org/2001/06/books" > <title>My Life and Work</title> <author> <name>Henry Ford</name> <address> <email>mailto:henryford@hotmail.com</email> <web>http://www.henryford.com</web> </address> </author></e:Book>
Book with single-reference addresses
如果這里存在著一個限制:在一個給出的實例中不允許有兩個人有同樣的地址,地址可以是一個街道地址(Street-address),也可以是一個電子地址(Electronic-address)。一本有兩個作者的書可以編碼為:
Example 22
<e:Book xmlns:e="http://example.org/2001/06/books" > <title>My Life and Work</title> <firstauthor href="#Person-1"/> <secondauthor href="#Person-2"/></e:Book><e:Person xmlns:e="http://example.org/2001/06/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Person-1" > <name>Henry Ford</name> <address xsi:type="e:ElectronicAddressType"> <email>mailto:henryford@hotmail.com</email> <web>http://www.henryford.com</web> </address></e:Person><e:Person xmlns:e="http://example.org/2001/06/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Person-2"> <name>Samuel Crowther</name> <address xsi:type="e:StreetAddressType"> <street>Martin Luther King Rd</street> <city>Raleigh</city> <state>North Carolina</state> </address></e:Person>
Book with two authors having different addresses
編序也可以包含一些不在同一資源中的值的引用:
Example 23
<e:Book xmlns:e="http://example.org/2001/06/books" > <title>Paradise Lost</title> <firstAuthor /></e:Book>
Book with external references
同時下面是一個對上面結構的模式描述片段:
Example 24
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://example.org/2001/06/books" targetNamespace="http://example.org/2001/06/books" > <xs:element name="Book" type="tns:BookType" /> <xs:complexType name="BookType" > <xs:annotation> <xs:documentation> <info> Either the following group must occur or else the href attribute must appear, but not both. </info> </xs:documentation> </xs:annotation> <xs:sequence minOccurs="0" maxOccurs="1" > <xs:element name="title" type="xs:string" /> <xs:element name="firstAuthor" type="tns:PersonType" /> <xs:element name="secondAuthor" type="tns:PersonType" /> </xs:sequence> <xs:attribute name="href" type="xs:anyURI" /> <xs:attribute name="id" type="xs:ID" /> <xs:anyAttribute namespace="##other" /> </xs:complexType> <xs:element name="Person" type="tns:PersonType" /> <xs:complexType name="PersonType" > <xs:annotation> <xs:documentation> <info> Either the following group must occur or else the href attribute must appear, but not both. </info> </xs:documentation> </xs:annotation> <xs:sequence minOccurs="0" maxOccurs="1" > <xs:element name="name" type="xs:string" /> <xs:element name="address" type="tns:AddressType" /> </xs:sequence> <xs:attribute name="href" type="xs:anyURI" /> <xs:attribute name="id" type="xs:ID" /> <xs:anyAttribute namespace="##other" /> </xs:complexType> <xs:element name="Address" base="tns:AddressType" /> <xs:complexType name="AddressType" abstract="true" > <xs:annotation> <xs:documentation> <info> Either one of the following sequences must occur or else the href attribute must appear, but not both. </info> </xs:documentation> </xs:annotation> <xs:choice> <xs:sequence minOccurs="0" maxOccurs="1" > <xs:element name="email" type="xs:string" /> <xs:element name="web" type="xs:anyURI" /> </xs:sequence> <xs:sequence minOccurs='0' maxOccurs='1' > <xs:element name="street" type="xs:string" /> <xs:element name="city" type="xs:string" /> <xs:element name="state" type="xs:string"/> </xs:sequence> </xs:choice> <xs:attribute name="href" type="xs:anyURI"/> <xs:attribute name="id" type="xs:ID"/> <xs:anyAttribute namespace="##other"/> </xs:complexType> <xs:complexType name="StreetAddressType"> <xs:annotation> <xs:documentation> <info> Either the second sequence in the following group must occur or else the href attribute must appear, but not both. </info> </xs:documentation> </xs:annotation> <xs:complexContent> <xs:restriction base="tns:AddressType" > <xs:sequence> <xs:sequence minOccurs="0" maxOccurs="0" > <xs:element name="email" type="xs:string" /> <xs:element name="web" type="xs:anyURI" /> </xs:sequence> <xs:sequence minOccurs="0" maxOccurs="1"> <xs:element name="street" type="xs:string" /> <xs:element name="city" type="xs:string" /> <xs:element name="state" type="xs:string"/> </xs:sequence> </xs:sequence> <xs:attribute name="href" type="xs:anyURI"/> <xs:attribute name="id" type="xs:ID"/> <xs:anyAttribute namespace="##other"/> </xs:restriction> </xs:complexContent> </xs:complexType> <xs:complexType name="ElectronicAddressType"> <xs:annotation> <xs:documentation> <info> Either the first sequence in the following group must occur or else the href attribute must appear, but not both. </info> </xs:documentation> </xs:annotation> <xs:complexContent> <xs:restriction base="tns:AddressType" > <xs:sequence> <xs:sequence minOccurs="0" maxOccurs="1"> <xs:element name="email" type="xs:string" /> <xs:element name="web" type="xs:anyURI" /> </xs:sequence> <xs:sequence minOccurs="0" maxOccurs="0"> <xs:element name="street" type="xs:string" /> <xs:element name="city" type="xs:string" /> <xs:element name="state" type="xs:string"/> </xs:sequence> </xs:sequence> <xs:attribute name="href" type="xs:anyURI"/> <xs:attribute name="id" type="xs:ID"/> <xs:anyAttribute namespace="##other"/> </xs:restriction> </xs:complexContent> </xs:complexType></xs:schema>
Schema for example 22
5.4.2 數組
SOAP數組被定義為類型為“enc:Array”或類型源于“enc:Array”(可參閱 rule 8)。這種類型源于"enc:Array"的類型必須遵從"enc:Array"的限制,同時它可用于表示以下情況的類型定義,譬如整型數的數組或是一些用戶自定義的枚舉類型的數組等。數組被表示為對包含其的元素的名無特殊約束的元素值(就象值一般不會約束包含元素的名)。組成數組的元素可以是任意類型,包括嵌套的數組。
數組值的表示是一個該數組組成元素的一個有序序列。作為一個數組的值,元素名對于區(qū)分存取標識并非重要。元素可以有任意的名。實際上,這些元素的命名將按照模式中聲明的建議,或由他們的類型所決定。就象在復合類型中通常情況下,如果數組中條目的值是單引用值,則該條目將包含它的值。否則,條目通過“href”屬性引用它的值。
下面是一個模式的片段以及一個包含integer成員的數組:
Example 25
<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="myFavoriteNumbers" type="enc:Array" /></xs:schema>
Schema declaring an array of integers
Example 26
<myFavoriteNumbers xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:arrayType="xs:int[2]" > <number>3</number> <number>4</number></myFavoriteNumbers>
Array conforming to the schema in Example 25
在這個例子中,“myFavoriteNumber”數組包含了幾個成員,每個成員的值的類型都是xs:int。而類型是由enc:arrayType屬性決定的。注意enc:Array的類型允許不嚴格的未修飾的元素名。這些名只傳輸了非類型的信息,因此在具體使用的時候,要么有一個xsi:type屬性,要么包含它的元素要包含一個enc:arrayType屬性。自然地,源于enc:Array的類型可以聲明帶類型信息的局部元素。
就象先前指出的,enc模式包含了一些元素名的聲明,而這些名是對應于“XML Schema Part 2: Datatypes”規(guī)范[11]中的每個簡單類型的。這也包含一個“Array”的聲明。使用這些定義,我們也許可以將顯現(xiàn)先前的描述改寫為:
Example 27
<enc:Array xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:xs="http://www.w3.org/2001/XMLSchema" enc:ArrayType="xs:int[2]" > <enc:int>3</enc:int> <enc:int>4</enc:int></enc:Array>
Using the enc:Array element
數組可以包含任意指定arrayType的子類型的實例。也就是說,成員的類型可以是任何描述在arrayType屬性中類型的可替代類型,這將依照于在模式中表示的可替代規(guī)則。因此,例如,一個整數數組可以包含任何源于integer的類型的值(例如 “int”或任何用戶定義的源于integer的類型)。類似的,一個“address”數組可以包含一個嚴格的或擴展的類型,比如“internationalAddress”。因為提供的enc:Array類型允許包含任何類型或類型混合的成員,除非有對arrayType屬性使用的特別限制。
成員元素類型在實例中可以使用xsi:type來描述,或則是在成員元素模式中聲明,就象在下面兩個數組中分別演示的那樣:
Example 28
<enc:Array xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" enc:arrayType="xs:anyType[4]"> <thing xsi:type="xs:int">12345</thing> <thing xsi:type="xs:decimal">6.789</thing> <thing xsi:type="xs: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="xs:anyURI"> http://www.dartmouth.edu/~milton/reading_room/ </thing></enc:Array>
Array with elements of varying types
Example 29
<enc:Array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:arrayType="xs:anyType[4]" > <enc:int>12345</enc:int> <enc:decimal>6.789</enc:decimal> <enc:string> Of Mans First Disobedience, and the Fruit Of that Forbidden Tree, whose mortal tast Brought Death into the World, and all our woe, </enc:string> <enc:anyURI> http://www.dartmouth.edu/~milton/reading_room/ </enc:anyURI ></enc:Array>
Array with elements of varying types
數組值可以是結構或其他復合值。例如一個“xyz:Order”結構的數組:
Example 30
<enc:Array xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:xyz="http://example.org/2001/06/Orders" enc:arrayType="xyz:Order[2]"> <Order> <Product>Apple</Product> <Price>1.56</Price> </Order> <Order> <Product>Peach</Product> <Price>1.48</Price> </Order></enc:Array>
Arrays containing structs and other compound values
數組也可以有一些成員值是數組。下面是一個有兩個數組的數組的例子,而那兩個數組都是string數組:
Example 31
<enc:Array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:arrayType="xs:string[][2]" > <item href="#array-1"/> <item href="#array-2"/></enc:Array><enc:Array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" id="array-1" enc:arrayType="xs:string[2]"> <item>r1c1</item> <item>r1c2</item> <item>r1c3</item></enc:Array><enc:Array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" id="array-2" enc:arrayType="xs:string[2]"> <item>r2c1</item> <item>r2c2</item></enc:Array>
Array containing other arrays
包含一個數組值的元素并不需要一定被命名為“enc:Array”。它可以有任意的名,而提供的類型則要么是enc:Array,要么是受源于enc:Array的限制。例如,下面是一個模式片段以及與之一致的一個實例數組:
Example 32
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:tns="http://example.org/2001/06/numbers" targetNamespace="http://example.org/2001/06/numbers" > <xs:simpleType name="phoneNumberType" > <xs:restriction base="xs:string" /> </xs:simpleType> <xs:element name="ArrayOfPhoneNumbers" type="tns:ArrayOfPhoneNumbersType" /> <xs:complexType name="ArrayOfPhoneNumbersType" > <xs:complexContent> <xs:restriction base="enc:Array" > <xs:sequence> <xs:element name="phoneNumber" type="tns:phoneNumberType" maxOccurs="unbounded" /> </xs:sequence> <xs:attributeGroup ref="enc:arrayAttributes" /> <xs:attributeGroup ref="enc:commonAttributes" /> </xs:restriction> </xs:complexContent> </xs:complexType></xs:schema>
Schema for an array
Example 33
<abc:ArrayOfPhoneNumbers xmlns:abc="http://example.org/2001/06/numbers" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:arrayType="abc:phoneNumberType[2]" > <phoneNumber>206-555-1212</phoneNumber> <phoneNumber>1-888-123-4567</phoneNumber></abc:ArrayOfPhoneNumbers>
Array conforming to the schema in Example 32
數組可以是多維的。在這種情況下,就會有多個描述維數大小的值出現(xiàn)在arrayType屬性的asize部分:
Example 34
<enc:Array xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:arrayType="xs:string[2,3]" > <item>r1c1</item> <item>r1c2</item> <item>r1c3</item> <item>r2c1</item> <item>r2c2</item> <item>r2c3</item></enc:Array>
Multi-dimensonal array
上述例子中顯示了一個數組如何被編碼為獨立元素,數組值可以以嵌套方式出現(xiàn)并且如果他們是單引用的話,應該使用這種方式。
下面是一個模式片段的例子以及符合該模式的一個嵌套在“Person”結構中的電話號碼數組,該數組可以從存取標識“phone-numbers”訪問:
Example 34
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:tns="http://example.org/2001/06/numbers" targetNamespace="http://example.org/2001/06/numbers" > <xs:import namespace="http://www.w3.org/2001/06/soap-encoding" /> <xs:simpleType name="phoneNumberType" > <xs:restriction base="xs:string" /> </xs:simpleType> <xs:element name="ArrayOfPhoneNumbers" type="tns:ArrayOfPhoneNumbersType" /> <xs:complexType name="ArrayOfPhoneNumbersType" > <xs:complexContent> <xs:restriction base="enc:Array" > <xs:sequence> <xs:element name="phoneNumber" type="tns:phoneNumberType" maxOccurs="unbounded" /> </xs:sequence> <xs:attributeGroup ref="enc:arrayAttributes" /> <xs:attributeGroup ref="enc:commonAttributes" /> </xs:restriction> </xs:complexContent> </xs:complexType> <xs:element name="Person"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string" /> <xs:element name="phoneNumbers" type="tns:ArrayOfPhoneNumbersType" /> </xs:sequence> </xs:complexType> </xs:element></xs:schema>
Schema fragment for array of phone numbers embedded in a struct
Example 35
<def:Person xmlns:def="http://example.org/2001/06/numbers" xmlns:enc="http://www.w3.org/2001/06/soap-encoding" > <name>John Hancock</name> <phoneNumbers enc:arrayType="def:phoneNumber[2]"> <phoneNumber>206-555-1212</phoneNumber> <phoneNumber>1-888-123-4567</phoneNumber> </phoneNumbers></def:Person>
Array of phone numbers embedded in a struct conforming to the schema in Example 34
下面是單引用數組值的另一個例子,數組值被編碼為嵌入元素,這些元素都包含作為存取標識的元素名:
Example 36
<xyz:PurchaseOrder xmlns:xyz="http://example.org/2001/06/Orders" > <CustomerName>Henry Ford</CustomerName> <ShipTo> <Street>5th Ave</Street> <City>New York</City> <State>NY</State> <Zip>10010</Zip> </ShipTo> <PurchaseLineItems xmlns:enc="http://www.w3.org/2001/06/soap-encoding" enc:arrayType="xyz:Order[2]"> <Order> <Product>Apple</Product> <Price>1.56</Price> </Order> <Order> <Product>Peach</Product> <Price>1.48</Price> </Order> </PurchaseLineItems></xyz:PurchaseOrder>
Single-reference array encoded as en embedded element
5.4.2.1 部分傳輸數組
SOAP提供對部分傳遞數組的支持,這就象在一些上下文[12]中的“可變長”數組。一個部分傳遞數組應使用“enc:offset”屬性標識,該屬性的記數是以第一元素的位移為0開始的。如果省略該屬性,則位移默認是0。
下面是一個大小為5的數組,同時在傳遞的時候僅傳遞第三和第四個元素:
Example 37
<enc:Array xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:xs="http://www.w3.org/2001/XMLSchema" enc:arrayType="xs:string[6]" enc:offset="[3]" > <item>The fourth element</item> <item>The fifth element</item></enc:Array>
Array of size five that transmits only the third and fourth element
5.4.2.2 稀疏數組
SOAP提供對稀疏數組的支持。每一個表示成員值的元素包含一個“enc:position”屬性來表明它處于數組的位置。下面是一個二維字串數組的稀疏數組的例子。他的大小是4,但僅有位置2被使用:
Example 38
<enc:Array xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:xs="http://www.w3.org/2001/XMLSchema" enc:arrayType="xs:string[,][4]" > <enc:Array href="#array-1" enc:position="[2]" /></enc:Array><enc:Array id="array-1" enc:arrayType="xs:string[10,10]" > <item enc:position="[2,2]">Third row, third col</item> <item enc:position="[7,2]">Eighth row, third col</item></enc:Array>
Sparse array
如果在上述數組中對array-1僅有一個引用,那上述例子可以被編碼為:
Example 39
<enc:Array xmlns:enc="http://www.w3.org/2001/06/soap-encoding" xmlns:xs="http://www.w3.org/2001/XMLSchema" enc:arrayType="xs:string[,][4]" > <enc:Array enc:position="[2]" enc:arrayType="xs:string[10,10]" > <item enc:position="[2,2]">Third row, third col</item> <item enc:position="[7,2]">Eighth row, third col</item> </enc:Array></enc:Array>
Another sparse array
5.4.3 通用復合類型
上面引用到的編碼規(guī)則并不限于那些預先知道存取標識的情形。如果存取標識名僅當在編碼過程中由值的出現(xiàn)才能決定的時候,同樣的規(guī)則也可以應用,也就是一個存取標識被編碼為同