SOAP協議規範(二)

ForTechnology發表於2013-03-22

5.2  簡單型別
SOAP採用了"XML  Schema  Part  2:  Datatypes"規範[11]"Built-in  datatypes"節中的所有型別作為簡單型別,包括值和取值範圍。例如:  

型別  舉例
int  58502
float  314159265358979E+1
negativeInteger  -32768
string  Louis  "Satchmo"  Armstrong  

在xml  schema規範中宣告的資料型別可以直接用在元素schema中,也可以使用從這些型別衍生的新型別。一個schema和對應的具有這些型別的元素的資料例項的例子如下所示:  










45
5.9
-450
Blue  

所有簡單值必須編碼為元素的內容,它的型別或者在"xml  schema  part  2:  datatypes"規範[11]中定義過,或者是基於一個用xml  schema規範提供的機制能推衍生出的型別。如果一個簡單值編碼為獨立元素或異質陣列成員,那麼有一個對應於資料型別的元素宣告將會很方便。因為"xml  schema  part  2:  datatypes"規範[11]包括了型別定義,但是不包括對應的元素宣告,soap-enc  schema和名域為每個簡單資料型別宣告瞭一個元素,如45  

5.2.1  字串
字串資料型別的定義在"XML  Schema  Part  2:  Datatypes"規範[11]中。注意,這不同於許多資料庫和程式語言中的"string"型別,特別的,字串資料型別可能禁止某些在那些語言中允許的字元。(這些值必須用xsd:string之外的資料型別表示)一個字串可能編碼為一個single-reference  或  multi-reference值。包含字串值的元素可能有一個"id"屬性。附加的accessor元素可能有對應的"href"屬性。
例如,同一字串的兩個accessor可能以如下形式出現:  

hello
 

但是,如果兩個accessor參考同一字串例項(或字串的子型別),這不是一個實質問題,它們可以編碼為兩個single-reference值,如下所示:  

hello
Hello  

這個例子的schema片斷如下所示:  


 

在這個例子中,soap-enc:string型別用作元素的型別,這是宣告資料型別是"xsd:string"且允許"id"  和"href"屬性的元素的簡便方法。精確定義參見soap編碼schema。schemas可以使用這些源自soap編碼schema的宣告,但也可以不這樣做。  

5.2.2  enumerations
"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顯示如下。  








Henry  Ford
32
Brown
 

5.2.3  字元陣列
一個字元陣列可能編碼為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。  


aG93IG5vDyBicm73biBjb3cNCg==
 

5.3  多型accessor
許多語言允許能夠多型訪問多種型別值的accessor,每種型別在執行時可用。一個多型accessor例項必須包含一個"xsi:type"屬性描述實際值的型別。例如,一個名為"cost"型別值為"xsd:float"的多型accessor編碼如下:  

29.95與之對比,型別值不變的accessor編碼如下:  

29.95  

5.4  compound  types複合型別
SOAP定義了與下列常在程式語言中出現的結構性模式對應的型別:  

結構:一個"struct"是一個複合值,它的成員值的唯一區別是accessor名稱,任意兩個accessor名稱都不相同。
陣列:一個"array"是一個複合值,它的成員值的唯一區別是序數位置。
SOAP也允許結構和陣列之外的其它資料的序列化,例如Directed-Labeled-Graph  Data  Model之類的資料中,單個節點有許多不同的accssor,有些不止出現一次。SOAP序列化規則不要求底層的資料模型在accssor之間區分次序,但如果有這樣的次序的話,這些accssor必須按照這個順序編碼。  

5.4.1  複合值,結構和值引用
複合值的成員編碼為accessor元素。當accessor由名區分時(如結構),accessor名即作為元素名。名區域性於型別的accessor有不受限的名,其它的accessor則有受限的名。下面的例子是型別為"Book"的結構:  


Henry  Ford
Prefatory  text
This  is  a  book.
 

以下是描述上面結構的schema片斷:  







 

以下是一個同時具有簡單和複雜成員型別的例子。它顯示兩層引用。注意"author"accssor元素的"href"屬性是對相應具有"id"屬性的值的引用。"address"與之類似。  


My  Life  and  Work



Henry  Ford



mailto:henryford@hotmail.com
http://www.henryford.com
 

當"person"的值和"address"的值是multi-reference時,上面的形式是正確的。如果它
們是single-reference,就必須用嵌入的形式,如下所示:  


My  Life  and  Work

Henry  Ford

mailto:henryford@hotmail.com
http://www.henryford.com


 

如果新增一個限制,任意兩個人都不會有相同的地址,並且地址可以是街道或email地址,一本書可以有兩個作者,編碼如下:  


