首先介紹兩個知識點:
a、xmlns使用方法
xmlns的使用格式是xmlns:namespace-prefix="namespace"
xmlns可以使用在任何元素上,表明該元素及其子元素,可以通過相應的前綴名引用定義在名字空間內的元素,可以引入多個名字空間。
比如:
<wsdl:definitions
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
</wsdl:definitions>
上述代表的含義是在definitions元素下,可以通過xsd前綴名和wsdl前綴分別引用名字空間"http://www.w3.org/2001/XMLSchema"和"http://schemas.xmlsoap.org/wsdl/"中定義的元素。
b、targetNamespace
由於在XML中並不一定都只是引用一個名字空間中的元素,有時也可能是要向一個名字空間中加入新的元素,那么應該如何向一個名字空間中加入元素呢?這時就要使用到targetNamespace。
targetNamespace也可以用在任何元素上,它代表在這個元素及其子元素下定義的任何元素、數據類型等都會被定義在指定的名字空間上。例如:
<wsdl:definitions
targetNamespace="http://com.lxzh.cxfDemo/HelloService"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="xx">.....</wsdl:message>
</wsdl:definitions>
就是將該wsdl中的元素和數據類型都定義在命名空間"http://com.lxzh.cxfDemo/HelloService"下。
一般來說,定義 xmlns:xsd="http://www.w3.org/2001/XMLSchema"的都是一個xsd文件,這個xsd命名空間就是標准的XMLSchema.xsd文件。
當你引用到定義的類型時,在eclipse中的wsdl文件中就會有 xmlns:xsd1="http://www.lxzh.org/request",它指的是你自己定義的request.xsd文件。引用的類型就是屬於這個request.xsd文件,在wsdl以后中使用的話就會使用xsd1......。這樣的格式。
下面來說在eclipse下建立wsdl的內容。
在eclipse中建立一個wsdl文件時,首先點擊“design”選項卡下的空白處,會看到definition,這里面的信息都會在definitons的根目錄中出現。

