監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢(xún)管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶(hù)案例 | 在線(xiàn)試用
X 關(guān)閉

SOAP技術(shù)與B2B應(yīng)用集成--SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則

申請(qǐng)免費(fèi)試用、咨詢(xún)電話(huà):400-8352-114

AMTeam.org

SOAP技術(shù)與B2B應(yīng)用集成

--SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則

柴曉路

Chief System Architect

2001年4月26日

 
本文延續(xù)前文SOAP的消息結(jié)構(gòu)與數(shù)據(jù)的組織方法,著重介紹了SOAP消息中基本基于XML Schema的數(shù)據(jù)遍序方式,本部分的內(nèi)容比較抽象,如果讀者具備型系統(tǒng)或?qū)ο笙到y(tǒng)的理論知識(shí)可能能比較容易地理解,如果尚未學(xué)習(xí)過(guò)這方面的知識(shí),可以接合后面一篇對(duì)各種具體類(lèi)型的描述方法詳細(xì)介紹的文章一起理解會(huì)獲得更好的效果,本文僅包含術(shù)語(yǔ)部分和基本遍序規(guī)則部分。

SOAP的類(lèi)型和數(shù)據(jù)的編碼是基于一個(gè)簡(jiǎn)單類(lèi)型系統(tǒng)的,這個(gè)簡(jiǎn)單類(lèi)型系統(tǒng)是基于程序語(yǔ)言、數(shù)據(jù)庫(kù)和半結(jié)構(gòu)數(shù)據(jù)中的類(lèi)型系統(tǒng)的,是程序語(yǔ)言、數(shù)據(jù)庫(kù)和半結(jié)構(gòu)數(shù)據(jù)中類(lèi)型系統(tǒng)的公共特性的一個(gè)泛化。在該簡(jiǎn)單類(lèi)型系統(tǒng)中,一個(gè)類(lèi)型要么是一個(gè)簡(jiǎn)單(可量化的)類(lèi)型或是一個(gè)復(fù)合類(lèi)型,這個(gè)復(fù)合類(lèi)型由多個(gè)部分組成,每個(gè)部分是一個(gè)類(lèi)型(包括簡(jiǎn)單類(lèi)型或復(fù)合類(lèi)型)。在本文的后面會(huì)有類(lèi)型的更為詳細(xì)的描述。SOAP定義了一個(gè)編序規(guī)則,用于可類(lèi)型化對(duì)象的編序。它在兩個(gè)級(jí)別上操作,首先,給出一個(gè)符號(hào)上一致化的由該類(lèi)型系統(tǒng)描述的模式,構(gòu)造一個(gè)XML語(yǔ)法層的模式(也就是型的描述),其次,提供一個(gè)類(lèi)型系統(tǒng)的模式以及一個(gè)與該模式相一致的值的表示方法,構(gòu)造一個(gè)XML實(shí)例層的模式(也就是值的描述)。

在SOAP中定義的元素和屬性所用到的命名空間標(biāo)識(shí)是http://schemas.xmlsoap.org/soap/encoding/。

SOAP規(guī)范中描述的數(shù)據(jù)模型和編碼風(fēng)格的使用方式是被鼓勵(lì)的而不是必備的,其他的數(shù)據(jù)模型和編碼也是可以與SOAP聯(lián)合使用的,但在使用的時(shí)候必須使用完整的命名空間修飾以唯一標(biāo)識(shí)該編碼風(fēng)格。

XML提供了一種靈活性很高,具備良好可擴(kuò)展性的數(shù)據(jù)編碼方式。SOAP規(guī)范只定義了非常有限的編碼規(guī)則,用戶(hù)可以按需要擴(kuò)展該基本定義。本文在一個(gè)高層次上介紹了編碼規(guī)則的定義,而以后的文章則描述明確類(lèi)型的編碼規(guī)則。

