當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 河北O(jiān)A系統(tǒng) > 石家莊OA系統(tǒng) > 石家莊OA信息化
SOAP技術(shù)與B2B應(yīng)用集成--SOAP消息中的類型/值的編序方法和示例
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
AMTeam.orgSOAP技術(shù)與B2B應(yīng)用集成
--SOAP消息中的類型/值的編序方法和示例
柴曉路
Chief System Architect
2001年4月26日
本文延續(xù)SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則,著重介紹了SOAP消息中基本型系統(tǒng)中的基本類型、復(fù)合類型的編碼方式,并對(duì)復(fù)合類型中的數(shù)組進(jìn)行了著重的闡述,介紹了多維數(shù)組、多態(tài)數(shù)組、部分傳遞數(shù)組和稀疏數(shù)組的編碼方式。相信大家通過本文可以詳細(xì)地了解SOAP的編碼機(jī)制。
在前面的文章SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(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ù)合類型)。那么本文就分別針對(duì)簡單類型和復(fù)合類型(數(shù)組和結(jié)構(gòu))來詳細(xì)介紹類型和值的遍序方法,希望通過詳盡的示例給讀者以清晰的了解和掌握。
XML Schema提供了一種靈活性很高,具備良好可擴(kuò)展性的類型的定義描述方式。SOAP規(guī)范主要是采用XML Schema作為其類型模式的定義語言,當(dāng)然由于SOAP是開放的,靈活的,也可以使用其他任意的模式定義的XML Application來制訂特定應(yīng)用的類型和值的描述。
本文所引用的資源主要包括兩類,一類用于解決B2B電子商務(wù)應(yīng)用交互和集成的系列技術(shù)標(biāo)準(zhǔn)規(guī)范,他們與SOAP是一個(gè)不可分割的技術(shù)體系,包括UDDI、SOAP、WSDL、XML等,另一類是SOAP的開發(fā)軟件包,包括Microsoft的SOAP軟件包SOAPToolkit和Apache Project的SOAP Package。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過這些資源鏈接找到所需的內(nèi)容
簡單類型
對(duì)于簡單類型,SOAP采用了在XML Schema Part 2: Datatypes的“內(nèi)置數(shù)據(jù)類型Build-in datatypes”中定義的所有類型,包括值和詞匯空間(lexical spaces)。例子包括:
類型
例子
Int
58502
Float
314159265358979E+1
negativeInteger
-32768
String
Louis "Satchmo" Armstrong
在XML
Schema規(guī)范中聲明的數(shù)據(jù)類型可以直接在元素模式中使用。而源于這些類型的類型也可以被使用。下面是一個(gè)模式片段和相應(yīng)類型元素?cái)?shù)據(jù)的例子:
<element name="quantity" type="int"/>
<element
name="discount" type="float"/>
<element name="displacement"
type="negativeInteger"/>
<element name="color">
<simpleType base="xsd:string">
<enumeration
value="Green"/>
<enumeration
value="Blue"/>
</simpleType>
</element>
<quantity >45</quantity
>
<discount>5.9</discount>
<displacement>-450</displacement>
<color>Blue</color>
無論簡單值類型是在XML Schema Part 2: Datatypes規(guī)范中定義,還是基于XML Schema規(guī)范所提供的類型定義機(jī)制,都必須被編碼為元素的內(nèi)容。
如果一個(gè)簡單值被編碼為一個(gè)獨(dú)立元素或一個(gè)異構(gòu)數(shù)組的元素,這就意味著有一個(gè)對(duì)應(yīng)于數(shù)據(jù)類型的元素聲明。因?yàn)閄ML Schema Part 2: Datatypes規(guī)范中包含了類型定義,但沒有包含對(duì)應(yīng)元素的聲明,而SOAP-ENC模式和命名空間為每個(gè)簡單數(shù)據(jù)類型聲明了一個(gè)元素。這些定義都是可以被使用的。
<SOAP-ENC:int id="int1">45</SOAP-ENC:int>
字符串
"string"數(shù)據(jù)類型在XML Schema Part 2: Datatypes中被定義。值得注意的是在許多數(shù)據(jù)庫或編程語言中,"string"類型并不是一致的,在某些特別的語言中,可能只允許一些字符能出現(xiàn)在"string"中。(這些值可能需要表示為xsd:string之外的一些數(shù)據(jù)類型)
一個(gè)字串可以被編碼為一個(gè)單引用或多引用值。
包含string值的元素可以有一個(gè)"id"屬性。額外的存取標(biāo)識(shí)元素可以有匹配它的"href"屬性。
例如,如果有兩個(gè)對(duì)同一string的存取標(biāo)識(shí)出現(xiàn),則可以表現(xiàn)為:
<payment
id="String-0">USD$5000</payment>
<cost
href="#String-0"/>
無論如何,事實(shí)上對(duì)一個(gè)string(或者是string的子類型subtypr)的實(shí)例加以兩個(gè)引用與將他們編碼成兩個(gè)單引用值并沒有本質(zhì)的區(qū)別:
<payment>Hello</payment>
<cost>Hello</cost>
對(duì)于這些例子的模式描述可能是:
<element name="payment"
type="SOAP-ENC:string"/>
<element name="cost"
type="SOAP-ENC:string"/>
(在這個(gè)例子中,用于描述元素類型的SOAP-ENC:string類型是一個(gè)方便使用的方法,用這樣一個(gè)定義來描述一個(gè)元素的類型是"xsd:string",并且它可以附帶"id" 和"href"屬性。大家可以參閱SOAP Encoding Schema來得到確切的定義。實(shí)例模式也可以使用這些SOAP Encoding模式中的聲明,但這不是必須的。)
枚舉
XML Schema Part 2: Datatypes規(guī)范定義了一種稱為"玫舉enumeration"的機(jī)制。SOAP數(shù)據(jù)模型直接采用了這個(gè)機(jī)制??墒牵捎诰幊陶Z言及其他語言在定義玫舉上存在著一些細(xì)微的差別,因此我們?cè)谶@里描述了更詳細(xì)的概念,并描述了如何將一個(gè)成為玫舉列表成員的值進(jìn)行編碼。具體的,它編碼為該值的名。
在概念上,"玫舉"表示了一組不同的名。一個(gè)具體的玫舉是一個(gè)符合基本類型的不同值的具體列表。例如,顏色名("Green", "Blue", "Brown")的集合可以被定義為一個(gè)基于內(nèi)置string類型的玫舉, 值("1", "3", "5")則可能是一個(gè)基于integer的玫舉,等等。XML Schema Part 2: Datatypes規(guī)范支持除boolean外所有簡單類型的玫舉。"XML Schema Part 2: Structures"規(guī)范語言可以用于定義玫舉類型。如果一個(gè)模式是從另一種符號(hào)體系生成過來而沒有具體的基本類型可應(yīng)用,那么就使用"string"。在下面的模式例子"EyeColor"被定義為一個(gè)string的玫舉,其可能的值包括"Green"、"Blue"、"Brown",同時(shí)實(shí)例數(shù)據(jù)也對(duì)應(yīng)地被給出了。
<element name="ProductColor"
type="tns:ProductColor"/>
<simpleType name="ProductColor"
base="xsd:string">
<enumeration
value="Green"/>
<enumeration
value="Blue"/>
<enumeration
value="Brown"/>
</simpleType>
<Product>
<Name>Jaguar
X-Type</Name>
<Price>240000.00</Age>
<ProductColor>Brown</ProductColor>
</Product>
Byte數(shù)組
一個(gè)Byte數(shù)組可以編碼為單引用或多引用值。Byte數(shù)組的編碼規(guī)則與string是類似的。
特別的,包含Byte數(shù)組值的元素可以有一個(gè)"id"屬性。額外的存取標(biāo)識(shí)元素可以有一個(gè)用于匹配的"href"屬性。
對(duì)一個(gè)不透明的Byte數(shù)組的推薦表示是使用在XML Schema規(guī)范中定義的"base64"編碼方式,具體編碼算法是在RFC2045中定義。不過,MIME中base64編碼數(shù)據(jù)的數(shù)據(jù)行長度限制在SOAP中將不存在。SOAP中應(yīng)使用"SOAP-ENC:base64"子類型來定義base64編碼。
<picture xsi:type="SOAP-ENC:base64">
aG93IG5vDyBicm73biBjb3cNCg==
</picture>
多態(tài)存取標(biāo)識(shí)
許多語言允許存取標(biāo)識(shí)可以是多態(tài)地訪問數(shù)個(gè)類型的值,在運(yùn)行時(shí)刻每個(gè)類型都是可使用的。一個(gè)多態(tài)存取標(biāo)識(shí)實(shí)例必須包含一個(gè)"xsi:type"屬性以描述類型的實(shí)際值。
例如,一個(gè)名為"cost"帶有類型為"xsd:float"的值的多態(tài)存取標(biāo)識(shí)可以編碼為:
<cost xsi:type="xsd:float">29.95</cost>
與之相對(duì)的是一個(gè)值類型不變的cost存取標(biāo)識(shí)。
<cost>29.95</cost>
多態(tài)的具體表示將僅在實(shí)例中出現(xiàn),但多態(tài)的定義是在模式中出現(xiàn),即在模式中應(yīng)不綁定任意具體類型。
復(fù)合類型
SOAP依照在程序語言中常??匆姷囊韵陆Y(jié)構(gòu)模式來定義復(fù)合類型:
結(jié)構(gòu)
"struct結(jié)構(gòu)"是一個(gè)復(fù)合類型值,其成員的存取標(biāo)識(shí)名是相互區(qū)別的唯一標(biāo)志,應(yīng)彼此各不相同。
數(shù)組
"array數(shù)組"是一個(gè)復(fù)合類型值,其成員的順序位置是相互區(qū)別的唯一標(biāo)志。
復(fù)合值、結(jié)構(gòu)和值的引用
復(fù)合值的成員被編碼為存取標(biāo)識(shí)元素。存取標(biāo)識(shí)由他們的名字來相區(qū)別(例如在struct里面),而元素名就是存取標(biāo)識(shí)名。存取標(biāo)識(shí)名是局部的,作用域是包含他們的類型中,具備一個(gè)未修飾的元素名,而其他則有完全修飾名。
下面是一個(gè)"Book"結(jié)構(gòu)的例子:
<e:Book>
<author>CHAI
Xiaolu</author>
<preface>Prefatory
text</preface>
<intro>This is a
book.</intro>
</e:Book>
下面則是一個(gè)描述該結(jié)構(gòu)的模式片段:
<element name="Book">
<complexType>
<element name="author" type="xsd:string"/>
<element
name="preface" type="xsd:string"/>
<element name="intro"
type="xsd:string"/>
</complexType>
</e:Book>
下面是一個(gè)即包含簡單類型成員也包含復(fù)合類型成員的類型的例子。它顯示了兩層的引用。注意"Author"存取標(biāo)識(shí)元素的"href"屬性對(duì)匹配"id"值對(duì)應(yīng)的值的引用。"Address"中的情況也是類似的。
<e:Book>
<title>InterOP Stack
Technology</title>
<author
href="#Person-1"/>
</e:Book>
<e:Person
id="Person-1">
<name>CHAI
Xiaolu</name>
<address
href="#Address-2"/>
</e:Person>
<e:Address
id="Address-2">
<email>mailto:fennivel@dealeasy.com</email>
<web>http://fennivel.xmlprobe.com</web>
</e:Address>
當(dāng)"Person"和"Address"的值是需要多引用的時(shí)候,上述描述是合適的。如果使用單引用來描述,則應(yīng)該是嵌入的,如下:
<e:Book>
<title>InterOP Stack
Technology</title>
<author>
<name>CHAI
Xiaolu</name>
<address>
<email>mailto:fennivel@dealeasy.com</email>
<web>http://fennivel.xmlprobe.com</web>
</address>
</author>
</e:Book>
如果這里存在著一個(gè)限制:在一個(gè)給出的實(shí)例中不允許有兩個(gè)人有同樣的地址,地址可以是一個(gè)街道地址(Street-address),也可以是一個(gè)電子地址(Electronic-address)。一本有兩個(gè)作者的書可以編碼為:
<e:Book>
<title>InterOP Stack
Technology</title>
<firstauthor
href="#Person-1"/>
<secondauthor
href="#Person-2"/>
</e:Book>
<e:Person
id="Person-1">
<name>CHAI
Xiaolu</name>
<address
xsi:type="m:Electronic-address">
<email>mailto:fennivel@dealeasy.com</email>
<web>http://fennivel.xmlprobe.com</web>
</address>
</e:Person>
<e:Person
id="Person-2">
<name>Fennivel</name>
<address
xsi:type="n:Street-address">
<street>Fennix 2000</street>
<city>Shanghai</city>
<state>Shanghai</state>
</address>
</e:Person>
編序也可以包含一些不在同一資源中的值的引用:
<e:Book>
<title>Paradise
Lost</title>
<firstauthor href="http://www.dartmouth.edu/~milton/"/>
</e:Book>
同時(shí)下面是一個(gè)對(duì)上面結(jié)構(gòu)的模式描述片段:
<element name="Book" type="tns:Book"/>
<complexType
name="Book">
<!-- Either the following group must occur or
else the
href attribute must
appear, but not both. -->
<sequence minOccurs="0"
maxOccurs="1">
<element
name="title" type="xsd:string"/>
<element name="firstauthor"
type="tns:Person"/>
<element
name="secondauthor" type="tns:Person"/>
</sequence>
<attribute name="href"
type="uriReference"/>
<attribute name="id"
type="ID"/>
<anyAttribute
namespace="##other"/>
</complexType>
<element name="Person"
base="tns:Person"/>
<complexType name="Person">
<!-- Either the following group must occur or else
the
href attribute must appear,
but not both. -->
<sequence minOccurs="0"
maxOccurs="1">
<element
name="name" type="xsd:string"/>
<element name="address" type="tns:Address"/>
</sequence>
<attribute name="href"
type="uriReference"/>
<attribute name="id"
type="ID"/>
<anyAttribute
namespace="##other"/>
</complexType>
<element name="Address"
base="tns:Address"/>
<complexType name="Address">
<!-- Either the following group must occur or else
the
href attribute must appear,
but not both. -->
<sequence minOccurs="0"
maxOccurs="1">
<element
name="street" type="xsd:string"/>
<element name="city"
type="xsd:string"/>
<element
name="state" type="xsd:string"/>
</sequence>
<attribute name="href"
type="uriReference"/>
<attribute name="id"
type="ID"/>
<anyAttribute
namespace="##other"/>
</complexType>
數(shù)組
SOAP數(shù)組被定義為類型為"SOAP-ENC:Array"或類型源于"SOAP-ENC:Array"[參閱規(guī)則8]。數(shù)組被表示為對(duì)包含其的元素的名無特殊約束的元素值(就象元素的值一般不會(huì)約束元素的名)。
數(shù)組可以包含任意類型的元素,包括嵌套數(shù)組。由SOAP-ENC:Array的約束建立的新類型也可以被創(chuàng)建并表示,例如,數(shù)組可以限于整數(shù)或一些用戶自定義玫舉型的數(shù)組。
數(shù)組值的表示是一個(gè)有序序列,該有序序列由該數(shù)組組成元素序列化組成。作為一個(gè)數(shù)組的值,元素名對(duì)于區(qū)分存取標(biāo)識(shí)并非重要。元素可以有任意的名。實(shí)際上,這些元素的命名將按照模式中聲明的建議,或由他們的類型所決定。就象在復(fù)合類型中通常情況下,如果數(shù)組中條目的值是單引用值,則該條目將包含它的值。否則,條目通過"href"屬性引用它的值。
下面是一個(gè)模式的片段以及一個(gè)包含integer成員的數(shù)組:
<element
name="myFavoriteNumbers"
type="SOAP-ENC:Array"/>
<myFavoriteNumbers
SOAP-ENC:arrayType="xsd:int[2]">
<number>3</number>
<number>4</number>
</myFavoriteNumbers>
在這個(gè)例子中,"myFavoriteNumber"包含了幾個(gè)成員,每個(gè)成員的值的類型都是SOAP-ENC:int。而類型是由SOAP-ENC:arrayType屬性決定的。注意SOAP-ENC:Array的類型允許不嚴(yán)格的未修飾的元素名。這些名只傳輸了非類型的信息,因此在具體使用的時(shí)候,要么有一個(gè)xsi:type屬性,要么包含它的元素要包含一個(gè)SOAP-ENC:arrayType屬性。自然地,源于SOAP-ENC:Array的類型可以聲明帶類型信息的局部元素。
就象先前指出的,SOAP-ENC模式包含了一些元素名的申明,而這些名是對(duì)應(yīng)于 XML Schema Part 2: Datatypes規(guī)范中的每個(gè)簡單類型的。這也包含一個(gè)"Array"的聲明。使用這些定義,我們也許可以將顯現(xiàn)先前的描述改寫為:
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:int[2]">
<SOAP-ENC:int>3</SOAP-ENC:int>
<SOAP-ENC:int>4</SOAP-ENC:int>
</SOAP-ENC:Array>
數(shù)組可以包含任意指定arrayType的子類型的實(shí)例。也就是說,成員的類型可以是任何描述在arrayType屬性中類型的可替代類型,這將依照于在模式中表示的可替代規(guī)則。因此,例如,一個(gè)整數(shù)數(shù)組可以包含任何源于integer的類型的值(例如 "int"或任何用戶定義的源于integer的類型)。類似的,一個(gè)"address"數(shù)組可以包含一個(gè)嚴(yán)格的或擴(kuò)展的類型,比如"internationalAddress"。因?yàn)樘峁┑腟OAP-ENC:Array類型允許包含任何類型或類型混合的成員,除非有對(duì)arrayType屬性使用的特別限制。
成員元素類型在實(shí)例中可以使用xsi:type來描述,或則是在成員元素模式中聲明,就象在下面兩個(gè)數(shù)組中分別演示的那樣。
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:ur-type[4]">
<thing
xsi:type="xsd:int">12345</thing>
<thing
xsi:type="xsd:decimal">6.789</thing>
<thing
xsi:type="xsd: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="xsd:uriReference">
http://fennivel.xmlprobe.com/collection/
</thing>
</SOAP-ENC:Array>
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:ur-type[4]">
<SOAP-ENC:int>12345</SOAP-ENC:int>
<SOAP-ENC:decimal>6.789</SOAP-ENC:decimal>
<xsd:string>
Of Mans First Disobedience,
and the Fruit
Of that Forbidden Tree, whose
mortal tast
Brought Death into the World, and
all our woe,
</xsd:string>
<SOAP-ENC:uriReference>
http://fennivel.xmlprobe.com/collection/
</SOAP-ENC:uriReference >
</SOAP-ENC:Array>
數(shù)組值可以是結(jié)構(gòu)或其他復(fù)合值。例如一個(gè)"xyz:Order"結(jié)構(gòu)的數(shù)組:
<SOAP-ENC:Array
SOAP-ENC:arrayType="xyz:Order[2]">
<Order>
<Product>Apple</Product>
<Price>1.56</Price>
</Order>
<Order>
<Product>Peach</Product>
<Price>1.48</Price>
</Order>
</SOAP-ENC:Array>
數(shù)組也可以有一些成員值是數(shù)組。下面是一個(gè)有兩個(gè)數(shù)組的數(shù)組的例子,而那兩個(gè)數(shù)組都是string數(shù)組:
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:string[][2]">
<item
href="#array-1"/>
<item
href="#array-2"/>
</SOAP-ENC:Array>
<SOAP-ENC:Array
id="array-1" SOAP-ENC:arrayType="xsd:string[2]">
<item>r1c1</item>
<item>r1c2</item>
<item>r1c3</item>
</SOAP-ENC:Array>
<SOAP-ENC:Array
id="array-2" SOAP-ENC:arrayType="xsd:string[2]">
<item>r2c1</item>
<item>r2c2</item>
</SOAP-ENC:Array>
包含一個(gè)數(shù)組值的元素并不需要一定被命名為"SOAP-ENC:Array"。它可以有任意的名,而提供的類型則要么是SOAP-ENC:Array,要么是受源于SOAP-ENC:Array的限制。例如,下面是一個(gè)模式片段以及與之一致的一個(gè)實(shí)例數(shù)組。
<simpleType name="phoneNumber" base="string"/>
<element name="ArrayOfPhoneNumbers">
<complexType base="SOAP-ENC:Array">
<element
name="phoneNumber" type="tns:phoneNumber" maxOccurs="unbounded"/>
</complexType>
<anyAttribute/>
</element>
<xyz:ArrayOfPhoneNumbers
SOAP-ENC:arrayType="xyz:phoneNumber[2]">
<phoneNumber>206-555-1212</phoneNumber>
<phoneNumber>1-888-123-4567</phoneNumber>
</xyz:ArrayOfPhoneNumbers>
數(shù)組可以是多維的。在這種情況下,就會(huì)有多個(gè)描述維數(shù)大小的值出現(xiàn)在arrayType屬性的asize部分。
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:string[2,3]">
<item>r1c1</item>
<item>r1c2</item>
<item>r1c3</item>
<item>r2c1</item>
<item>r2c2</item>
<item>r2c3</item>
</SOAP-ENC:Array>
上述例子中顯示了一個(gè)數(shù)組如何被編碼為獨(dú)立元素,數(shù)組值可以以嵌套方式出現(xiàn),如果并且他們是單引用的話,建議是以嵌套方式出現(xiàn)。
下面是一個(gè)模式片段的例子以及符合該模式的一個(gè)嵌套在"Person"結(jié)構(gòu)中的電話號(hào)碼數(shù)組,該數(shù)組可以從存取標(biāo)識(shí)"phone-numbers"訪問。
<simpleType name="phoneNumber" base="string"/>
<element name="ArrayOfPhoneNumbers">
<complexType base="SOAP-ENC:Array">
<element
name="phoneNumber" type="tns:phoneNumber" maxOccurs="unbounded"/>
</complexType>
<anyAttribute/>
</element>
<element name="Person">
<complexType>
<element name="name"
type="string"/>
<element name="phoneNumbers"
type="tns:ArrayOfPhoneNumbers"/>
</complexType>
</element>
<xyz:Person>
<name>John
Hancock</name>
<phoneNumbers
SOAP-ENC:arrayType="xyz:phoneNumber[2]">
<phoneNumber>206-555-1212</phoneNumber>
<phoneNumber>1-888-123-4567</phoneNumber>
</phoneNumbers>
</xyz:Person>
下面是單引用數(shù)組值的另一個(gè)例子,數(shù)組值被編碼為嵌入元素,這些元素都包含作為存取標(biāo)識(shí)的元素名。
<xyz:PurchaseOrder>
<CustomerName>Henry Ford</CustomerName>
<ShipTo>
<Street>5th
Ave</Street>
<City>New
York</City>
<State>NY</State>
<Zip>10010</Zip>
</ShipTo>
<PurchaseLineItems
SOAP-ENC:arrayType="Order[2]">
<Order>
<Product>Apple</Product>
<Price>1.56</Price>
</Order>
<Order>
<Product>Peach</Product>
<Price>1.48</Price>
</Order>
</PurchaseLineItems>
</xyz:PurchaseOrder>
部分傳遞數(shù)組
SOAP提供對(duì)部分傳遞數(shù)組的支持,這就象在一些場合下稱作的"可變長"數(shù)組。一個(gè)部分傳遞數(shù)組應(yīng)使用"SOAP-ENC:offset"屬性標(biāo)識(shí),該屬性的記數(shù)是以第一元素的位移為0開始的。如果省略該屬性,則位移默認(rèn)是0。
下面是一個(gè)大小為5的數(shù)組,同時(shí)在傳遞的時(shí)候僅傳遞第三和第四個(gè)元素:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[5]"
SOAP-ENC:offset="[2]">
<item>The third
element</item>
<item>The fourth
element</item>
</SOAP-ENC:Array>
稀疏數(shù)組
SOAP提供對(duì)稀疏數(shù)組的支持。每一個(gè)表示成員值的元素包含一個(gè)"SOAP-ENC:position"屬性來表明它處于數(shù)組的位置。下面是一個(gè)二維字串?dāng)?shù)組的稀疏數(shù)組的例子。他的大小是4,但僅有位置2被使用:
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:string[,][4]">
<SOAP-ENC:Array
href="#array-1"
SOAP-ENC:position="[2]"/>
</SOAP-ENC:Array>
<SOAP-ENC:Array
id="array-1" SOAP-ENC:arrayType="xsd:string[10,10]">
<item
SOAP-ENC:position="[2,2]">Third row, third col</item>
<item SOAP-ENC:position="[7,2]">Eighth row, third
col</item>
</SOAP-ENC:Array>
如果在上述數(shù)組中對(duì)array-1僅有一個(gè)引用,那上述例子可以被編碼為:
<SOAP-ENC:Array
SOAP-ENC:arrayType="xsd:string[,][4]">
<SOAP-ENC:Array
SOAP-ENC:position="[2]"
SOAP-ENC:arrayType="xsd:string[10,10]>
<item
SOAP-ENC:position="[2,2]">Third row, third
col</item>
<item
SOAP-ENC:position="[7,2]">Eighth row, third col</item>
</SOAP-ENC:Array>
</SOAP-ENC:Array>
復(fù)合類型的泛化規(guī)則
上面引用到的編碼規(guī)則并不限于那些預(yù)先知道存取標(biāo)識(shí)的情形。如果存取標(biāo)識(shí)名僅當(dāng)在編碼過程中由值的出現(xiàn)才能決定的時(shí)候,同樣的規(guī)則也可以應(yīng)用,也就是一個(gè)存取標(biāo)識(shí)被編碼為同名的元素,并且該存取標(biāo)識(shí)要么包含要么引用它的值。包含那些類型不能預(yù)先決定的值的存取標(biāo)識(shí)必須包含一個(gè)合適的xsi:type屬性來給出值的類型。
類似的,通過使用引用的編碼規(guī)則對(duì)于包含一些混合的存取標(biāo)識(shí)的復(fù)合類型的編序而言已經(jīng)足夠了,這些存取標(biāo)識(shí)有的是以名來區(qū)分,有的是以名和位置來區(qū)分 (也就是說,有些存取標(biāo)識(shí)會(huì)重復(fù)出現(xiàn)) 。這并不一定需要有包含這一類型的模式存在,但是如果一個(gè)類型模型模式?jīng)]有該類型時(shí),那么一個(gè)對(duì)應(yīng)的XML句法模式和實(shí)例就應(yīng)該被生成。
<xyz:PurchaseOrder>
<CustomerName>Henry Ford</CustomerName>
<ShipTo>
<Street>5th
Ave</Street>
<City>New
York</City>
<State>NY</State>
<Zip>10010</Zip>
</ShipTo>
<PurchaseLineItems>
<Order>
<Product>Apple</Product>
<Price>1.56</Price>
</Order>
<Order>
<Product>Peach</Product>
<Price>1.48</Price>
</Order>
</PurchaseLineItems>
</xyz:PurchaseOrder>
類似的,將一個(gè)復(fù)合類型值編序?yàn)轭愃茢?shù)組結(jié)構(gòu)的是合法的,但這不是SOAP-ENC:Array類型或其子類型。例如:
<PurchaseLineItems>
<Order>
<Product>Apple</Product>
<Price>1.56</Price>
</Order>
<Order>
<Product>Peach</Product>
<Price>1.48</Price>
</Order>
</PurchaseLineItems>
默認(rèn)值
一個(gè)使用省略格式的存取標(biāo)識(shí)元素意味著有一個(gè)默認(rèn)值或是尚不知道它的值。而該細(xì)節(jié)是基于存取標(biāo)識(shí)、方法和上下文的。例如一個(gè)省略格式的存取標(biāo)識(shí)典型地是表示一個(gè)多態(tài)存取標(biāo)識(shí)的Null值(Null依賴存取標(biāo)識(shí)的確切含義)。同樣地,一個(gè)省略格式的Boolean存取標(biāo)識(shí)典型地就意味著是一個(gè)False值或值未知,同時(shí)一個(gè)省略格式的數(shù)值存取標(biāo)識(shí)典型地意味著它的值是0或值未知。
SOAP root屬性
SOAP root屬性可以被用來標(biāo)注編序的根,當(dāng)然他并不是對(duì)象圖真正的根,所以對(duì)象圖是可以解序的。該屬性可以賦予"0"和"1"這兩個(gè)值的任意一個(gè)。一個(gè)對(duì)象圖的真正的根一般就有值"1"。那些非真正根的編序根也可以被標(biāo)注為賦予值為"1"的編序根。一個(gè)元素也可以被明確地標(biāo)注為賦予值為"0"的非編序根。
SOAP根屬性可以出現(xiàn)在SOAP Header和SOAP Body元素中的任何子元素里,該屬性并沒有一個(gè)默認(rèn)值。
該屬性一般被用于使用了非嵌套方法(通過多引用來實(shí)現(xiàn))的情形,由于存在同一層次的多個(gè)形式的根,因此需要標(biāo)識(shí)真正的根。
結(jié)語
至此,SOAP的基于XML Schema的型和值的描述機(jī)制已經(jīng)介紹完畢,相信大家對(duì)如果使用SOAP消息來傳輸調(diào)用信息和響應(yīng)信息已經(jīng)有了一個(gè)比較全面和深入的認(rèn)識(shí),在本系列的最后一篇文章中我將就SOAP各個(gè)方面的協(xié)同和應(yīng)用、與SOAP相關(guān)的其他技術(shù)規(guī)范與SOAP的協(xié)同及其在B2B Integration中的應(yīng)用加以總結(jié)并為下一個(gè)文章系列開一個(gè)頭。
參考資料
- 解決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
- Multipurpose
Internet Mail Extensions (MIME) Part One: Format of Internet Message
Bodies, RFC2045,November 1996
- UDDI
Technical White Paper, Ariba Inc., IBM Corporation and Microsoft
Corporation, 6 Sep 2000
- SOAP開發(fā)軟件包
-
- Microsoft
SOAP Toolkit 2.0, RC0, Microsoft Corporation
- Apache SOAP 2.0, Apache.ORG
- Microsoft
SOAP Toolkit 2.0, RC0, Microsoft Corporation
作者簡介
- 1Accessing Server Variables From Within Web Services
- 2再次跨越障礙--重新審視XML中的語義透明性
- 3知識(shí)發(fā)現(xiàn)與數(shù)據(jù)挖掘
- 4石家莊OA信息化創(chuàng)造競爭優(yōu)勢(shì)
- 5Licensing
- 6石家莊OA信息化的價(jià)值和挑戰(zhàn)
- 7大型集團(tuán)公司OA辦公系統(tǒng)平臺(tái)建設(shè)實(shí)施計(jì)劃
- 8Web服務(wù)的(革)創(chuàng)新,第2部分
- 9石家莊OA信息化的基本XML和RDF技術(shù)(二):將文件合并到RDF模型和基本的RDF查詢
- 10[編譯] 石家莊OA信息化測(cè)度:目標(biāo)、過程及方法(夏敬華譯)
- 11關(guān)于模型的簡單介紹!
- 12Web服務(wù)內(nèi)幕,第7部分:WSFL和遞歸組合
- 13如何利用CICADA知識(shí)搜索引擎提升知識(shí)獲取能力
- 14InterOP Stack新一代平臺(tái)互操作技術(shù):InterOP Stack技術(shù)應(yīng)用前瞻
- 15知識(shí)地圖在項(xiàng)目型組織中的應(yīng)用
- 16Web服務(wù)設(shè)計(jì)師,第3部分:Web服務(wù)是CORBA的翻版嗎?
- 17關(guān)于群體智慧積累和傳遞的思考(by AMT 王玉榮)
- 18石家莊OA信息化,知識(shí)組織和知識(shí)工作者:來自前沿的觀點(diǎn)
- 19包裝你知道的一切
- 20Web Services with ASP.NET
- 21尊重知識(shí) 崇尚理性
- 22為企業(yè)開啟Web服務(wù)之門-Sun ONE軟件產(chǎn)品發(fā)布會(huì)在京舉行
- 23對(duì)某集團(tuán)公司協(xié)同辦公系統(tǒng)未來3-5年的IT規(guī)劃建設(shè)藍(lán)圖
- 24BEA舉辦BEA WebLogic Platform 7.0新產(chǎn)品推介會(huì)
- 25XML Web Service 安全性
- 26固化組織知識(shí)
- 27OA辦公系統(tǒng)可以幫助企業(yè)擺脫束縛
- 28xml and KM
- 29協(xié)同辦公OA軟件對(duì)系統(tǒng)登陸的安全設(shè)置
- 30石家莊OA信息化項(xiàng)目的“做”與“不做”(BY AMT 夏敬華)
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
版權(quán)所有:泛普軟件 渝ICP備14008431號(hào)-2 渝公網(wǎng)安備50011202501700號(hào) 咨詢電話:400-8352-114