技術與 B2B 應用集成( 3 ) SOAP 的型系統和數據編碼規則 本文最初由 IBM developerWorks 中國網站 發表,其網址是 http://www.ibm.com/developerWorks/cn/ SOAP 的類" name="description" />
本文最初由 IBM developerWorks 中國網站發表,其網址是
http://www.ibm.com/developerWorks/cn/
SOAP的類型和數據的編碼是基于一個簡單類型系統的,這個簡單類型系統是基于程序語言、數據庫和半結構數據中的類型系統的,是程序語言、數據庫和半結構數據中類型系統的公共特性的一個泛化。在該簡單類型系統中,一個類型要么是一個簡單(可量化的)類型或是一個復合類型,這個復合類型由多個部分組成,每個部分是一個類型(包括簡單類型或復合類型)。在本文的后面會有類型的更為詳細的描述。SOAP定義了一個編序規則,用于可類型化對象的編序。它在兩個級別上操作,首先,給出一個符號上一致化的由該類型系統描述的模式,構造一個XML語法層的模式(也就是型的描述),其次,提供一個類型系統的模式以及一個與該模式相一致的值的表示方法,構造一個XML實例層的模式(也就是值的描述)。
在SOAP中定義的元素和屬性所用到的命名空間標識是http://schemas.xmlsoap.org/soap/encoding/。
SOAP規范中描述的數據模型和編碼風格的使用方式是被鼓勵的而不是必備的,其他的數據模型和編碼也是可以與SOAP聯合使用的,但在使用的時候必須使用完整的命名空間修飾以唯一標識該編碼風格。
XML提供了一種靈活性很高,具備良好可擴展性的數據編碼方式。SOAP規范只定義了非常有限的編碼規則,用戶可以按需要擴展該基本定義。本文在一個高層次上介紹了編碼規則的定義,而以后的文章則描述明確類型的編碼規則。
為了描述編碼,首先來介紹和定義一下以下需要使用的術語:
1. “value”值,是一個字符串(string)、一個可量度對象(數字、日期、玫舉)的名字、或是數個簡單值的組合。所有的值都有明確的類型。
2. “simple value”簡單值,是一個不可分的值,它不包含任意可以命名的部分。簡單值的例子可以是特定的字符串、證書或玫舉值等。
3. “compound value”復合值,是一個值的關系的聚集。復合值的例子可以是特定的采購定單、存貨報表、街道地址等。
4. 在一個復合值中,每一個相關的值都可以用一個角色名來區分,也可以用一個序數來區分,當然也可以同時使用兩者。這被稱為“aclearcase/" target="_blank" >ccessor”存取標識。復合值的例子包括特定的采購定單、存貨報表等。數組也是復合值。它可以被看成是具有多個相同名字的存取標識(accessor)的復合值。
5. “array”數組,是一個復合值,在其成員值之間僅有順序位置不同。
6. “struct”結構,是一個復合值,在其成員值之間的區分是依靠存取標識(accessor)。同時所有存取標識的名應各不相同。
7. “simple type”簡單類型,是簡單值的類型。簡單類型的例子包括那些類“string”, “integer”,玫舉類等。
8. “compound type”復合類型,是復合值的類型。復合類型的例子包括采購定單的抽象類型,這些由該類型派生的采購定單具備相同的存取標識(shipTo, totalCost等),當然他們有不同的值(也許對某些值還有約束)。
9. 在一個復合類型中,一個存取標識在本復合類型中是唯一的,如果它和其他復合類型中的某個存取標識無法相區別,則該存取標識名加上復合類型的名字才能成為唯一標識,這個名稱為局部名。無論該名是直接或間接基于一個URI,如果該存取標識不用加類型名約束就已經是唯一的,那該名就稱為全局名。
10. 對于值表的編序模式中所給出的信息,是有可能能決定一些值只能關聯一個存取標識的簡單實例。對于其他可能的情況,則無法下這個斷言。一個值被稱為”single-reference”單引用,如果只有一個存取標識能夠引用它。如果能被多個引用,無論是事實上還是潛在可能,那就是”multi-reference”多引用。注意有可能在一模式中有一個確定的值是單引用而其他則是多引用。關于單引用和多引用的簡單區別,在具體應用時帶ID等屬性使之有可被重復引用的就是多引用,反之就是單引用。
11. 在句法上,一個元素可以是獨立的或嵌入的。一個獨立的元素是作為編序中一個頂級元素出現。而其他則是嵌入元素。
盡管使用usi:type屬性可以令值的表示可以是自描述的,也就是說即包含值的結構也包含值的類型,但編序規則允許值的類型可以僅僅引用模式(Schema)中的類型定義。而這些模式可以使用“XML Schema Part 1: Structures”和“XML Schema Part 2: Datatypes”中定義的規范來描述,當然也可以使用其他的模式定義來定義。注意盡管這樣,但許多模式定義只支持結構(struct)和數組(array)類型,而編序規則則有可能要嘗試使用結構(struct)和數組(array)類型之外的復合類型。
編序規則如下:
1. 所有的值都應當表現為XML元素的內容(content)。一個多引用的值必須被表示為一個獨立元素的內容。
2. 對每個包含一個值的元素,值的類型表示必須滿足以下至少一個條件:(a) 包含該值的元素實例包含一個xsi:type屬性(用于即時申明類型),(b) 包含該值的元素實例包含在一個具備SOAP-ENC: arrayType屬性的元素中(可能是default的),(c) 該元素的名帶有一個類型的明確關聯,而該類型由一個模式來定義并決定。
3. 一個簡單值應被表示為字符數據(character data),也就是說,它沒有任何子元素。每一個簡單值必須有一個類型,該類型要么是在XML Schema規范的DataTypes部分中被羅列,要么它的元類型應當在該部分中被羅列。
4. 一個復合值應當被編碼為一個元素序列,其中每一個存取標識由一個嵌入元素來表示,他們的名是一一對應的。若存取標識的名在包含它的型中是局部的,則它有一個未修飾的元素名,而帶有全局名的存取標識則應有完全修飾的名。
5. 一個多引用的簡單或復合值應當被編碼為一個獨立元素,該獨立元素應包含一個局部的帶有非限制名的“id”屬性,該屬性的類型為XML規范中定義的ID類型。對其他對該同一值的所有存取標識應當是一個空元素,該空元素有一個局部的未修飾的屬性“href”,該屬性類型是XML Schema規范中定義的“uri-reference”類型,“href”屬性的值是一個引用該對應獨立元素的URI片段標識。
6. 字串和字節數組被表示為多引用簡單類型,不過特別的規則也允許它們在通常情況下更有效地表示。一個字串或字節數組的存取標識可以有一個名為”id”的ID類型的屬性。如果這樣的話,所有其他對該同一值的存取標識可以被編碼為一個空元素,該空元素應包含一個局部的帶有非限制名的“href”屬性,該屬性的類型為XML Schema規范中定義的“uri-reference”類型,“href”屬性的值是一個引用該對應獨立元素的URI片段標識。
7. 對一個值編碼多個引用是允許的,看上去這些引用好象是引用了多個不同的值,但事實上這些引用句柄引用的是同一值實體。
8. 數組是復合值。SOAP數組被定義為類型是“SOAP-ENC:Array”或類型是源于“SOAP-ENC:Array”。
SOAP數組有一或多維,而它的成員由順序位置區分。一個數組的值被表示為一個能表示該數組的元素的序列,這些成員按序數從小到大順序出現。對于多維數組,則元素維按從右到左順序變化。每一個成員元素都被命名為一個獨立元素[參見編碼規則2]。
SOAP數組可以是單引用值,也可以是多引用值,從而可以被表示為一個嵌入元素或一個獨立元素。
SOAP數組必須包含一個“SOAP-ENC:arrayType”屬性,其中定義的包含元素的值的類型與維數一起描述了該數組。”SOAP-ENC:arrayType”屬性的值定義如下:
arrayTypeValue = atype asize
atype = QName *( rank )
rank = "[" *( "," ) "]"
asize = "[" #length "]"
length = 1*DIGIT
“atype”結構是數組所包含的元素的類型的名,首先它包含一個QName表示,QName應在XML Schema元素聲明中的“type”屬性中出現,是一個預先定義好的類型名,QName是一個型約束(意味著所有其包含的元素都應宣稱與該指明的類型相一致,也就是說,在SOAP-ENC:arrayType中引用的類型必須是所有數組元素的類型或元類型)。對于那些數組的數組或是“jagged arrays”,使用rank結構來表示數組的元素是一個數組,同時該數組的具體類型將在下層具體成員數組的定義時進行實例化,rank中出現零個、一個到多個逗號,表明該成員變量是一維、二維或多維數組。對于多維數組,維數定義為一個由“,”分隔的維數序列,每個維數的計數基數為1(也就是說聲明為6,就是有6個元素,但從后面的定義我們會知道每個成員的引用則是0..5)。
“asize”結構包含一個由逗號分隔的由零個、一個或多個整數組成的序列指明的數組的每個維的長度。一個由零個整數組成的序列表明對數組打下并沒有特別限制,不過具體的大小將由下層具體的成員來決定(例如“,,,”、“6,,6” “2,” “3,3”)。
例如,一個有5個成員的數組,每個成員的類型都為integer數組,但各個成員的數組長度可待定,那么它的arrayTypeValue的值就應當是 “int[][5]”。其中,atype的值是“int[]”,asize的值是“[5]”。類似地,一個有3個成員的數組,成員類型為integer二維數組,它的arrayTypeValue的值就應當是 “int[,][3]”。其中,atype的值是“int[,]”,asize的值是“[3]”。
SOAP數組成員可以包含一個“SOAP-ENC:offset”屬性來指明該成員在其裝載的數組中的偏移量。這也可以用于指明在一個部分描述的數組中成員的偏移。類似的,SOAP數組成員可以包含一個“SOAP-ENC:position”屬性來指明該成員在其裝載的數組中的位置。這也可以用于指明在一個稀疏描述的數組中成員的位置。“SOAP-ENC:offset”和“SOAP-ENC:position”屬性的值定義為:
arrayPoint = "[" #length "]"
他們的基數都是0。
9. NULL值和默認值可以在存取標識元素中省略(依賴于模式Schema中的定義,或者)。NULL值可以在一個存取標識元素中使用一個值為1的屬性xsi:null來指明,或者可以是其他依賴于應用程序的屬性和值。
注意規則2允許獨立元素和數組中成員元素可以自由地使用元素名,而不需要和其包含的類型的名相對應。
原文轉自:http://www.anti-gravitydesign.com