本文所引用的資源主要包括兩類(lèi),一類(lèi)用于解決B2B電子商務(wù)應(yīng)用交互和集成的系列技術(shù)標(biāo)準(zhǔn)規(guī)范,他們與SOAP是一個(gè)不可分割的技術(shù)體系,包括UDDI、SOAP、WSDL、XML等,另一類(lèi)是SOAP的開(kāi)發(fā)軟件包,包括Microsoft的SOAP軟件包SOAPToolkit和Apache Project的SOAP Package。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過(guò)這些資源鏈接找到所需的內(nèi)容

術(shù)語(yǔ)定義

為了描述編碼,首先來(lái)介紹和定義一下以下需要使用的術(shù)語(yǔ):

“value”值,是一個(gè)字符串(string)、一個(gè)可量度對(duì)象(數(shù)字、日期、玫舉)的名字、或是數(shù)個(gè)簡(jiǎn)單值的組合。所有的值都有明確的類(lèi)型。

“simple value”簡(jiǎn)單值,是一個(gè)不可分的值,它不包含任意可以命名的部分。簡(jiǎn)單值的例子可以是特定的字符串、證書(shū)或玫舉值等。

“compound value”復(fù)合值,是一個(gè)值的關(guān)系的聚集。復(fù)合值的例子可以是特定的采購(gòu)定單、存貨報(bào)表、街道地址等。

在一個(gè)復(fù)合值中,每一個(gè)相關(guān)的值都可以用一個(gè)角色名來(lái)區(qū)分,也可以用一個(gè)序數(shù)來(lái)區(qū)分,當(dāng)然也可以同時(shí)使用兩者。這被稱(chēng)為“accessor”存取標(biāo)識(shí)。復(fù)合值的例子包括特定的采購(gòu)定單、存貨報(bào)表等。數(shù)組也是復(fù)合值。它可以被看成是具有多個(gè)相同名字的存取標(biāo)識(shí)(accessor)的復(fù)合值。

“array”數(shù)組,是一個(gè)復(fù)合值,在其成員值之間僅有順序位置不同。

“struct”結(jié)構(gòu),是一個(gè)復(fù)合值,在其成員值之間的區(qū)分是依靠存取標(biāo)識(shí)(accessor)。同時(shí)所有存取標(biāo)識(shí)的名應(yīng)各不相同。

“simple type”簡(jiǎn)單類(lèi)型,是簡(jiǎn)單值的類(lèi)型。簡(jiǎn)單類(lèi)型的例子包括那些類(lèi)“string”, “integer”,玫舉類(lèi)等。

“compound type”復(fù)合類(lèi)型,是復(fù)合值的類(lèi)型。復(fù)合類(lèi)型的例子包括采購(gòu)定單的抽象類(lèi)型,這些由該類(lèi)型派生的采購(gòu)定單具備相同的存取標(biāo)識(shí)(shipTo, totalCost等),當(dāng)然他們有不同的值(也許對(duì)某些值還有約束)。

在一個(gè)復(fù)合類(lèi)型中,一個(gè)存取標(biāo)識(shí)在本復(fù)合類(lèi)型中是唯一的,如果它和其他復(fù)合類(lèi)型中的某個(gè)存取標(biāo)識(shí)無(wú)法相區(qū)別,則該存取標(biāo)識(shí)名加上復(fù)合類(lèi)型的名字才能成為唯一標(biāo)識(shí),這個(gè)名稱(chēng)為局部名。無(wú)論該名是直接或間接基于一個(gè)URI,如果該存取標(biāo)識(shí)不用加類(lèi)型名約束就已經(jīng)是唯一的,那該名就稱(chēng)為全局名。

對(duì)于值表的編序模式中所給出的信息,是有可能能決定一些值只能關(guān)聯(lián)一個(gè)存取標(biāo)識(shí)的簡(jiǎn)單實(shí)例。對(duì)于其他可能的情況,則無(wú)法下這個(gè)斷言。一個(gè)值被稱(chēng)為”single-reference”單引用,如果只有一個(gè)存取標(biāo)識(shí)能夠引用它。如果能被多個(gè)引用,無(wú)論是事實(shí)上還是潛在可能,那就是”multi-reference”多引用。注意有可能在一模式中有一個(gè)確定的值是單引用而其他則是多引用。關(guān)于單引用和多引用的簡(jiǎn)單區(qū)別,在具體應(yīng)用時(shí)帶ID等屬性使之有可被重復(fù)引用的就是多引用,反之就是單引用。

