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

SOAP技術(shù)與B2B應(yīng)用集成--SOAP消息中的類型/值的編序方法和示例

申請免費試用、咨詢電話:400-8352-114

AMTeam.org

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

--SOAP消息中的類型/值的編序方法和示例

柴曉路
Chief System Architect
2001年4月26日

 本文延續(xù)SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則,著重介紹了SOAP消息中基本型系統(tǒng)中的基本類型、復合類型的編碼方式,并對復合類型中的數(shù)組進行了著重的闡述,介紹了多維數(shù)組、多態(tài)數(shù)組、部分傳遞數(shù)組和稀疏數(shù)組的編碼方式。相信大家通過本文可以詳細地了解SOAP的編碼機制。

在前面的文章SOAP的型系統(tǒng)和數(shù)據(jù)編碼規(guī)則中,我們能了解到SOAP的類型和數(shù)據(jù)的編碼是基于一個簡單類型系統(tǒng)的,這個簡單類型系統(tǒng)是基于程序語言、數(shù)據(jù)庫和半結(jié)構(gòu)數(shù)據(jù)中的類型系統(tǒng)的,是程序語言、數(shù)據(jù)庫和半結(jié)構(gòu)數(shù)據(jù)中類型系統(tǒng)的公共特性的一個泛化。在該簡單類型系統(tǒng)中,一個類型要么是一個簡單(可量化的)類型或是一個復合類型,這個復合類型由多個部分組成,每個部分是一個類型(包括簡單類型或復合類型)。那么本文就分別針對簡單類型和復合類型(數(shù)組和結(jié)構(gòu))來詳細介紹類型和值的遍序方法,希望通過詳盡的示例給讀者以清晰的了解和掌握。

XML Schema提供了一種靈活性很高,具備良好可擴展性的類型的定義描述方式。SOAP規(guī)范主要是采用XML Schema作為其類型模式的定義語言,當然由于SOAP是開放的,靈活的,也可以使用其他任意的模式定義的XML Application來制訂特定應(yīng)用的類型和值的描述。

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

簡單類型

對于簡單類型,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ù)類型可以直接在元素模式中使用。而源于這些類型的類型也可以被使用。下面是一個模式片段和相應(yīng)類型元素數(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ī)范所提供的類型定義機制,都必須被編碼為元素的內(nèi)容。

如果一個簡單值被編碼為一個獨立元素或一個異構(gòu)數(shù)組的元素,這就意味著有一個對應(yīng)于數(shù)據(jù)類型的元素聲明。因為XML Schema Part 2: Datatypes規(guī)范中包含了類型定義,但沒有包含對應(yīng)元素的聲明,而SOAP-ENC模式和命名空間為每個簡單數(shù)據(jù)類型聲明了一個元素。這些定義都是可以被使用的。

<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ù)類型)

一個字串可以被編碼為一個單引用或多引用值。

包含string值的元素可以有一個"id"屬性。額外的存取標識元素可以有匹配它的"href"屬性。

例如,如果有兩個對同一string的存取標識出現(xiàn),則可以表現(xiàn)為:

<payment id="String-0">USD$5000</payment>
<cost href="#String-0"/>

無論如何,事實上對一個string(或者是string的子類型subtypr)的實例加以兩個引用與將他們編碼成兩個單引用值并沒有本質(zhì)的區(qū)別:

<payment>Hello</payment>
<cost>Hello</cost>

對于這些例子的模式描述可能是:

<element name="payment" type="SOAP-ENC:string"/>
<element name="cost" type="SOAP-ENC:string"/>

(在這個例子中,用于描述元素類型的SOAP-ENC:string類型是一個方便使用的方法,用這樣一個定義來描述一個元素的類型是"xsd:string",并且它可以附帶"id" 和"href"屬性。大家可以參閱SOAP Encoding Schema來得到確切的定義。實例模式也可以使用這些SOAP Encoding模式中的聲明,但這不是必須的。)

枚舉

XML Schema Part 2: Datatypes規(guī)范定義了一種稱為"玫舉enumeration"的機制。SOAP數(shù)據(jù)模型直接采用了這個機制??墒?,由于編程語言及其他語言在定義玫舉上存在著一些細微的差別,因此我們在這里描述了更詳細的概念,并描述了如何將一個成為玫舉列表成員的值進行編碼。具體的,它編碼為該值的名。

在概念上,"玫舉"表示了一組不同的名。一個具體的玫舉是一個符合基本類型的不同值的具體列表。例如,顏色名("Green", "Blue", "Brown")的集合可以被定義為一個基于內(nèi)置string類型的玫舉, 值("1", "3", "5")則可能是一個基于integer的玫舉,等等。XML Schema Part 2: Datatypes規(guī)范支持除boolean外所有簡單類型的玫舉。"XML Schema Part 2: Structures"規(guī)范語言可以用于定義玫舉類型。如果一個模式是從另一種符號體系生成過來而沒有具體的基本類型可應(yīng)用,那么就使用"string"。在下面的模式例子"EyeColor"被定義為一個string的玫舉,其可能的值包括"Green"、"Blue"、"Brown",同時實例數(shù)據(jù)也對應(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ù)組

