日期:2012-08-31  浏览次数:20357 次

WSDL 類型與訊息區段中的 XML 結構描述
WSDL 的資料類型,是根據目前 W3C Recommendation 的「XML Schema: Datatypes」(XSD)。此文件共有三種不同的版本 (1999、2000/10、與 2001),若欲指定特定 WSDL 檔案所使用的版本,請在 <definitions> 元素中,將其宣告為命名空間的屬性。方法如下:

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

本文僅以 2001 版為考量。WSDL 標準的擁護者,也大力建議使用 2001 版。

在本節與後續章節中,採用的字首或命名空間速記法如下:

字首 對應的命名空間 說明
soapenc http://schemas.xmlsoap.org/soap/encoding SOAP 1.1 編碼
wsdl http://schemas.xmlsoap.org/wsdl/soap WSDL 1.1
xsd http://www.w3.org/2001/XMLSchema XML Schema

XSD 基本類型
下表直接取自 MSTK2 文件,列舉了 MSTK2 支援的所有 XSD 基本類型。該表說明,位於客戶端與伺服端的 WSDL 讀者,如何在 VB、C++、與 IDL 中,將 XSD 類型對應至不同與對等的類型。

XSD (Soap) 類型 不同的類型 VB C++ IDL 註解
anyURI VT_BSTR String BSTR BSTR
base64Binary VT_ARRAY | VT_UI1 Byte() SAFEARRAY SAFEARRAY(unsigned char)
boolean VT_BOOL Boolean VARIANT_BOOL VARIANT_BOOL
byte VT_I2 Integer short short 轉換時驗證範圍。
date VT_DATE Date DATE DATE 時間設為 oo:oo:oo
dateTime VT_DATE Date DATE DATE
double VT_R8 Double double double
duration VT_BSTR String BSTR BSTR 不執行驗證或轉換
ENTITIES VT_BSTR String BSTR BSTR 不執行驗證或轉換
ENTITY VT_BSTR String BSTR BSTR 不執行驗證或轉換
float VT_R4 Single float float
gDay VT_BSTR String BSTR BSTR 不執行驗證或轉換
gMonth VT_BSTR String BSTR BSTR 不執行驗證或轉換
gMonthDay VT_BSTR String BSTR BSTR 不執行驗證或轉換
gYear VT_BSTR String BSTR BSTR 不執行驗證或轉換
gYearMonth VT_BSTR String BSTR BSTR 不執行驗證或轉換
ID VT_BSTR String BSTR BSTR 不執行驗證或轉換
IDREF VT_BSTR String BSTR BSTR 不執行驗證或轉換
IDREFS VT_BSTR String BSTR BSTR 不執行驗證或轉換
int VT_I4 long long long
integer VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
language VT_BSTR String BSTR BSTR 不執行驗證或轉換
long VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
Name VT_BSTR String BSTR BSTR 不執行驗證或轉換
NCName VT_BSTR String BSTR BSTR 不執行驗證或轉換
negativeInteger VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
NMTOKEN VT_BSTR String BSTR BSTR 不執行驗證或轉換
NMTOKENS VT_BSTR String BSTR BSTR 不執行驗證或轉換
nonNegativeInteger VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
nonPositiveInteger VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
normalizedString VT_BSTR String BSTR BSTR
NOTATION VT_BSTR String BSTR BSTR 不執行驗證或轉換
number VT_DECIMAL Variant DECIMAL DECIMAL
positiveInteger VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
QName VT_BSTR String BSTR BSTR 不執行驗證或轉換
short VT_I2 Integer short short
string VT_BSTR String BSTR BSTR
time VT_DATE Date DATE DATE Day 設定成 1899 年 12 月 30 日
token VT_BSTR String BSTR BSTR 不執行驗證或轉換
unsignedByte VT_UI1 Byte unsigned char unsigned char
unsignedInt VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
unsignedLong VT_DECIMAL Variant DECIMAL DECIMAL 轉換時驗證範圍。
unsignedShort VT_UI4 long long long 轉換時驗證範圍。

XSD 定義兩組內建的資料類型:基本類型與衍生類型。若需進一步資訊,可前往 http://www.w3.org/TR/2001/PR-xmlschema-2-20010330,檢視內建類型的階層架構。

複雜類型
XML Schema 可定義複雜類型,也就是 C 中的 struct。例如,下列 C struct 的相對定義方式為:

typedef struct {
string firstName;
string lastName;
long ageInYears;
float weightInLbs;
float heightInInches;
} PERSON;

若使用 XML Schema 可以撰寫成:

<xsd:complexType name="PERSON">
<xsd:sequence>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="lastName" type="xsd:string"/>
<xsd:element name="ageInYears" type="xsd:int"/>
<xsd:element name="weightInLbs" type="xsd:float"/>
<xsd:element name="heightInInches" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>

不過,<complexType> 所能表示的,絕不僅止於 struct 的對應而已。除了 <sequence> 之外,它還可以有其它的子元素。若不用 <sequence>,也可以使用 <all>:

<xsd:complexType name="PERSON">
<xsd:all>
<xsd:element name=&qu