My  Life  and  Work




Henry  Ford

mailto:henryford@hotmail.com
http://www.henryford.com



Samuel  Crowther

Martin  Luther  King  Rd
Raleigh
North  Carolina

 

序列化可以包含對不在同一個資源的值的引用:  


Paradise  Lost

 

以下是描述上面結構的schema片斷:  



<!--  Either  the  following  group  must  occur  or  else  the
href  attribute  must  appear,  but  not  both.  --&gt











<!--  Either  the  following  group  must  occur  or  else  the
href  attribute  must  appear,  but  not  both.  --&gt










<!--  Either  the  following  group  must  occur  or  else  the
href  attribute  must  appear,  but  not  both.  --&gt








 

5.4.2  陣列
SOAP陣列定義為具有"SOAP-ENC:Array"型別或一個從"SOAP-ENC:Array"衍生的型別(參見規則8)。陣列表示為元素值,對元素的名沒有特別的約束(正如元素值並不約束它們所屬的元素)。陣列可以包含任意型別的元素,包括巢狀陣列。可以建立新的型別(受SOAP-ENC:Array
型別限制)來表示陣列,如整數陣列或某些使用者定義的列舉。陣列值表示為組成這個陣列的項的元素的規則序列。在陣列值中,元素名對於區分accesor並不重要。元素可以有任意的名。實際上,元素常常用它們在schema中暗示或確定的陣列型別來命名元素。並且一般情況下對於複合值來說,如果陣列中陣列項的值是single-reference值,則這個陣列項包含它的值,否則,該陣列項通過"href"屬性引用這個值。下面的例子是一個整型陣列的schema片斷:  

type="SOAP-ENC:Array"/>
SOAP-ENC:arrayType="xsd:int[2]">
3
4
 

在這個例子中,陣列"myfavoritenumbers"包括幾個成員,每個成員是一個型別為soap-enc:int的值。注意soap-enc:array允許不受限制的元素名,它們不傳達任何型別資訊,所以在使用時,或者它們有xsi:type屬性,或者它們所屬的元素有soap-enc:arraytype屬性。自然,由soap-enc:array衍生的型別可以宣告區域性元素,但這種情況下要包括型別資訊。上面已經提到,soap-enc  schema包含了元素的宣告,元素名與"xml  schema  part  2:  datatypes"規範[11]中的簡單型別一致。其中包括了對"array"的宣告。於是,我們可以這樣寫:  


3
4
 

陣列可以包含特定arraytype的任意子型別的例項。即,陣列成員可以是arrytype屬性值指定的型別的任意子型別,這個型別對於arraytype屬性中指定的型別來說是可替換的(根據schema中的替換規則)。例如,一個整型陣列可以包含從整型衍生的任意型別(如"int"或任意使用者定義的從整型衍生的型別)。同樣,一個"address"陣列可能包含一個address的受限型別或擴充套件型別如"internationaladdress"。因為提供的soap-enc:array型別允許任意型別的成員,所以可以包含任意型別的混合除非使用arraytype屬性加以特別的限制。在例項中,可以使用xsi:type指定成員元素的型別,或通過schema中成員元素的宣告來指定。下面是兩個例子。  


12345
6.789

Of  Mans  First  Disobedience,  and  the  Fruit
Of  that  Forbidden  Tree,  whose  mortal  tast
Brought  Death  into  the  World,  and  all  our  woe,

http://www.dartmouth.edu/~milton/reading_room/ 


12345
6.789

Of  Mans  First  Disobedience,  and  the  Fruit
Of  that  Forbidden  Tree,  whose  mortal  tast
Brought  Death  into  the  World,  and  all  our  woe,

http://www.dartmouth.edu/~milton/reading_room/ 
 

陣列值可以是結構或其它複合值。例如"xyz:order"結構陣列:  



Apple
1.56


Peach
1.48

 

陣列成員值也可以是陣列。下例是兩個字串陣列組成的陣列:  






r1c1
r1c2
r1c3


r2c1
r2c2
 

包含陣列的元素無需命名為"soap-enc:array"。它可以有任意的名,只要元素的型別是soap-enc:array或由之衍生的型別。例如,下面是一個schema片斷和與之一致的陣列例項。  









206-555-1212
1-888-123-4567
 

陣列可能是多維的。在這種情況下,在arraytype屬性的asize部分將不止有一個值:  


r1c1
r1c2
r1c3
r2c1
r2c2
r2c3
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-756793/,如需轉載,請註明出處,否則將追究法律責任。

相關文章