一個Byte數(shù)組可以編碼為單引用或多引用值。Byte數(shù)組的編碼規(guī)則與string是類似的。

特別的,包含Byte數(shù)組值的元素可以有一個"id"屬性。額外的存取標識元素可以有一個用于匹配的"href"屬性。

對一個不透明的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)存取標識

許多語言允許存取標識可以是多態(tài)地訪問數(shù)個類型的值,在運行時刻每個類型都是可使用的。一個多態(tài)存取標識實例必須包含一個"xsi:type"屬性以描述類型的實際值。

例如,一個名為"cost"帶有類型為"xsd:float"的值的多態(tài)存取標識可以編碼為:

<cost xsi:type="xsd:float">29.95</cost>

與之相對的是一個值類型不變的cost存取標識。

<cost>29.95</cost>

多態(tài)的具體表示將僅在實例中出現(xiàn),但多態(tài)的定義是在模式中出現(xiàn),即在模式中應(yīng)不綁定任意具體類型。

復合類型

SOAP依照在程序語言中常常看見的以下結(jié)構(gòu)模式來定義復合類型:

結(jié)構(gòu)

"struct結(jié)構(gòu)"是一個復合類型值,其成員的存取標識名是相互區(qū)別的唯一標志,應(yīng)彼此各不相同。

數(shù)組

"array數(shù)組"是一個復合類型值,其成員的順序位置是相互區(qū)別的唯一標志。

復合值、結(jié)構(gòu)和值的引用

復合值的成員被編碼為存取標識元素。存取標識由他們的名字來相區(qū)別(例如在struct里面),而元素名就是存取標識名。存取標識名是局部的,作用域是包含他們的類型中,具備一個未修飾的元素名,而其他則有完全修飾名。

下面是一個"Book"結(jié)構(gòu)的例子:

<e:Book>
   <author>CHAI Xiaolu</author>
   <preface>Prefatory text</preface>
   <intro>This is a book.</intro>
</e:Book>

下面則是一個描述該結(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>

下面是一個即包含簡單類型成員也包含復合類型成員的類型的例子。它顯示了兩層的引用。注意"Author"存取標識元素的"href"屬性對匹配"id"值對應(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>

當"Person"和"Address"的值是需要多引用的時候,上述描述是合適的。如果使用單引用來描述,則應(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>

如果這里存在著一個限制:在一個給出的實例中不允許有兩個人有同樣的地址,地址可以是一個街道地址(Street-address),也可以是一個電子地址(Electronic-address)。一本有兩個作者的書可以編碼為:

<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>

同時下面是一個對上面結(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ù)組被表示為對包含其的元素的名無特殊約束的元素值(就象元素的值一般不會約束元素的名)。

數(shù)組可以包含任意類型的元素,包括嵌套數(shù)組。由SOAP-ENC:Array的約束建立的新類型也可以被創(chuàng)建并表示,例如,數(shù)組可以限于整數(shù)或一些用戶自定義玫舉型的數(shù)組。

數(shù)組值的表示是一個有序序列,該有序序列由該數(shù)組組成元素序列化組成。作為一個數(shù)組的值,元素名對于區(qū)分存取標識并非重要。元素可以有任意的名。實際上,這些元素的命名將按照模式中聲明的建議,或由他們的類型所決定。就象在復合類型中通常情況下,如果數(shù)組中條目的值是單引用值,則該條目將包含它的值。否則,條目通過"href"屬性引用它的值。

下面是一個模式的片段以及一個包含integer成員的數(shù)組:

<element name="myFavoriteNumbers"
        type="SOAP-ENC:Array"/>

<myFavoriteNumbers
  SOAP-ENC:arrayType="xsd:int[2]">
   <number>3</number>
   <number>4</number>
</myFavoriteNumbers>

在這個例子中,"myFavoriteNumber"包含了幾個成員,每個成員的值的類型都是SOAP-ENC:int。而類型是由SOAP-ENC:arrayType屬性決定的。注意SOAP-ENC:Array的類型允許不嚴格的未修飾的元素名。這些名只傳輸了非類型的信息,因此在具體使用的時候,要么有一個xsi:type屬性,要么包含它的元素要包含一個SOAP-ENC:arrayType屬性。自然地,源于SOAP-ENC:Array的類型可以聲明帶類型信息的局部元素。

就象先前指出的,SOAP-ENC模式包含了一些元素名的申明,而這些名是對應(yīng)于 XML Schema Part 2: Datatypes規(guī)范中的每個簡單類型的。這也包含一個"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的子類型的實例。也就是說,成員的類型可以是任何描述在arrayType屬性中類型的可替代類型,這將依照于在模式中表示的可替代規(guī)則。因此,例如,一個整數(shù)數(shù)組可以包含任何源于integer的類型的值(例如 "int"或任何用戶定義的源于integer的類型)。類似的,一個"address"數(shù)組可以包含一個嚴格的或擴展的類型,比如"internationalAddress"。因為提供的SOAP-ENC:Array類型允許包含任何類型或類型混合的成員,除非有對arrayType屬性使用的特別限制。

成員元素類型在實例中可以使用xsi:type來描述,或則是在成員元素模式中聲明,就象在下面兩個數(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)或其他復合值。例如一個"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ù)組。下面是一個有兩個數(shù)組的數(shù)組的例子,而那兩個數(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>

包含一個數(shù)組值的元素并不需要一定被命名為"SOAP-ENC:Array"。它可以有任意的名,而提供的類型則要么是SOAP-ENC:Array,要么是受源于SOAP-ENC:Array的限制。例如,下面是一個模式片段以及與之一致的一個實例數(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ù)組可以是多維的。在這種情況下,就會有多個描述維數(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>

上述例子中顯示了一個數(shù)組如何被編碼為獨立元素,數(shù)組值可以以嵌套方式出現(xiàn),如果并且他們是單引用的話,建議是以嵌套方式出現(xiàn)。

下面是一個模式片段的例子以及符合該模式的一個嵌套在"Person"結(jié)構(gòu)中的電話號碼數(shù)組,該數(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ù)組值的另一個例子,數(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提供對部分傳遞數(shù)組的支持,這就象在一些場合下稱作的"可變長"數(shù)組。一個部分傳遞數(shù)組應(yīng)使用"SOAP-ENC:offset"屬性標識,該屬性的記數(shù)是以第一元素的位移為0開始的。如果省略該屬性,則位移默認是0。

下面是一個大小為5的數(shù)組,同時在傳遞的時候僅傳遞第三和第四個元素:

<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提供對稀疏數(shù)組的支持。每一個表示成員值的元素包含一個"SOAP-ENC:position"屬性來表明它處于數(shù)組的位置。下面是一個二維字串數(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ù)組中對array-1僅有一個引用,那上述例子可以被編碼為:

<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>

復合類型的泛化規(guī)則

上面引用到的編碼規(guī)則并不限于那些預先知道存取標識的情形。如果存取標識名僅當在編碼過程中由值的出現(xiàn)才能決定的時候,同樣的規(guī)則也可以應(yīng)用,也就是一個存取標識被編碼為同名的元素,并且該存取標識要么包含要么引用它的值。包含那些類型不能預先決定的值的存取標識必須包含一個合適的xsi:type屬性來給出值的類型。

類似的,通過使用引用的編碼規(guī)則對于包含一些混合的存取標識的復合類型的編序而言已經(jīng)足夠了,這些存取標識有的是以名來區(qū)分,有的是以名和位置來區(qū)分 (也就是說,有些存取標識會重復出現(xiàn)) 。這并不一定需要有包含這一類型的模式存在,但是如果一個類型模型模式?jīng)]有該類型時,那么一個對應(yīng)的XML句法模式和實例就應(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>

類似的,將一個復合類型值編序為類似數(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>

默認值

一個使用省略格式的存取標識元素意味著有一個默認值或是尚不知道它的值。而該細節(jié)是基于存取標識、方法和上下文的。例如一個省略格式的存取標識典型地是表示一個多態(tài)存取標識的Null值(Null依賴存取標識的確切含義)。同樣地,一個省略格式的Boolean存取標識典型地就意味著是一個False值或值未知,同時一個省略格式的數(shù)值存取標識典型地意味著它的值是0或值未知。

SOAP root屬性

SOAP root屬性可以被用來標注編序的根,當然他并不是對象圖真正的根,所以對象圖是可以解序的。該屬性可以賦予"0"和"1"這兩個值的任意一個。一個對象圖的真正的根一般就有值"1"。那些非真正根的編序根也可以被標注為賦予值為"1"的編序根。一個元素也可以被明確地標注為賦予值為"0"的非編序根。

SOAP根屬性可以出現(xiàn)在SOAP Header和SOAP Body元素中的任何子元素里,該屬性并沒有一個默認值。

該屬性一般被用于使用了非嵌套方法(通過多引用來實現(xiàn))的情形,由于存在同一層次的多個形式的根,因此需要標識真正的根。

結(jié)語

至此,SOAP的基于XML Schema的型和值的描述機制已經(jīng)介紹完畢,相信大家對如果使用SOAP消息來傳輸調(diào)用信息和響應(yīng)信息已經(jīng)有了一個比較全面和深入的認識,在本系列的最后一篇文章中我將就SOAP各個方面的協(xié)同和應(yīng)用、與SOAP相關(guān)的其他技術(shù)規(guī)范與SOAP的協(xié)同及其在B2B Integration中的應(yīng)用加以總結(jié)并為下一個文章系列開一個頭。

參考資料

  • 解決B2B電子商務(wù)應(yīng)用交互和集成的InterOP Stack系列技術(shù)標準規(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
  • SOAP開發(fā)軟件包
    • Microsoft SOAP Toolkit 2.0, RC0, Microsoft Corporation
    • Apache SOAP 2.0, Apache.ORG

作者簡介

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

 

發(fā)布:2007-03-25 13:25    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
石家莊OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