|
SOAP技術(shù)與B2B應(yīng)用集成--SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則
|
|
AMTeam.org SOAP技術(shù)與B2B應(yīng)用集成
--SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則
柴曉路
ChiefSystemArchitect
2001年4月26日 本文延續(xù)前文SOAP的消息結(jié)構(gòu)與數(shù)據(jù)的組織方法,著重介紹了SOAP消息中基本基于XMLSchema的數(shù)據(jù)遍序方式,本部分的內(nèi)容比較抽象,如果讀者具備型系統(tǒng)或?qū)ο笙到y(tǒng)的理論知識可能能比較容易地理解,如果尚未學(xué)習(xí)過這方面的知識,可以接合后面一篇對各種具體類型的描述方法詳細(xì)介紹的文章一起理解會(huì)獲得更好的效果,本文僅包含術(shù)語部分和基本遍序規(guī)則部分。SOAP的類型和數(shù)據(jù)的編碼是基于一個(gè)簡單類型系統(tǒng)的,這個(gè)簡單類型系統(tǒng)是基于程序語言、數(shù)據(jù)庫和半結(jié)構(gòu)數(shù)據(jù)中的類型系統(tǒng)的,是程序語言、數(shù)據(jù)庫和半結(jié)構(gòu)數(shù)據(jù)中類型系統(tǒng)的公共特性的一個(gè)泛化。在該簡單類型系統(tǒng)中,一個(gè)類型要么是一個(gè)簡單(可量化的)類型或是一個(gè)復(fù)合類型,這個(gè)復(fù)合類型由多個(gè)部分組成,每個(gè)部分是一個(gè)類型(包括簡單類型或復(fù)合類型)。在本文的后面會(huì)有類型的更為詳細(xì)的描述。SOAP定義了一個(gè)編序規(guī)則,用于可類型化對象的編序。它在兩個(gè)級別上操作,首先,給出一個(gè)符號上一致化的由該類型系統(tǒng)描述的模式,構(gòu)造一個(gè)XML語法層的模式(也就是型的描述),其次,提供一個(gè)類型系統(tǒng)的模式以及一個(gè)與該模式相一致的值的表示方法,構(gòu)造一個(gè)XML實(shí)例層的模式(也就是值的描述)。在SOAP中定義的元素和屬性所用到的命名空間標(biāo)識是。SOAP規(guī)范中描述的數(shù)據(jù)模型和編碼風(fēng)格的使用方式是被鼓勵(lì)的而不是必備的,其他的數(shù)據(jù)模型和編碼也是可以與SOAP聯(lián)合使用的,但在使用的時(shí)候必須使用完整的命名空間修飾以唯一標(biāo)識該編碼風(fēng)格。XML提供了一種靈活性很高,具備良好可擴(kuò)展性的數(shù)據(jù)編碼方式。SOAP規(guī)范只定義了非常有限的編碼規(guī)則,用戶可以按需要擴(kuò)展該基本定義。本文在一個(gè)高層次上介紹了編碼規(guī)則的定義,而以后的文章則描述明確類型的編碼規(guī)則。本文所引用的資源主要包括兩類,一類用于解決B2B電子商務(wù)應(yīng)用交互和集成的系列技術(shù)標(biāo)準(zhǔn)規(guī)范,他們與SOAP是一個(gè)不可分割的技術(shù)體系,包括UDDI、SOAP、WSDL、XML等,另一類是SOAP的開發(fā)軟件包,包括Microsoft的SOAP軟件包SOAPToolkit和ApacheProject的SOAPPackage。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過這些資源鏈接找到所需的內(nèi)容術(shù)語定義為了描述編碼,首先來介紹和定義一下以下需要使用的術(shù)語:“value”值,是一個(gè)字符串(string)、一個(gè)可量度對象(數(shù)字、日期、玫舉)的名字、或是數(shù)個(gè)簡單值的組合。所有的值都有明確的類型。“simplevalue”簡單值,是一個(gè)不可分的值,它不包含任意可以命名的部分。簡單值的例子可以是特定的字符串、證書或玫舉值等。“compoundvalue”復(fù)合值,是一個(gè)值的關(guān)系的聚集。復(fù)合值的例子可以是特定的采購定單、存貨報(bào)表、街道地址等。在一個(gè)復(fù)合值中,每一個(gè)相關(guān)的值都可以用一個(gè)角色名來區(qū)分,也可以用一個(gè)序數(shù)來區(qū)分,當(dāng)然也可以同時(shí)使用兩者。這被稱為“accessor”存取標(biāo)識。復(fù)合值的例子包括特定的采購定單、存貨報(bào)表等。數(shù)組也是復(fù)合值。它可以被看成是具有多個(gè)相同名字的存取標(biāo)識(accessor)的復(fù)合值。“array”數(shù)組,是一個(gè)復(fù)合值,在其成員值之間僅有順序位置不同。“struct”結(jié)構(gòu),是一個(gè)復(fù)合值,在其成員值之間的區(qū)分是依靠存取標(biāo)識(accessor)。同時(shí)所有存取標(biāo)識的名應(yīng)各不相同。“simpletype”簡單類型,是簡單值的類型。簡單類型的例子包括那些類“string”,“integer”,玫舉類等。“compoundtype”復(fù)合類型,是復(fù)合值的類型。復(fù)合類型的例子包括采購定單的抽象類型,這些由該類型派生的采購定單具備相同的存取標(biāo)識(shipTo,totalCost等),當(dāng)然他們有不同的值(也許對某些值還有約束)。在一個(gè)復(fù)合類型中,一個(gè)存取標(biāo)識在本復(fù)合類型中是唯一的,如果它和其他復(fù)合類型中的某個(gè)存取標(biāo)識無法相區(qū)別,則該存取標(biāo)識名加上復(fù)合類型的名字才能成為唯一標(biāo)識,這個(gè)名稱為局部名。無論該名是直接或間接基于一個(gè)URI,如果該存取標(biāo)識不用加類型名約束就已經(jīng)是唯一的,那該名就稱為全局名。對于值表的編序模式中所給出的信息,是有可能能決定一些值只能關(guān)聯(lián)一個(gè)存取標(biāo)識的簡單實(shí)例。對于其他可能的情況,則無法下這個(gè)斷言。一個(gè)值被稱為”single-reference”單引用,如果只有一個(gè)存取標(biāo)識能夠引用它。如果能被多個(gè)引用,無論是事實(shí)上還是潛在可能,那就是”multi-reference”多引用。注意有可能在一模式中有一個(gè)確定的值是單引用而其他則是多引用。關(guān)于單引用和多引用的簡單區(qū)別,在具體應(yīng)用時(shí)帶ID等屬性使之有可被重復(fù)引用的就是多引用,反之就是單引用。在句法上,一個(gè)元素可以是獨(dú)立的或嵌入的。一個(gè)獨(dú)立的元素是作為編序中一個(gè)頂級元素出現(xiàn)。而其他則是嵌入元素。編序規(guī)則盡管使用usi:type屬性可以令值的表示可以是自描述的,也就是說即包含值的結(jié)構(gòu)也包含值的類型,但編序規(guī)則允許值的類型可以僅僅引用模式(Schema)中的類型定義。而這些模式可以使用“XMLSchemaPart1:Structures”和“XMLSchemaPart2:Datatypes”中定義的規(guī)范來描述,當(dāng)然也可以使用其他的模式定義來定義。注意盡管這樣,但許多模式定義只支持結(jié)構(gòu)(struct)和數(shù)組(array)類型,而編序規(guī)則則有可能要嘗試使用結(jié)構(gòu)(struct)和數(shù)組(array)類型之外的復(fù)合類型。編序規(guī)則如下:所有的值都應(yīng)當(dāng)表現(xiàn)為XML元素的內(nèi)容(content)。一個(gè)多引用的值必須被表示為一個(gè)獨(dú)立元素的內(nèi)容。對每個(gè)包含一個(gè)值的元素,值的類型表示必須滿足以下至少一個(gè)條件:(a)包含該值的元素實(shí)例包含一個(gè)xsi:type屬性(用于即時(shí)申明類型),(b)包含該值的元素實(shí)例包含在一個(gè)具備SOAP-ENC:arrayType屬性的元素中(可能是default的),(c)該元素的名帶有一個(gè)類型的明確關(guān)聯(lián),而該類型由一個(gè)模式來定義并決定。一個(gè)簡單值應(yīng)被表示為字符數(shù)據(jù)(characterdata),也就是說,它沒有任何子元素。每一個(gè)簡單值必須有一個(gè)類型,該類型要么是在XMLSchema規(guī)范的DataTypes部分中被羅列,要么它的元類型應(yīng)當(dāng)在該部分中被羅列。一個(gè)復(fù)合值應(yīng)當(dāng)被編碼為一個(gè)元素序列,其中每一個(gè)存取標(biāo)識由一個(gè)嵌入元素來表示,他們的名是一一對應(yīng)的。若存取標(biāo)識的名在包含它的型中是局部的,則它有一個(gè)未修飾的元素名,而帶有全局名的存取標(biāo)識則應(yīng)有完全修飾的名。一個(gè)多引用的簡單或復(fù)合值應(yīng)當(dāng)被編碼為一個(gè)獨(dú)立元素,該獨(dú)立元素應(yīng)包含一個(gè)局部的帶有非限制名的“id”屬性,該屬性的類型為XML規(guī)范中定義的ID類型。對其他對該同一值的所有存取標(biāo)識應(yīng)當(dāng)是一個(gè)空元素,該空元素有一個(gè)局部的未修飾的屬性“href”,該屬性類型是XMLSchema規(guī)范中定義的“uri-reference”類型,“href”屬性的值是一個(gè)引用該對應(yīng)獨(dú)立元素的URI片段標(biāo)識。字串和字節(jié)數(shù)組被表示為多引用簡單類型,不過特別的規(guī)則也允許它們在通常情況下更有效地表示。一個(gè)字串或字節(jié)數(shù)組的存取標(biāo)識可以有一個(gè)名為”id”的ID類型的屬性。如果這樣的話,所有其他對該同一值的存取標(biāo)識可以被編碼為一個(gè)空元素,該空元素應(yīng)包含一個(gè)局部的帶有非限制名的“href”屬性,該屬性的類型為XMLSchema規(guī)范中定義的“uri-reference”類型,“href”屬性的值是一個(gè)引用該對應(yīng)獨(dú)立元素的URI片段標(biāo)識。對一個(gè)值編碼多個(gè)引用是允許的,看上去這些引用好象是引用了多個(gè)不同的值,但事實(shí)上這些引用句柄引用的是同一值實(shí)體。數(shù)組是復(fù)合值。SOAP數(shù)組被定義為類型是“SOAP-ENC:Array”或類型是源于“SOAP-ENC:Array”。SOAP數(shù)組有一或多維,而它的成員由順序位置區(qū)分。一個(gè)數(shù)組的值被表示為一個(gè)能表示該數(shù)組的元素的序列,這些成員按序數(shù)從小到大順序出現(xiàn)。對于多維數(shù)組,則元素維按從右到左順序變化。每一個(gè)成員元素都被命名為一個(gè)獨(dú)立元素[參見編碼規(guī)則2]。SOAP數(shù)組可以是單引用值,也可以是多引用值,從而可以被表示為一個(gè)嵌入元素或一個(gè)獨(dú)立元素。SOAP數(shù)組必須包含一個(gè)“SOAP-ENC:arrayType”屬性,其中定義的包含元素的值的類型與維數(shù)一起描述了該數(shù)組?!盨OAP-ENC:arrayType”屬性的值定義如下:arrayTypeValue=atypeasize atype=QName*(rank) rank="["*(",")"]" asize="["#length"]" length=1*DIGIT“atype”結(jié)構(gòu)是數(shù)組所包含的元素的類型的名,首先它包含一個(gè)QName表示,QName應(yīng)在XMLSchema元素聲明中的“type”屬性中出現(xiàn),是一個(gè)預(yù)先定義好的類型名,QName是一個(gè)型約束(意味著所有其包含的元素都應(yīng)宣稱與該指明的類型相一致,也就是說,在SOAP-ENC:arrayType中引用的類型必須是所有數(shù)組元素的類型或元類型)。對于那些數(shù)組的數(shù)組或是“jaggedarrays”,使用rank結(jié)構(gòu)來表示數(shù)組的元素是一個(gè)數(shù)組,同時(shí)該數(shù)組的具體類型將在下層具體成員數(shù)組的定義時(shí)進(jìn)行實(shí)例化,rank中出現(xiàn)零個(gè)、一個(gè)到多個(gè)逗號,表明該成員變量是一維、二維或多維數(shù)組。對于多維數(shù)組,維數(shù)定義為一個(gè)由“,”分隔的維數(shù)序列,每個(gè)維數(shù)的計(jì)數(shù)基數(shù)為1(也就是說聲明為6,就是有6個(gè)元素,但從后面的定義我們會(huì)知道每個(gè)成員的引用則是0..5)。“asize”結(jié)構(gòu)包含一個(gè)由逗號分隔的由零個(gè)、一個(gè)或多個(gè)整數(shù)組成的序列指明的數(shù)組的每個(gè)維的長度。一個(gè)由零個(gè)整數(shù)組成的序列表明對數(shù)組打下并沒有特別限制,不過具體的大小將由下層具體的成員來決定(例如“,,,”、“6,,6”“2,”“3,3”)。例如,一個(gè)有5個(gè)成員的數(shù)組,每個(gè)成員的類型都為integer數(shù)組,但各個(gè)成員的數(shù)組長度可待定,那么它的arrayTypeValue的值就應(yīng)當(dāng)是“int[][5]”。其中,atype的值是“int[]”,asize的值是“[5]”。類似地,一個(gè)有3個(gè)成員的數(shù)組,成員類型為integer二維數(shù)組,它的arrayTypeValue的值就應(yīng)當(dāng)是“int[,][3]”。其中,atype的值是“int[,]”,asize的值是“[3]”。SOAP數(shù)組成員可以包含一個(gè)“SOAP-ENC:offset”屬性來指明該成員在其裝載的數(shù)組中的偏移量。這也可以用于指明在一個(gè)部分描述的數(shù)組中成員的偏移。類似的,SOAP數(shù)組成員可以包含一個(gè)“SOAP-ENC:position”屬性來指明該成員在其裝載的數(shù)組中的位置。這也可以用于指明在一個(gè)稀疏描述的數(shù)組中成員的位置。“SOAP-ENC:offset”和“SOAP-ENC:position”屬性的值定義為:arrayPoint="["#length"]"他們的基數(shù)都是0。NULL值和默認(rèn)值可以在存取標(biāo)識元素中省略(依賴于模式Schema中的定義,或者其他等價(jià)的方法)。NULL值可以在一個(gè)存取標(biāo)識元素中使用一個(gè)值為1的屬性xsi:null來指明,或者可以是其他依賴于應(yīng)用程序的屬性和值。 結(jié)語本文介紹了SOAP消息中的型系統(tǒng)和值類型的基本遍序規(guī)則。我將在下一篇文章中詳細(xì)SOAP消息中各種具體類型的定義描述方法和值表示方式。參考資料- 解決B2B電子商務(wù)應(yīng)用交互和集成的InterOPStack系列技術(shù)標(biāo)準(zhǔn)規(guī)范
- UDDITechnicalWhitePaper,AribaInc.,IBMCorporationandMicrosoftCorporation,6Sep2000
- WebServiceDescriptionLanguage(WSDL)1.0,IBM,25Sep2000
- SOAP:SimpleObjectAccessProtocolSpecification1.1,IBM,Microsoft,DevelopMentor,2000
- ExtensibleMarkupLanguage(XML)1.0(SecondEdition),W3C,6Oct2000
- XMLSchemaPart0:Primer,W3C,16Apr2001
- XMLSchemaPart1:Structures,W3C,16Apr2001
- XMLSchemaPart2:Datatypes,W3C,16Apr2001
- SOAP開發(fā)軟件包
- MicrosoftSOAPToolkit2.0,RC0,MicrosoftCorporation
- ApacheSOAP2.0,Apache.ORG
作者簡介 | | 柴曉路:上海得易電子商務(wù)技術(shù)有限公司首席系統(tǒng)架構(gòu)師、XML技術(shù)顧問。2000年獲復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)碩士學(xué)位,曾在國際計(jì)算機(jī)科學(xué)學(xué)術(shù)會(huì)議(ICSC)、中國XML技術(shù)研討會(huì)(北京)、計(jì)算機(jī)科學(xué)期刊等各類國際、國內(nèi)重要會(huì)議與期刊上發(fā)表論文多篇。其專長為XML與數(shù)據(jù)交換、數(shù)據(jù)庫、面向?qū)ο蠹夹g(shù)等。 |
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|
|
|
|
|
|