點擊上圖中的“request”,properties視圖中會顯示這是一個service,name屬性是"request"。
點擊“requestSOAP”,下面會顯示這是一個port,name屬性是requestSOAP,Binding屬性是requestSOAP,address屬性是“http://www.lxzhrequestsoap.org/”,protocol(協議類型)是“SOAP”.需要注意的是上面的Binding屬性,它是指的中間那個小方框。
點擊“小方框”,下面出現的是binding。有三個屬性,name,porttype,和protocol,點擊“generate binding content”屬性,可以對上面的三個屬性進行修改。
點擊"lxzhrequest1",會顯示這是一個porttype,name屬性是lxzhrequest1.
點擊"requestLxzh",會顯示這是一個operation,name是requestLxzh.
點擊“input”,會顯示這是一個input,Message屬性是requestLxzhRequest。message屬性是自動生成的。
點擊“output”,會顯示這是一個output,Message屬性是requestLxzhResponse
點擊“parameters”,會顯示這是一個part,name屬性是parameters,type屬性是requestSimplelxzh,都是所顯示的名稱。
如果說xml是數據庫中的數據,那么xsd就是數據庫的定義。
WSDL文件是一個XML 文檔,用於說明一組SOAP消息以及如何交換這些消息。
1.Types:獨立與機器和語言的類型定義。
下面是關於types中的xml:schema的一些解釋。我感覺types中定義的元素可有可無,官方上說的是Types中的元素要被message所使用,但我看來,當我把參數更改之后,types中的東西並沒有改變。Types下面會有兩個element,一個是以operation命名,一個是以operation+response來命名。兩個element都包括復雜類型。一個是in,一個是out。綠底的字還沒有整理,臨時粘貼到這里的。在xsd:schema中的targetnamespace是說明下面定義的類型只有在這個命名空間中是有效的。
基本的XML Schema的使用就是這樣,下面我們要介紹XML Schema的另外一個核心的部分也是Schema最關鍵的一個部分,就是關於Schema的名字空間(namespace)的問題。在上面關於XML Schema的介紹中,為了把讀者集中到對XML Schema的語法理解上,特意省略了關於名字空間(namespace)的介紹。
首先我們還是從簡單的例子着手,見下面的一段代碼:
<xsd:schema targetNamespace= http://www.SampleStore.com/Account
xmlns:xsd= http://www.w3.org/2000/08/xmlSchema
xmlns:ACC= http://www.SampleStore.com/Account >
<xsd:element name= 訂單號碼 type= xsd:positiveInteger />
<xsd:element name= 商品編號 type= ACC:商品編號類型 />
<xsd:simpleType name= 商品編號類型 base= xsd:string >
<xsd:pattern value= [A-Z]{1}d{6} />
<!-上面的一行代碼表示商品編碼的第一個字符應該為字母,后面跟六個阿拉伯數字 -->
</xsd:simpleType>
現在大家需要把注意力集中到開頭幾行的代碼上來,如下:
<xsd:schema targetNamespace= http://www.SampleStore.com/Account
xmlns:xsd= http://www.w3.org/2000/08/xmlSchema
xmlns:ACC= http://www.SampleStore.com/Account >
實際上,一個給定的XML Schema定義了一系列的元素名稱,類型名稱,屬性名稱和屬性組名稱。比如上面的代碼中的訂單號碼、商品編號、商品編號類型等。而這些名稱都有它一定的作用范圍,類似於C++中的局部變量的概念。而它們的作用范圍是什么呢?就是在他們的目標名字空間(target namespace)中是有效的,在上面的代碼中,我們可以看到它的目標名字空間為http://www.SampleStore.com/Account。
需要注意的是,目標名字空間的命名必須遵守URL的語義。同時需要注意的是,該目標名字空間並不是指一個具體的文件,僅僅是給它一個名字而已。實際上,在Schema中的定義和聲明也可以引用其他的名字空間,我們可以把這種名字空間取名為源名字空間(source namespaces)。每一個Schema必須有一個目標名字空間,但是可以有多個源名字空間。
實際上,在一個給定的Schema中,每一個名稱都是屬於一個特定的名字空間的。名字空間的名稱可能會很長(比如http://www.SampleStore.com/Account),但是它們可以用在XML Schema中的語義xmlns來進行簡化。在上面的例子中,我們用xsd(取名為xsd是任意的,比如你可以取名為kkk,tt,ppp,gh都可以)來表示名字空間 http://www.w3.org/2000/08/xmlSchema ,用ACC來表示名字空間http://www.SampleStore.com/Account。同時我們把http://www.w3.org/2000/08/xmlSchema這個名字空間稱為標准名字空間(standard namespace),因為它是定義Schema語法的標准地
2.message
<message>元素包含了Messages欄。如果我們把操作看作函數,<message>元素定義了那個函數的參數。其實這一點在上面的例子中就可以看到,當點擊“input”時,它有兩個屬性,一個是name,一個是message。message的值是****request;當點擊“output”時,它的message屬性是*****response。所以來說,message是用來定義參數的,有多少個參數,就有多少個message,比如說你定義了兩個porttype,每個porttype中都有一個input,一個output。那么可以預見的是,如果你不進行更改,則是下面的形式,NewOperationRequest1,NewOperationRequest2,NewOperationResponse1,NewOperationResponse2。比如,NewOperationRequest1中有兩個part,也就是代表在這個請求中有兩個參數。也就是在part中可以使用上面定義的Types,但是我沒有看到,都還是用命名空間中的類型來直接定義的。
一個是<message>元素中的每個<part>子元素都和某個參數相符。輸入參數在<message>元素中定義,與輸出參數相隔離--輸出參數有自己的<message>元素。兼作輸入、輸出的參數在輸入輸出的<message>元素中有它們相應的<part>元素。輸出<message>元素以"Response"結尾,就像以前所用的"fooResponse"。每個<part>元素都有名字和類型屬性,就像函數的參數有參數名和參數類型。
用於交換文檔時,WSDL允許使用<message>元素來描述交換的文檔。
<part>元素的類型可以是XSD基類型,也可以是SOAP定義類型(soapenc)、WSDL定義類型(wsdl)或是Types欄定義的類型。
3.portType
可以將portType看成是一個服務,而wsdl就是一個服務的集合。wsdl中沒有單獨定義operation元素,operation直接包含在portType中了。一個portType中可以包括多個operation。一個operation又可以包括多個message,一個message又可以包括多個part。可以將portType看作一個類。而operation就是其中的函數。message是參數組,part是其中具體的參數。
name指定的定義為服務端口的名稱。然后可以定義在該端口上執行的操作wsdl:operation,該wsdl:operation包括輸入和輸出兩項操作。
4.binding
就是上面的那個小方框。指定端口定義消息格式和協議細節。
這部分將服務訪問點的抽象定義與SOAP HTTP綁定,描述如何通過SOAP/HTTP來訪問按照前面描述的訪問入口點類型部署的訪問入口。其中規定了在具體SOAP調用時,應當使用的 soapAction是"soapAction="http://www.aagtest.org/aae/NewOperation1",而請求/響應消息的編碼風格都應當采用SOAP 規范默認定義的編碼風格" http://schemas.xmlsoap.org/soap/encoding/"。這里需要注意的是soapAction中的命名空間http://www.aagtest.org/aae/是在點擊空白是的那個命名空間。也就是definition中的targetnamespace。
5.service
指明了服務的名稱及其端口和地址等信息,
<wsdl:service name="aaservice">
<wsdl:port binding="tns:aaeSOAP" name="aaeSOAP">
<soap:address location="http://www.example.org/"/>
</wsdl:port>
</wsdl:service>
名為aaservice的Web服務中,提供了一個服務訪問入口,訪問地址是"http://www.example.org/",使用的消息模式是由前面的binding所定義的。
在上面五個元素中,types,message,porttype是抽象類型,而binding是將它們和具體的實現聯系在一起,service是將binding和用戶訪問的接口聯系在一起,可以使用http協議來進行訪問。
以我在eclipse下面所做的實驗,一個service只能和一個binding在一起,一個binding只能連接一個porttype,但是一個porttype下面可以有多個operation。