在句法上,一個(gè)元素可以是獨(dú)立的或嵌入的。一個(gè)獨(dú)立的元素是作為編序中一個(gè)頂級(jí)元素出現(xiàn)。而其他則是嵌入元素。

編序規(guī)則

盡管使用usi:type屬性可以令值的表示可以是自描述的,也就是說(shuō)即包含值的結(jié)構(gòu)也包含值的類(lèi)型,但編序規(guī)則允許值的類(lèi)型可以?xún)H僅引用模式(Schema)中的類(lèi)型定義。而這些模式可以使用“XML Schema Part 1: Structures”和“XML Schema Part 2: Datatypes”中定義的規(guī)范來(lái)描述,當(dāng)然也可以使用其他的模式定義來(lái)定義。注意盡管這樣,但許多模式定義只支持結(jié)構(gòu)(struct)和數(shù)組(array)類(lèi)型,而編序規(guī)則則有可能要嘗試使用結(jié)構(gòu)(struct)和數(shù)組(array)類(lèi)型之外的復(fù)合類(lèi)型。

編序規(guī)則如下:

所有的值都應(yīng)當(dāng)表現(xiàn)為XML元素的內(nèi)容(content)。一個(gè)多引用的值必須被表示為一個(gè)獨(dú)立元素的內(nèi)容。

對(duì)每個(gè)包含一個(gè)值的元素,值的類(lèi)型表示必須滿(mǎn)足以下至少一個(gè)條件:(a) 包含該值的元素實(shí)例包含一個(gè)xsi:type屬性(用于即時(shí)申明類(lèi)型),(b) 包含該值的元素實(shí)例包含在一個(gè)具備SOAP-ENC: arrayType屬性的元素中(可能是default的),(c) 該元素的名帶有一個(gè)類(lèi)型的明確關(guān)聯(lián),而該類(lèi)型由一個(gè)模式來(lái)定義并決定。

一個(gè)簡(jiǎn)單值應(yīng)被表示為字符數(shù)據(jù)(character data),也就是說(shuō),它沒(méi)有任何子元素。每一個(gè)簡(jiǎn)單值必須有一個(gè)類(lèi)型,該類(lèi)型要么是在XML Schema規(guī)范的DataTypes部分中被羅列,要么它的元類(lèi)型應(yīng)當(dāng)在該部分中被羅列。

一個(gè)復(fù)合值應(yīng)當(dāng)被編碼為一個(gè)元素序列,其中每一個(gè)存取標(biāo)識(shí)由一個(gè)嵌入元素來(lái)表示,他們的名是一一對(duì)應(yīng)的。若存取標(biāo)識(shí)的名在包含它的型中是局部的,則它有一個(gè)未修飾的元素名,而帶有全局名的存取標(biāo)識(shí)則應(yīng)有完全修飾的名。

一個(gè)多引用的簡(jiǎn)單或復(fù)合值應(yīng)當(dāng)被編碼為一個(gè)獨(dú)立元素,該獨(dú)立元素應(yīng)包含一個(gè)局部的帶有非限制名的“id”屬性,該屬性的類(lèi)型為XML規(guī)范中定義的ID類(lèi)型。對(duì)其他對(duì)該同一值的所有存取標(biāo)識(shí)應(yīng)當(dāng)是一個(gè)空元素,該空元素有一個(gè)局部的未修飾的屬性“href”,該屬性類(lèi)型是XML Schema規(guī)范中定義的“uri-reference”類(lèi)型,“href”屬性的值是一個(gè)引用該對(duì)應(yīng)獨(dú)立元素的URI片段標(biāo)識(shí)。

