




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Web Service 描述語言 WSDL 詳解為什么使用 WSDL?WSDL 文檔結(jié)構(gòu)WSDL 文件示例NamespacesSOAP 消息XML schema 運用于 WSDL 的類型和消息中XML schema 運用之 complex 類型XML schema 運用之?dāng)?shù)組v portType 和 operation 元素v binding 和 v operation元素文檔風(fēng)格綁定v service 和 v port 元素總結(jié)為什么使用 WSDL?像 Internet 協(xié)議之類的標(biāo)準(zhǔn)有沒有為權(quán)威所利用, 或者人們這樣看待它是因為順之 所獲的好處遠遠超出了代價?曾經(jīng)有許多試圖建立的標(biāo)準(zhǔn)都流產(chǎn)
2、了。 有時候, 那些還沒 有普遍使用的標(biāo)準(zhǔn)甚至由法令或政府規(guī)定強行推出: Ada 語言就是一例。我相信正是跟隨標(biāo)準(zhǔn)所帶來的好處使它廣泛接受。例如,對于鐵路服務(wù)來說,真正 重要的是, 不同公司所鋪設(shè)的鐵路結(jié)合到一起, 或者是來自好幾個公司的產(chǎn)品協(xié)調(diào)的工 作在一起。幾家大的企業(yè)合力建立了 SOAP 標(biāo)準(zhǔn)。 Web Service 描述語言 (WSDL) 向這 種 Web Service 的提供商和用戶推出了方便的協(xié)調(diào)工作的方法, 使我們能更容易的獲得 SOAP 的種種好處。 幾家公司的鐵道并在一起不算什么難事, 他們所需遵循的只是兩軌 間的標(biāo)準(zhǔn)距離。 對 Web Service 來說,這要復(fù)雜得多
3、。 我們必須先制定出指定接口的標(biāo) 準(zhǔn)格式。曾經(jīng)有人說 SOAP 并不真需要什么接口描述語言。如果 SOAP 是交流純內(nèi)容的標(biāo) 準(zhǔn),那就需要一種語言來描述內(nèi)容。 SOAP 消息確實帶有某些類型信息,因此 SOAP 允許動態(tài)的決定類型。但不知道一個函數(shù)的函數(shù)名、參數(shù)的個數(shù)和各自類型,怎么可能 去調(diào)用這個函數(shù)呢?沒有 WSDL ,我可以從必備文檔中確定調(diào)用語法,或者檢查消息。 隨便何種方法,都必須有人參與,這個過程可能會有錯。而使用了WSDL ,我就可以通過這種跨平臺和跨語言的方法使 Web Service 代理的產(chǎn)生自動化。 就像 COM 和 CORBA 的 IDL 文件, WSDL 文件由客戶和
4、服務(wù)器約定。注意由于 WSDL 設(shè)計成可以綁定除 SOAP 以外的其他協(xié)議,這里我們主要關(guān)注 WSDL 在 HTTP 上和 SOAP 的關(guān)系。同樣,由于 SOAP 目前主要用來調(diào)用遠程的過程 和函數(shù),WSDL支持SOAP傳輸?shù)奈臋n規(guī)范。WSDL 1.1已經(jīng)作為記錄遞交給 W3C (見 /TR/wsdl.html )WSDL 文檔結(jié)構(gòu)若要理解XML文檔,將之看作塊狀圖表非常有用。下圖以XML的文檔形式說明了WSDL的結(jié)構(gòu),它揭示了 WSDL文檔五個欄之間的關(guān)系。WSDL文檔可以分為兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。 抽象部分以獨立于平臺和語言
5、的方式定義SOAP消息,它們并不包含任何隨機器或語言而變的元素。這就定義了一系列服務(wù),截然不同的網(wǎng)站都可以實現(xiàn)。隨網(wǎng)站而異的東 西如序列化便歸入底部分,因為它包含具體的定義。l抽象定義Types獨立與機器和語言的類型定義Messages包括函數(shù)參數(shù)(輸入與輸出分開)或文檔描述PortTypes弓I用消息部分中消息定義來描述函數(shù)簽名(操作名、輸入?yún)?shù)、輸出參數(shù))2具體定義BindingsPortTypes部分的每一操作在此綁定實現(xiàn)Services確定每一綁定的端口地址下面的圖中,箭頭連接符代表文檔不同欄之間的關(guān)系。點和箭頭代表了引用或使用關(guān)系。雙箭頭代表修改關(guān)系。3-D的箭頭代表了包含關(guān)系。這樣
6、,各Messages欄使用Types欄的定義,PortTypes欄使用 Messages欄的定義;Bindings欄引用了 PortTypes 欄,Services 欄引用 Bindings 欄,PortTypes 和 Bindings 欄包含了 operation 元素,而 Services 欄包含了 port元素。PortTypes 欄里的 operation 元素由 Bindings 欄里的operation元素進一步修改或描述。在此背景中,我將使用標(biāo)準(zhǔn)的XML術(shù)語來描述WSDL文檔。Element是指XML的元素,而attribute指元素的屬性。于是:v element attrib
7、ute=attribute-value contents v /element 內(nèi)容也可能由一個或多個元素以遞歸的方式組成根元素是所有元素之中最高級的元素。子元素總是從屬于另一個元素,父元素。注意,文檔之中可能只有一個 Types欄,或根本沒有。所有其他的欄可以只有零元 素、單元素或是多元素。WSDL的列表要求所有的欄以固定的順序出現(xiàn):import, types,message, portType, binding, service。所有的抽象可以是單獨存在于別的文件中,也可以從主文檔中導(dǎo)入。Abstract DefinitionsConcrete Derinjticna圖一:抽象定義和具體定
8、義WSDL文件示例讓我們來研究一下 WSDL文件,看看它的結(jié)構(gòu),以及如何工作。請注意這是一個非常 簡單的WSDL文檔實例。我們的意圖只是說明它最顯著的特征。以下的內(nèi)容中包括更 加詳細的討論。v ?xml versio n=1.0 en codi ng=UTF-8 ?v defi niti ons n ame=FooSample targetNamespace=/wsdl/ xmlns:wsdlns=/wsdl/ xmlns:typens=/xsd xmlns:xsd=http:/www.w3.
9、org/2001/XMLSchema xmlns:soap=/wsdl/soap/ xmlns:stk= xmlns=/wsdl/ v types v schema targetNamespace=/xsd xmlns=/2001/XMLSchema xmlns:SOAP-ENC=/soap/encoding/ xmlns:wsdl=http:/schemas.xmlsoap.or
10、g/wsdl/ elementFormDefault=qualified v /schema v /types v message name=Simple.foo v part name=arg type=xsd:int/ v /message v message name=Simple.fooResponse v part name=result type=xsd:int/ v /message v portType name=SimplePortType v operation name=foo parameterOrder=arg v input message=wsdlns:Simpl
11、e.foo/ v output message=wsdlns:Simple.fooResponse/ v /operation v /portType v binding name=SimpleBinding type=wsdlns:SimplePortType v stk:binding preferredEncoding=UTF-8 /v soap:binding style=rpc transport=/soap/http/ v operation name=foo v soap:operation soapAction=http:/te
12、/action/Simple.foo/ v input v soap:body use=encoded namespace=/message/ encodingStyle=/soap/encoding/ /v /input v output v soap:body use=encoded namespace=/message/en codi ngStyle=/soap/e ncodi ng/ /v /outpu
13、t v /operation v /bin di ng v service name=FOOSAMPLEService v port name=SimplePort binding=wsdlns:SimpleBindingv soap:address locati on=http:/carlos:8080/FooSample/FooSample.asp/v /port v /service v /definitions 以下是該實例文檔的總述:稍后我將詳細討論每一部分的細節(jié)。第一行申明該文檔是 XML。盡管這并不是必需的,但它有助于 XML解析器決定是 否解析 WSDL文件或只是報錯。第二行是
14、 WSDL文檔的根元素:v definitions 。一 些屬性附屬于根元素,就像v schema 子元素對于v types 元素。v types 元素包含了 Types欄。如果沒有需要聲明的數(shù)據(jù)類型,這欄可以缺省。 在WSDL范例中,沒有應(yīng)用程序特定的types聲明,但我仍然使用了Types欄,只是為了聲明 schema namespaces 。v message 元素包含了 Messages 欄。如果我們把操作看作函數(shù),v message 元素定義了那個函數(shù)的參數(shù)。v message 元素中的每個v part 子元素都和某個參 數(shù)相符。輸入?yún)?shù)在v message 元素中定義,與輸出參數(shù)相
15、隔離-輸出參數(shù)有自己的vmessage 元素。兼作輸入、輸出的參數(shù)在輸入輸出的v message 元素中有它們相 應(yīng)的v part 元素。輸出v message 元素以Response結(jié)尾,就像以前所用的 fooResponse。每個v part元素都有名字和類型屬性,就像函數(shù)的參數(shù)有參數(shù)名和 參數(shù)類型。用于交換文檔時, WSDL允許使用v message 元素來描述交換的文檔。v part 元素的類型可以是 XSD基類型,也可以是 SOAP定義類型(soapenc)、 WSDL定義類型(wsdl)或是Types欄定義的類型。一個PortTypes欄中,可以有零個、單個或多個vportType
16、 元素。由于抽象PortType定義可以放置在分開的文件中,在某個 WSDL文件中沒有v portType 元素 是可能的。上面的例子里只是用了一個vportType 元素。而一個v portType 元素可在v operation 元素中定義一個或是多個操作。示例僅使用了一個名為foo的voperation 元素。這和某個函數(shù)名相同。v operation 元素可以有一個、兩個、三個 子元素: v in put , v output 和v fault 元素。每個v in put 和 output 元素中的 消息都引用 Message欄中的相關(guān)的v message 元素。這樣,示例中的整個v
17、portType 元素就和以下的 C函數(shù)等效:int foo(i nt arg);這個例子足見XML和C相比要冗長的多。(包括v message 元素,XML在示例 中共使用了 12行代碼來表達相同的單行函數(shù)聲明。)Bin di ngs欄可以有零個、一個或者多個vbinding 元素。它的意圖是制定每個voperation 通過網(wǎng)絡(luò)調(diào)用和回應(yīng)。Services欄同樣可以有零個、一個、多個vservice元素。它還包含了 vport 元素,每個v port 元素引用一個Bindings 欄里的vbinding 元素。Bindings 和 Services 欄都包含 WSDL 文檔。Namespa
18、cev definitions 和子節(jié)點v schema 都是 namespace 屬性:v definitions name=FooSample targetNamespace=/wsdl/ xmln s:wsdl ns=/wsdl/ xmln s:type ns=/xsd xml ns:xsd=/2001/XMLSchema xml ns:soap=/wsdl/soap/ xml ns:stk= nsio n
19、 xmln s=/wsdl/v types v schema targetNamespace=/xsd xml ns=/2001/XMLSchema xml ns:SOAP-ENC=/soap/e ncodi ng/ xmln s:wsdl=/wsdl/ eleme ntFormDefault=qualifiedv /schema v /types 每個namespace屬性都聲明
20、了一個縮略語,用在文檔中。例如xmlns:xsd就為/2001/XMLSchema定義了一個縮略語(xsd )。這就允許對該namespace的引用只需簡單的在名字前加上前綴就可以了,如:xsd:int中的xsd就是合法的類型名。普通范圍規(guī)則可運用于縮略前綴。也就是說,前綴所定義的元素只在 元素中有效。Namespace派什么用? namespace的作用是要避免命名沖突。如果我建立一項 Web Service ,其中的WSDL文件包含一個名為foo的元素,而你想要使用我的服務(wù)與 另一項服務(wù)連接作為補充,這樣的話另一項服務(wù)的WSDL文件就不能包含名為foo的元素
21、。兩個服務(wù)器程序只有在它們在兩個事例中表示完全相同的東西時,才可以取相同的名字。如果有了表示區(qū)別的namespace,我的網(wǎng)絡(luò)服務(wù)里的foo就可以表示完全不同于另一個網(wǎng)絡(luò)服務(wù)里foo的含義。在你的客戶端里,你只要加以限制就可以引用我的 foo。見下例:http:/www.i nfotects.eom/fooService#foo 就是完全限制的名字,相當(dāng)于carlos:foo,如果我聲明了 carlos 作為 的快捷方 式。請注意namespace中的URL是用來確定它們的唯一性的, 同時也便于定位。URL 所指向的地方不必是實際存在的網(wǎng)絡(luò)地址, 也可以使用GUID來代替或補充URL o例如,
22、 GUID335DB901-D44A-11D4-A96E-0080AD76435D就是一個合法的 namespace 指派。targetNamespace 屬性聲明了一個 namespace,元素中所有的聲明的名字都列于 其內(nèi)。在 WSDL 示例中,v definitions 的 targetNamespace 是 /wsdl 。 這意味著所有在 WSDL文檔中聲明的名字都屬于這個namespace o v schema 元素有自己的 targetNamespace 屬性,其值為 /xsd,在v schma 元素中定義的所有名
23、字都屬于這個n amespace 而不是 ma in 的target n amespace ov schema 元素的以下這行聲明了默認(rèn)的namespace。Schema中所有有效的名字都屬于這個 namespace。xml ns=/2001/XMLSchemaSOAP消息對于使用 WSDL的客戶機和服務(wù)機來說,研究 WSDL文件的一種方法就是決定什 么來接受所發(fā)送的信息。盡管SOAP使用底層協(xié)議,如IP和HTTP等,但應(yīng)用程序決定了服務(wù)器與客戶機之間交互的高級協(xié)議。也就是說,進行一項操作,比如echoi nt把輸入的整數(shù)送回,參數(shù)的數(shù)目、每個參數(shù)的類型、以及參
24、數(shù)如何傳送等因素決定了應(yīng) 用程序特定的協(xié)議。有很多方法可以確定此類協(xié)議,但我相信最好的方法就是使用 WSDL。如果我們用這種視角來看待它,WSDL不只是一種接口協(xié)議,而且是一種協(xié)議特定的語言。它就是我們超越固定協(xié)議(IP、HTTP等)所需要的應(yīng)用程序特定協(xié)議。WSDL可以確定SOAP消息是否遵從 RPC或文檔風(fēng)格。RPC風(fēng)格的消息(就是 示例中所用的)看起來像是函數(shù)調(diào)用。而文檔風(fēng)格的消息則更普通,嵌套層次更小。下 面的XML消息就是示例WSDL文件解析后的發(fā)送/接受效果,解析使用的是MS SOAP Toolkit 2.0(MSTK2 )中的 SoapClient 對象。從客戶端調(diào)用foo(51
25、31953)函數(shù):v ?xml versio n=1.0 en codi ng=UTF-8 stan dalo ne= no?v SOAP-ENV:EnvelopeSOAP-ENV:e ncodi ngStyle=/soap/e ncodi ng/ xml ns:SOAP-ENV=/soap 尼n velope/v SOAP-ENV:Body v m:foo xmln s:m=/message/v arg 5131953 v /arg v /m:foo v /S
26、OAP-ENV:Body v /SOAP-ENV:E nvelope 從服務(wù)器接受的信息:v ?xml versio n=1.0 en codi ng=UTF-8 stan dalo ne= no?v SOAP-ENV:E nvelopeSOAP-ENV:e ncodi ngStyle=/soap /en codi ng/ xml ns:SOAP-ENV=/soap 尼n velope/v SOAP-ENV:Body v SOAPSDK1:fooResp on se xml ns:SOAPSDK
27、仁/message/v result 5131953 v /result v /SOAPSDK1:fooRespo nse v /SOAP-ENV:Body v /SOAP-ENV:E nvelope 兩函數(shù)都調(diào)用了消息,其回應(yīng)是有效的XML。SOAP消息由幾部分組成,首先是v Envelop 元素,包含一個可選的v Header 元素以及至少一個v body 元素。Rpc 函數(shù)所調(diào)用的消息體有一個根據(jù)操作foo命名的元素,而回應(yīng)信息體有一個fooResponse元素。Foo元素有一個部分v arg ,就和 WSDL中描述的一樣,是單 參數(shù)的。fooRespo
28、nse 也相應(yīng)的有一個v result 的部分。注意 encodingStyle、envelope 和message的namespace和 WSDL Bin di ngs 欄中的預(yù)定義的一致,重復(fù)如下:v bi nding n ame=SimpleBi ndi ng type=wsdl ns:SimplePortTypev stk:bi nding preferredE ncodi ng=UTF-8 /v soap:b inding style=rpctran sport=/soap/http/ v operati on n ame=foo v
29、 soap:operati onsoapActio n=/actio n/Simple.foo/ v in put v soap:body use=e ncodedn amespace=/message/en codi ngStyle=/soap 尼n codi ng/ /v /input v output v soap:body use=e ncodedn amespace=/message/en codi ngStyle=http:/sch
30、/soap 尼n codi ng/ /v /output v /operation v /bin di ng WSDL 的 Types 欄和 Messages 欄中的 XML SchemaWSDL數(shù)據(jù)類型是基于XML Schema: Datatypes(XSD) 的,現(xiàn)在已經(jīng)被 W3C推 薦。這一文檔共有三個版本(1999 , 2000/10 , 2001 ),因此必須在 namespace屬性 的v definitions 元素中指明所使用的是哪一個版本。xml ns:xsd=/2001/XMLSchema在本文中,我將只考慮
31、2001版本。WSDL標(biāo)準(zhǔn)的推薦者強烈建議使用 2001版在本欄和以后各部分,需使用以下簡縮或前綴前綴代表的Namespace描述Soapenc/soap 尼n codi ngSOAP 1.1 en codi ngWsdl http:/sc:/wsdl/soapWSDL 1.1Xsd/2001/XMLSchemaXML SchemaXSD基類型下表是直接從 MSTK2文檔中取出的,列舉了 MSTK2所支持的所有XSD基類型。 它也告訴在客戶端或服務(wù)器端的 WSDL讀取程序如何把
32、XSD類型映射到在VB、C+ 和IDL中相應(yīng)的類型。XSD (Soap)類型變量類型 VB nC+IDLComme ntsan yURI VT_BSTRStri ngBSTR BSTRbase64B inaryVT_ARRAY|VT_UI1Byte() SAFEARRAYSAFEARRAY(u nsig ned char)Boolean VT_BOOLBoolea nVARIANT_BOOLVARIANT_BOOLByte VT_I2In tegershortshort轉(zhuǎn)換時驗 證范圍有 效性Date VT_DATEDateDATEDATE時間設(shè)為oo:oo:ooDateTime VT_DAT
33、EDateDATEDATEDouble VT_R8DoubledoubledoubleDuratio n VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效ENTITIES VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效ENTITY VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效Float VT R4Si nglefloatfloatGDay VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效GMon th VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和生效GMo nthDay VT_BSTFStri ngBSTRBSTR不轉(zhuǎn)換和 生效GYear
34、VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效GYearMo nth VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效ID VT_BSTR11Stri ngBSTRBSTR不轉(zhuǎn)換和 生效IDREF VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效IDREFS VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效Int VT_I4Lo nglonglongIn teger VT_DECIMALVaria ntDECIMALDECIMAL轉(zhuǎn)換時范 圍生效Lan guage VT_BSTR1Stri ngBSTRBSTR不轉(zhuǎn)換和 生效Long VT_DECIMA
35、LVaria ntDECIMALDECIMAL轉(zhuǎn)換時范 圍生效Name VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效NCName VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效n egative In teger VT_D)ECIMALVaria ntDECIMALDECIMAL轉(zhuǎn)換時范 圍生效NMTOKEN VT_BSTFStri ngBSTRBSTR不轉(zhuǎn)換和 生效NMTOKENS VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效nonN egative In tege VDECIMAL VariantDECIMALDECIMAL轉(zhuǎn)換時范 圍生效non P
36、ositive In teger VTDECIMAL VariantDECIMADECIMAL轉(zhuǎn)換時范 圍生效no rmalizedStri ng VT_BSTR:Stri ngBSTRBSTRNOTATION VT_BSTFStri ngBSTRBSTR不轉(zhuǎn)換和 生效NumberVT DECIMAL VariantDECIMALDECIMALpositive In teger VT_DECIMALVaria ntDECIMALDECIMAL轉(zhuǎn)換時范 圍生效Qn ame VT_BSTRStri ngBSTR BSTR不轉(zhuǎn)換和 生效Short VT_I2In tegershortshortStr
37、i ng VT_BSTRStri ngBSTRBSTRTime VT_DATEDateDATEDATE日設(shè)為1899 年 12月30日Toke n VT_BSTRStri ngBSTRBSTR不轉(zhuǎn)換和 生效un sig nedByteVT_UI1Byteun sig ned charun sig ned charUn sig nedl nt VT_DECIMALVaria ntDECIMALDECIMAL轉(zhuǎn)換時范 圍生效un sig nedLo ng VT_DECIMALVaria ntDECIMALDECIMAL轉(zhuǎn)換時范 圍生效un sig nedShort VT_UI4Lo ngLongL
38、o ng轉(zhuǎn)換時范 圍生效XSD定義了兩套內(nèi)建的數(shù)據(jù)類型:原始的和派生的。在下文中查閱內(nèi)建數(shù)據(jù)類型 的層次十分有益:/TR/2001/PR-xmlschema-2-20010330complex 類型XML schema允許complex類型的定義,就像C里是struct。例如,為了定義類似 如下的C的struct類型:typedef struct stri ng firstName;stri ng lastName;long age InY ears;float weightI nLbs;float height InIn ches; PERSON;我們可以寫X
39、ML schema :v xsd:complexType n ame=PERSON v xsd:sequenee v xsd:eleme nt n ame=firstName type=xsd:stri ng/v xsd:eleme nt n ame=lastName type=xsd:stri ng/v xsd:eleme nt n ame=age InY ears type=xsd:i nt/v xsd:eleme nt n ame=weightl nLbs type=xsd:float/ v xsd:eleme nt n ame=height InIn ches type=xsd:flo
40、at/v/xsd:sequenee v /xsd:complexType 不過,complex類型可以表達比struct更多的信息。除了 v sequenee 以外,它 還可以有其他的子元素,比如vall v xsd:complexType n ame=PERSON vxsd:all v xsd:eleme nt n ame=firstName type=xsd:stri ng/v xsd:eleme nt n ame=lastName type=xsd:stri ng/v xsd:eleme nt n ame=age InY ears type=xsd:i nt/v xsd:eleme nt
41、 n ame=weightl nLbs type=xsd:float/v xsd:eleme nt n ame=height InIn ches type=xsd:float/v /xsd:all v /xsd:complexType 這意味著v element 的成員變量可以以任何順序排列,每一個都是可選的。這和 C中的struct類型不太一樣。注意內(nèi)建數(shù)據(jù)類型 string, int, float。C的string也是XML的string , float也類似 但C中的long類型在XML中是int (上表中)。在WSDL文件中,像上面的 complex類型可以在Types欄聲明。例如,我
42、可以用 以下方式聲明PERSON類型并用在Messages欄。v ?xml versio n=1.0 en codi ng=UTF-8 ?v defi niti onsv types v schema targetNamespace=someNamespacexmln s:type ns=someNamespacev xsd:complexType n ame=PERSON v xsd:sequenee v xsd:eleme nt n ame=firstName type=xsd:stri ng/v xsd:eleme nt n ame=lastName type=xsd:stri ng/v
43、 xsd:eleme nt n ame=age InY ears type=xsd:i nt/v xsd:eleme nt n ame=weightI nLbs type=xsd:float/v xsd:eleme nt n ame=height InIn ches type=xsd:float/v /xsd:sequenee v /xsd:complexType v /schema v /types v message n ame=addPers on v part name=person type=typens:PERSON/v /message v message n ame=addPe
44、rs on Resp on sev part name=result type=xsd:int/ v /message v /definitions 上例中第一個消息由adperson,并且有一個v part,其類型為PERSON。 PERSON類型是在Types欄聲明的。如果我們使用完整的 WSDL文件包含以上的部分,并以之初始化MSTK2SoapClient,它將成功的解析該文件。當(dāng)然,它不會去調(diào)用vaddPerson 。這是因為SoapClient本身并不知道如何處理complex類型,它需要定制類型映射來處理complex類型。MSTK2文檔中有包含定制類型映射的示例。還有另一種方法可
45、以把vpart 元素聯(lián)系到類型聲明。這就是使用元素。下例中我將Types欄中聲明兩個元素(Person和Gendr),然后我將在addPerson v message 中使用元素屬性來引用它們。v ?xml versio n=1.0 en codi ng=UTF-8 ?v defi niti onsv types v schema targetNamespace=someNamespacexml ns:type ns=someNamespace v eleme nt n ame=Pers on v xsd:complexType v xsd:sequenee v xsd:eleme nt n
46、ame=firstName type=xsd:stri ng/v xsd:eleme nt n ame=lastName type=xsd:stri ng/v xsd:eleme nt n ame=age InY ears type=xsd:i nt/v xsd:eleme nt n ame=weight In Lbs type=xsd:float/v xsd:eleme nt n ame=height InIn ches type=xsd:float/v /xsd:sequenee v /xsd:complexType v 尼lement v eleme nt n ame=Ge nder v
47、xsd:simpleType v xsd:restricti on base=xsd:stri ngv xsd:e nu merati on value=Male /v xsd:e nu merati on value=Female /v /xsd:restriction v/xsd:simpleType v 尼lement v /schema v /types v message n ame=addPers on v part name=who element=typens:Person/v part name=sex element=typens:Gender/v /message v m
48、essage n ame=addPers on Resp on se v part name=result type=xsd:int/v /message v /definitions Types欄中的Gender velement 里嵌入了枚舉類型,其枚舉值為MaleFemale。然后我又在addPerson v message 中通過元素屬性而不是類型屬 性來引用它。元素屬性和類型屬性在把某特定類型關(guān)聯(lián)到vpart 時有什么不同呢?使用元素屬性,我們可以描述一個部分,它可以假定幾個類型(就像變量一樣),而是用類型 屬性我們就無法這樣做。下例說明了這一點。v ?xml versio n=1.
49、0 en codi ng=UTF-8 ?v defi niti onsv types v schema targetNamespace=someNamespacexmln s:type ns=someNamespacev xsd:complexType n ame=PERSON v xsd:sequenee v xsd:eleme nt n ame=firstName type=xsd:stri ng/v xsd:eleme nt n ame=lastName type=xsd:stri ng/v xsd:eleme nt n ame=age InY ears type=xsd:i nt/v
50、xsd:eleme nt n ame=weight In Lbs type=xsd:float/v xsd:eleme nt n ame=height InIn ches type=xsd:float/v /xsd:sequenee v /xsd:complexType v xsd:complexType n ame=femalePers on v xsd:complexC ontent v xsd:exte nsion base=type ns:PERSON v xsd:eleme nt n ame=favoriteLipstick type=xsd:stri ng /v /xsd:exte
51、nsion v /xsd:complexC ontent v /xsd:complexType v xsd:complexType n ame=malePers on v xsd:complexC ontent v xsd:exte nsion base=type ns:PERSONv xsd:eleme nt n ame=favoriteShavi ngLotio n type=xsd:stri ng /v /xsd:extension v /xsd:complexC ontent v /xsd:complexType v xsd:complexType n ame=maleOrFemale
52、Pers onv xsd:choice v xsd:eleme nt n ame=fArg type=type ns:femalePers onv xsd:element name=mArg type=typens:malePerson /v /xsd:choice v /xsd:complexType v /schema v /types v message n ame=addPers onv part name=person type=typens:maleOrFemalePerson/ v /message v message n ame=addPers on Resp on sev part name=result type=xsd:int/v /message v /definitions 上例 也告 訴我們extension 的 派生。femailPerson和malePerson都是從 PER
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專項10 文學(xué)常識(試卷版)
- 2025屆江蘇省鹽城市射陽中學(xué)高三上學(xué)期一模物理試題(解析版)
- 2025屆四川省資陽市安岳中學(xué)高三二模語文試題(原卷版+解析版)
- 人教版九年級下冊化學(xué)教學(xué)工作計劃(含進度表)
- 《跨境電子商務(wù)法律法規(guī) 》全套教學(xué)課件
- 廣東省廣州市華南師范附屬中學(xué)2024-2025學(xué)年高二下學(xué)期3月月考物理試卷(原卷版+解析版)
- 教育咨詢居間協(xié)議樣本
- 汽車車身電子控制技術(shù)指南
- 中醫(yī)護理學(xué)(第5版)課件 第三節(jié) 中藥煎服法與護理
- 雨水收集再利用系統(tǒng)
- 2023年 新版評審準(zhǔn)則質(zhì)量記錄手冊表格匯編
- 2024年全國版圖知識競賽(小學(xué)組)考試題庫大全(含答案)
- 博物館保安服務(wù)投標(biāo)方案(技術(shù)方案)
- (高清版)TDT 1047-2016 土地整治重大項目實施方案編制規(guī)程
- 2024年新疆維吾爾自治區(qū)中考一模綜合道德與法治試題
- 醫(yī)藥代表專業(yè)化拜訪技巧培訓(xùn)
- 今年夏天二部合唱譜
- 現(xiàn)代制造技術(shù)課件
- 小米公司招聘測試題目
- 2024年北京控股集團有限公司招聘筆試參考題庫含答案解析
- 人教版二年級數(shù)學(xué)下冊 3 圖形的運動(一)1.軸對稱圖形(教學(xué)課件)
評論
0/150
提交評論