字串和字節(jié)數(shù)組被表示為多引用簡(jiǎn)單類(lèi)型,不過(guò)特別的規(guī)則也允許它們?cè)谕ǔG闆r下更有效地表示。一個(gè)字串或字節(jié)數(shù)組的存取標(biāo)識(shí)可以有一個(gè)名為”id”的ID類(lèi)型的屬性。如果這樣的話(huà),所有其他對(duì)該同一值的存取標(biāo)識(shí)可以被編碼為一個(gè)空元素,該空元素應(yīng)包含一個(gè)局部的帶有非限制名的“href”屬性,該屬性的類(lèi)型為XML Schema規(guī)范中定義的“uri-reference”類(lèi)型,“href”屬性的值是一個(gè)引用該對(duì)應(yīng)獨(dú)立元素的URI片段標(biāo)識(shí)。

對(duì)一個(gè)值編碼多個(gè)引用是允許的,看上去這些引用好象是引用了多個(gè)不同的值,但事實(shí)上這些引用句柄引用的是同一值實(shí)體。

數(shù)組是復(fù)合值。SOAP數(shù)組被定義為類(lèi)型是“SOAP-ENC:Array”或類(lèi)型是源于“SOAP-ENC:Array”。

SOAP數(shù)組有一或多維,而它的成員由順序位置區(qū)分。一個(gè)數(shù)組的值被表示為一個(gè)能表示該數(shù)組的元素的序列,這些成員按序數(shù)從小到大順序出現(xiàn)。對(duì)于多維數(shù)組,則元素維按從右到左順序變化。每一個(gè)成員元素都被命名為一個(gè)獨(dú)立元素[參見(jiàn)編碼規(guī)則2]。

SOAP數(shù)組可以是單引用值,也可以是多引用值,從而可以被表示為一個(gè)嵌入元素或一個(gè)獨(dú)立元素。

SOAP數(shù)組必須包含一個(gè)“SOAP-ENC:arrayType”屬性,其中定義的包含元素的值的類(lèi)型與維數(shù)一起描述了該數(shù)組?!盨OAP-ENC:arrayType”屬性的值定義如下:

arrayTypeValue = atype asize
atype          = QName *( rank )
rank           = "[" *( "," ) "]"
asize          = "[" #length "]"
length         = 1*DIGIT

“atype”結(jié)構(gòu)是數(shù)組所包含的元素的類(lèi)型的名,首先它包含一個(gè)QName表示,QName應(yīng)在XML Schema元素聲明中的“type”屬性中出現(xiàn),是一個(gè)預(yù)先定義好的類(lèi)型名,QName是一個(gè)型約束(意味著所有其包含的元素都應(yīng)宣稱(chēng)與該指明的類(lèi)型相一致,也就是說(shuō),在SOAP-ENC:arrayType中引用的類(lèi)型必須是所有數(shù)組元素的類(lèi)型或元類(lèi)型)。對(duì)于那些數(shù)組的數(shù)組或是“jagged arrays”,使用rank結(jié)構(gòu)來(lái)表示數(shù)組的元素是一個(gè)數(shù)組,同時(shí)該數(shù)組的具體類(lèi)型將在下層具體成員數(shù)組的定義時(shí)進(jìn)行實(shí)例化,rank中出現(xiàn)零個(gè)、一個(gè)到多個(gè)逗號(hào),表明該成員變量是一維、二維或多維數(shù)組。對(duì)于多維數(shù)組,維數(shù)定義為一個(gè)由“,”分隔的維數(shù)序列,每個(gè)維數(shù)的計(jì)數(shù)基數(shù)為1(也就是說(shuō)聲明為6,就是有6個(gè)元素,但從后面的定義我們會(huì)知道每個(gè)成員的引用則是0..5)。

“asize”結(jié)構(gòu)包含一個(gè)由逗號(hào)分隔的由零個(gè)、一個(gè)或多個(gè)整數(shù)組成的序列指明的數(shù)組的每個(gè)維的長(zhǎng)度。一個(gè)由零個(gè)整數(shù)組成的序列表明對(duì)數(shù)組打下并沒(méi)有特別限制,不過(guò)具體的大小將由下層具體的成員來(lái)決定(例如“,,,”、“6,,6” “2,” “3,3”)。

例如,一個(gè)有5個(gè)成員的數(shù)組,每個(gè)成員的類(lèi)型都為integer數(shù)組,但各個(gè)成員的數(shù)組長(zhǎng)度可待定,那么它的arrayTypeValue的值就應(yīng)當(dāng)是 “int[][5]”。其中,atype的值是“int[]”,asize的值是“[5]”。類(lèi)似地,一個(gè)有3個(gè)成員的數(shù)組,成員類(lèi)型為integer二維數(shù)組,它的arrayTypeValue的值就應(yīng)當(dāng)是 “int[,][3]”。其中,atype的值是“int[,]”,asize的值是“[3]”。

SOAP數(shù)組成員可以包含一個(gè)“SOAP-ENC:offset”屬性來(lái)指明該成員在其裝載的數(shù)組中的偏移量。這也可以用于指明在一個(gè)部分描述的數(shù)組中成員的偏移。類(lèi)似的,SOAP數(shù)組成員可以包含一個(gè)“SOAP-ENC:position”屬性來(lái)指明該成員在其裝載的數(shù)組中的位置。這也可以用于指明在一個(gè)稀疏描述的數(shù)組中成員的位置?!癝OAP-ENC:offset”和“SOAP-ENC:position”屬性的值定義為:

arrayPoint = "[" #length "]"

他們的基數(shù)都是0。

NULL值和默認(rèn)值可以在存取標(biāo)識(shí)元素中省略(依賴(lài)于模式Schema中的定義,或者其他等價(jià)的方法)。NULL值可以在一個(gè)存取標(biāo)識(shí)元素中使用一個(gè)值為1的屬性xsi:null來(lái)指明,或者可以是其他依賴(lài)于應(yīng)用程序的屬性和值。
結(jié)語(yǔ)

本文介紹了SOAP消息中的型系統(tǒng)和值/類(lèi)型的基本遍序規(guī)則。我將在下一篇文章中詳細(xì)SOAP消息中各種具體類(lèi)型的定義描述方法和值表示方式。

參考資料

  • 解決B2B電子商務(wù)應(yīng)用交互和集成的InterOP Stack系列技術(shù)標(biāo)準(zhǔn)規(guī)范
    • UDDI Technical White Paper, Ariba Inc., IBM Corporation and Microsoft Corporation, 6 Sep 2000
    • Web Service Description Language (WSDL) 1.0, IBM, 25 Sep 2000
    • SOAP: Simple Object Access Protocol Specification 1.1, IBM, Microsoft, DevelopMentor, 2000
    • Extensible Markup Language (XML) 1.0 (Second Edition), W3C, 6 Oct 2000
    • XML Schema Part 0: Primer, W3C, 16 Apr 2001
    • XML Schema Part 1: Structures, W3C, 16 Apr 2001
    • XML Schema Part 2: Datatypes, W3C, 16 Apr 2001
  • SOAP開(kāi)發(fā)軟件包
    • Microsoft SOAP Toolkit 2.0, RC0, Microsoft Corporation
    • Apache SOAP 2.0, Apache.ORG

作者簡(jiǎn)介

 柴曉路:上海得易電子商務(wù)技術(shù)有限公司首席系統(tǒng)架構(gòu)師、XML技術(shù)顧問(wèn)。2000年獲復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)碩士學(xué)位,曾在國(guó)際計(jì)算機(jī)科學(xué)學(xué)術(shù)會(huì)議(ICSC)、中國(guó)XML技術(shù)研討會(huì)(北京)、計(jì)算機(jī)科學(xué)期刊等各類(lèi)國(guó)際、國(guó)內(nèi)重要會(huì)議與期刊上發(fā)表論文多篇。其專(zhuān)長(zhǎng)為 XML與數(shù)據(jù)交換、數(shù)據(jù)庫(kù)、面向?qū)ο蠹夹g(shù)等。

發(fā)布:2007-03-25 13:25    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章: