`
datoplay
  • 浏览: 1611427 次
文章分类
社区版块
存档分类
最新评论

web service 学习笔记

 
阅读更多

面向服务的体系结构SOA是一个简单的概念,可应用于各种不同的Web服务情况。

包含三个角色和三个操作。

服务注册中心

服务请求者

服务提供者

服务

发布

WSDL

UDDI

查找

绑定、调用

SOAP

服务注册中心

服务请求者

服务提供者

服务

发布

WSDL

UDDI

查找

绑定、调用

SOAP

Schema 教程

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

在此教程中,你将学习如何在应用程序中读取和创建 XML Schema 语言,XML Schema 为何比 DTD 更加强大,以及如何在您的应用程序中使用 XML Schema。

XML Schema 简介

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 可描述 XML 文档的结构。

XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。

您应当具备的基础知识

在继续学习之前,您需要对下面的知识有基本的了解:

· HTML / XHTML

· XML 以及 XML 命名空间

· 对 DTD 的基本了解

什么是 XML Schema?

XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。

XML Schema:

· 定义可出现在文档中的元素

· 定义可出现在文档中的属性

· 定义哪个元素是子元素

· 定义子元素的次序

· 定义子元素的数目

· 定义元素是否为空,或者是否可包含文本

· 定义元素和属性的数据类型

· 定义元素和属性的默认值以及固定值

XML Schema 是 DTD 的继任者

我们认为 XML Schema 很快会在大部分网络应用程序中取代 DTD。(良定义性和有效性)

理由如下:

· XML Schema 可针对未来的需求进行扩展

· XML Schema 更完善,功能更强大

· XML Schema 基于 XML 编写

· XML Schema 支持数据类型

· XML Schema 支持命名空间

XSD - <schema> 元素

<schema> 元素是每一个 XML Schema 的根元素。

<schema> 元素

<schema> 元素是每一个 XML Schema 的根元素:

<?xml version="1.0"?>

<xs:schema>

...

...

</xs:schema>

<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.w3school.com.cn"

xmlns="http://www.w3school.com.cn"

elementFormDefault="qualified">

...

...

</xs:schema>

代码解释:

下面的片断:

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

显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:

这个片断:

targetNamespace="http://www.w3school.com.cn"

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。

这个片断:

xmlns="http://www.w3school.com.cn"

指出默认的命名空间是 "http://www.w3school.com.cn"。

这个片断:

elementFormDefault="qualified"

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

在 XML 文档中引用 Schema

此 XML 文档含有对 XML Schema 的引用:

<?xml version="1.0"?>

<note xmlns="http://www.w3school.com.cn"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

代码解释:

下面的片断:

xmlns="http://www.w3school.com.cn"

规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。

一旦您拥有了可用的 XML Schema 实例命名空间:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

您就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

XSD 简易元素

XML Schema 可定义 XML 文件的元素。

简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。

什么是简易元素?

简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。

不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型。它可以是 XML Schema 定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定制类型。

您也可向数据类型添加限定(即 facets),以此来限制它的内容,或者您可以要求数据匹配某种特定的模式。

定义简易元素

定义简易元素的语法:

<xs:element name="xxx" type="yyy"/>

此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。

最常用的类型是:

· xs:string

· xs:decimal

· xs:integer

· xs:boolean

· xs:date

· xs:time

例子:

这是一些 XML 元素:

<lastname>Smith</lastname>

<age>28</age>

<dateborn>1980-03-27</dateborn>

这是相应的简易元素定义:

<xs:element name="lastname" type="xs:string"/>

<xs:element name="age" type="xs:integer"/>

<xs:element name="dateborn" type="xs:date"/>

简易元素的默认值和固定值

简易元素可拥有指定的默认值或固定值。

当没有其他的值被规定时,默认值就会自动分配给元素。

在下面的例子中,缺省值是 "red":

<xs:element name="color" type="xs:string" default="red"/>

固定值同样会自动分配给元素,并且您无法规定另外一个值。

在下面的例子中,固定值是 "red":

<xs:element name="color" type="xs:string" fixed="red"/>

XSD 属性

所有的属性均作为简易类型来声明。

什么是属性?

简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

如何声明属性?

定义属性的语法是:

<xs:attribute name="xxx" type="yyy"/>

在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。

最常用的类型是:

· xs:string

· xs:decimal

· xs:integer

· xs:boolean

· xs:date

· xs:time

实例

这是带有属性的 XML 元素:

<lastname lang="EN">Smith</lastname>

这是对应的属性定义:

<xs:attribute name="lang" type="xs:string"/>

属性的默认值和固定值

属性可拥有指定的默认值或固定值。

当没有其他的值被规定时,默认值就会自动分配给元素。

在下面的例子中,缺省值是 "EN":

<xs:attribute name="lang" type="xs:string" default="EN"/>

固定值同样会自动分配给元素,并且您无法规定另外的值。

在下面的例子中,固定值是 "EN":

<xs:attribute name="lang" type="xs:string" fixed="EN"/>

可选的和必需的属性

在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 "use" 属性:

<xs:attribute name="lang" type="xs:string" use="required"/>

对内容的限定

当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。

假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。

通过 XML schema,您也可向您的 XML 元素及属性添加自己的限定。这些限定被称为 facet(编者注:意为(多面体的)面,可译为限定面)。您会在下一节了解到更多有关 facet 的知识。

XSD 限定 / Facets

限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。

对值的限定

下面的例子定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于 120:

<xs:element name="age">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:minInclusive value="0"/>

<xs:maxInclusive value="120"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

对一组值的限定

如需把 XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。

下面的例子定义了带有一个限定的名为 "car" 的元素。可接受的值只有:Audi, Golf, BMW:

<xs:element name="car">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:enumeration value="Audi"/>

<xs:enumeration value="Golf"/>

<xs:enumeration value="BMW"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

上面的例子也可以被写为:

<xs:element name="car" type="carType"/>

<xs:simpleType name="carType">

<xs:restriction base="xs:string">

<xs:enumeration value="Audi"/>

<xs:enumeration value="Golf"/>

<xs:enumeration value="BMW"/>

</xs:restriction>

</xs:simpleType>

注释:在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。

对一系列值的限定

如需把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。

下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值只有小写字母 a - z 其中的一个:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一个例子定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写字母 A - Z 其中的三个:

<xs:element name="initials">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[A-Z][A-Z][A-Z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一个例子也定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写或小写字母 a - z 其中的三个:

<xs:element name="initials">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一个例子定义了带有一个限定的名为 "choice 的元素。可接受的值是字母 x, y 或 z 中的一个:

<xs:element name="choice">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[xyz]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一个例子定义了带有一个限定的名为 "prodid" 的元素。可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9:

<xs:element name="prodid">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

对一系列值的其他限定

下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值是 a - z 中零个或多个字母:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="([a-z])*"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下面的例子定义了带有一个限定的名为 "letter" 的元素。可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。举个例子,"sToP"将会通过这种模式的验证,但是 "Stop"、"STOP" 或者 "stop" 无法通过验证:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="([a-z][A-Z])+"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下面的例子定义了带有一个限定的名为 "gender" 的元素。可接受的值是 male 或者 female:

<xs:element name="gender">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="male|female"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下面的例子定义了带有一个限定的名为 "password" 的元素。可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9:

<xs:element name="password">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-zA-Z0-9]{8}"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

对空白字符的限定

如需规定对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。

下面的例子定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符:

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="preserve"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

这个例子也定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符):

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="replace"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

这个例子也定义了带有一个限定的名为 "address" 的元素。这个 whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="collapse"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

对长度的限定

如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。

本例定义了带有一个限定且名为 "password" 的元素。其值必须精确到 8 个字符:

<xs:element name="password">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:length value="8"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

这个例子也定义了带有一个限定的名为 "password" 的元素。其值最小为 5 个字符,最大为 8 个字符:

<xs:element name="password">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:minLength value="5"/>

<xs:maxLength value="8"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

数据类型的限定

限定

描述

enumeration

定义可接受值的一个列表

fractionDigits

定义所允许的最大的小数位数。必须大于等于0。

length

定义所允许的字符或者列表项目的精确数目。必须大于或等于0。

maxExclusive

定义数值的上限。所允许的值必须小于此值。

maxInclusive

定义数值的上限。所允许的值必须小于或等于此值。

maxLength

定义所允许的字符或者列表项目的最大数目。必须大于或等于0。

minExclusive

定义数值的下限。所允许的值必需大于此值。

minInclusive

定义数值的下限。所允许的值必需大于或等于此值。

minLength

定义所允许的字符或者列表项目的最小数目。必须大于或等于0。

pattern

定义可接受的字符的精确序列。

totalDigits

定义所允许的阿拉伯数字的精确位数。必须大于0。

whiteSpace

定义空白字符(换行、回车、空格以及制表符)的处理方式。

XSD 复合元素

复合元素包含了其他的元素及/或属性。

什么是复合元素?

复合元素指包含其他元素及/或属性的 XML 元素。

有四种类型的复合元素:

· 空元素

· 包含其他元素的元素

· 仅包含文本的元素

· 包含元素和文本的元素

注释:上述元素均可包含属性!

复合元素的例子

复合元素,"product",是空的:

<product pid="1345"/>

复合元素,"employee",仅包含其他元素:

<employee>

<firstname>John</firstname>

<lastname>Smith</lastname>

</employee>

复合元素,"food",仅包含文本:

<food type="dessert">Ice cream</food>

复合元素,"description",包含元素和文本:

<description>

It happened on <date lang="norwegian">03.03.99</date> ....

</description>

如何定义复合元素?

请看这个复合 XML 元素,"employee",仅包含其他元素:

<employee>

<firstname>John</firstname>

<lastname>Smith</lastname>

</employee>

在 XML Schema 中,我们有两种方式来定义复合元素:

1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样:

<xs:element name="employee">

<xs:complexType>

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

假如您使用上面所描述的方法,那么仅有 "employee" 可使用所规定的复合类型。请注意其子元素,"firstname" 以及 "lastname",被包围在指示器 <sequence>中。这意味着子元素必须以它们被声明的次序出现。您会在 XSD 指示器 这一节学习更多有关指示器的知识。

2. "employee" 元素可以使用 type 属性,这个属性的作用是引用要使用的复合类型的名称:

<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样:

<xs:element name="employee" type="personinfo"/>

<xs:element name="student" type="personinfo"/>

<xs:element name="member" type="personinfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

您也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

<xs:complexType name="fullpersoninfo">

<xs:complexContent>

<xs:extension base="personinfo">

<xs:sequence>

<xs:element name="address" type="xs:string"/>

<xs:element name="city" type="xs:string"/>

<xs:element name="country" type="xs:string"/>

</xs:sequence>

</xs:extension>

</xs:complexContent>

</xs:complexType>

XSD 复合空元素

空的复合元素不能包含内容,只能含有属性。

复合空元素:

一个空的 XML 元素:

<product prodid="1345" />

上面的 "product" 元素根本没有内容。为了定义无内容的类型,我们就必须声明一个在其内容中只能包含元素的类型,但是实际上我们并不会声明任何元素,比如这样:

<xs:element name="product">

<xs:complexType>

<xs:complexContent>

<xs:restriction base="xs:integer">

<xs:attribute name="prodid" type="xs:positiveInteger"/>

</xs:restriction>

</xs:complexContent>

</xs:complexType>

</xs:element>

在上面的例子中,我们定义了一个带有复合内容的复合类型。complexContent 元素给出的信号是,我们打算限定或者拓展某个复合类型的内容模型,而 integer 限定则声明了一个属性但不会引入任何的元素内容。

不过,也可以更加紧凑地声明此 "product" 元素:

<xs:element name="product">

<xs:complexType>

<xs:attribute name="prodid" type="xs:positiveInteger"/>

</xs:complexType>

</xs:element>

或者您可以为一个 complexType 元素起一个名字,然后为 "product" 元素设置一个 type 属性并引用这个 complexType 名称(通过使用此方法,若干个元素均可引用相同的复合类型):

<xs:element name="product" type="prodtype"/>

<xs:complexType name="prodtype">

<xs:attribute name="prodid" type="xs:positiveInteger"/>

</xs:complexType>

XSD 复合类型 - 仅含元素

“仅含元素”的复合类型含有一个仅包含其他元素的元素。

复合类型仅包含元素

XML 元素,"person",仅包含其他的元素:

<person>

<firstname>John</firstname>

<lastname>Smith</lastname>

</person>

您可在 schema 中这样定义 "person" 元素:

<xs:element name="person">

<xs:complexType>

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

请留意这个 <xs:sequence>。它意味着被定义的元素必须按上面的次序出现在 "person" 元素中。

或者您可以为 complexType 元素设定一个名称,并让 "person" 元素的 type 属性来引用此名称(如使用此方法,若干元素均可引用相同的复合类型):

<xs:element name="person" type="persontype"/>

<xs:complexType name="persontype">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

XSD 仅含文本复合元素

仅含文本的复合元素可包含文本和属性。

仅含文本的复合元素

此类型仅包含简易的内容(文本和属性),因此我们要向此内容添加 simpleContent 元素。当使用简易内容时,我们就必须在 simpleContent 元素内定义扩展或限定,就像这样:

<xs:element name="某个名称">

<xs:complexType>

<xs:simpleContent>

<xs:extension base="basetype">

....

....

</xs:extension>

</xs:simpleContent>

</xs:complexType>

</xs:element>

或者:

<xs:element name="某个名称">

<xs:complexType>

<xs:simpleContent>

<xs:restriction base="basetype">

....

....

</xs:restriction>

</xs:simpleContent>

</xs:complexType>

</xs:element>

提示:请使用 extension 或 restriction 元素来扩展或限制元素的基本简易类型。

这里有一个 XML 元素的例子,"shoesize",其中仅包含文本:

<shoesize country="france">35</shoesize>

下面这个例子声明了一个复合类型,其内容被定义为整数值,并且 "shoesize" 元素含有名为 "country" 的属性:

<xs:element name="shoesize">

<xs:complexType>

<xs:simpleContent>

<xs:extension base="xs:integer">

<xs:attribute name="country" type="xs:string" />

</xs:extension>

</xs:simpleContent>

</xs:complexType>

</xs:element>

我们也可为 complexType 元素设定一个名称,并让 "shoesize" 元素的 type 属性来引用此名称(通过使用此方法,若干元素均可引用相同的复合类型):

<xs:element name="shoesize" type="shoetype"/>

<xs:complexType name="shoetype">

<xs:simpleContent>

<xs:extension base="xs:integer">

<xs:attribute name="country" type="xs:string" />

</xs:extension>

</xs:simpleContent>

</xs:complexType>

XSD 带有混合内容的复合类型

混合的复合类型可包含属性、元素以及文本。

带有混合内容的复合类型

XML 元素,"letter",含有文本以及其他元素:

<letter>

Dear Mr.<name>John Smith</name>.

Your order <orderid>1032</orderid>

will be shipped on <shipdate>2001-07-13</shipdate>.

</letter>

下面这个 schema 声明了这个 "letter" 元素:

<xs:element name="letter">

<xs:complexType mixed="true">

<xs:sequence>

<xs:element name="name" type="xs:string"/>

<xs:element name="orderid" type="xs:positiveInteger"/>

<xs:element name="shipdate" type="xs:date"/>

</xs:sequence>

</xs:complexType>

</xs:element>

注释:为了使字符数据可以出现在 "letter" 的子元素之间,mixed 属性必须被设置为 "true"。<xs:sequence> 标签 (name、orderid 以及 shipdate ) 意味着被定义的元素必须依次出现在 "letter" 元素内部。

我们也可以为 complexType 元素起一个名字,并让 "letter" 元素的 type 属性引用 complexType 的这个名称(通过这个方法,若干元素均可引用同一个复合类型):

<xs:element name="letter" type="lettertype"/>

<xs:complexType name="lettertype" mixed="true">

<xs:sequence>

<xs:element name="name" type="xs:string"/>

<xs:element name="orderid" type="xs:positiveInteger"/>

<xs:element name="shipdate" type="xs:date"/>

</xs:sequence>

</xs:complexType>

XSD 复合类型指示器

通过指示器,我们可以控制在文档中使用元素的方式。

指示器

有七种指示器:

Order 指示器:

· All

· Choice

· Sequence

Occurrence 指示器:

· maxOccurs

· minOccurs

Group 指示器:

· Group name

· attributeGroup name

Order 指示器

Order 指示器用于定义元素的顺序。

All 指示器

<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:

<xs:element name="person">

<xs:complexType>

<xs:all>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:all>

</xs:complexType>

</xs:element>

注释:当使用 <all> 指示器时,你可以把 <minOccurs> 设置为 0 或者 1,而只能把 <maxOccurs> 指示器设置为 1(稍后将讲解 <minOccurs> 以及 <maxOccurs>)。

Choice 指示器

<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼):

<xs:element name="person">

<xs:complexType>

<xs:choice>

<xs:element name="employee" type="employee"/>

<xs:element name="member" type="member"/>

</xs:choice>

</xs:complexType>

</xs:element>

提示:如需设置子元素出现任意次数,可将 <maxOccurs> (稍后会讲解)设置为 unbounded(无限次)。

Sequence 指示器

<sequence> 规定子元素必须按照特定的顺序出现:

<xs:element name="person">

<xs:complexType>

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:sequence>

</xs:complexType>

</xs:element>

Occurrence 指示器

Occurrence 指示器用于定义某个元素出现的频率。

注释:对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。

maxOccurs 指示器

<maxOccurs> 指示器可规定某个元素可出现的最大次数:

<xs:element name="person">

<xs:complexType>

<xs:sequence>

<xs:element name="full_name" type="xs:string"/>

<xs:element name="child_name" type="xs:string" maxOccurs="10"/>

</xs:sequence>

</xs:complexType>

</xs:element>

上面的例子表明,子元素 "child_name" 可在 "person" 元素中最少出现一次(其中 minOccurs 的默认值是 1),最多出现 10 次。

minOccurs 指示器

<minOccurs> 指示器可规定某个元素能够出现的最小次数:

<xs:element name="person">

<xs:complexType>

<xs:sequence>

<xs:element name="full_name" type="xs:string"/>

<xs:element name="child_name" type="xs:string"

maxOccurs="10" minOccurs="0"/>

</xs:sequence>

</xs:complexType>

</xs:element>

上面的例子表明,子元素 "child_name" 可在 "person" 元素中出现最少 0 次,最多出现 10 次。

提示:如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明:

一个实际的例子:

名为 "Myfamily.xml" 的 XML 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="family.xsd">

<person>

<full_name>Tony Smith</full_name>

<child_name>Cecilie</child_name>

</person>

<person>

<full_name>David Smith</full_name>

<child_name>Jogn</child_name>

<child_name>mike</child_name>

<child_name>kyle</child_name>

<child_name>mary</child_name>

</person>

<person>

<full_name>Michael Smith</full_name>

</person>

</persons>

上面这个 XML 文件含有一个名为 "persons" 的根元素。在这个根元素内部,我们定义了三个 "person" 元素。每个 "person" 元素必须含有一个 "full_name" 元素,同时它可以包含多至 5 个 "child_name" 元素。

这是schema文件"family.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

elementFormDefault="qualified">

<xs:element name="persons">

<xs:complexType>

<xs:sequence>

<xs:element name="person" maxOccurs="unbounded">

<xs:complexType>

<xs:sequence>

<xs:element name="full_name" type="xs:string"/>

<xs:element name="child_name" type="xs:string"

minOccurs="0" maxOccurs="5"/>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

Group 指示器

Group 指示器用于定义相关的数批元素。

元素组

元素组通过 group 声明进行定义:

<xs:group name="组名称">

...

</xs:group>

您必须在 group 声明内部定义一个 all、choice 或者 sequence 元素。下面这个例子定义了名为 "persongroup" 的 group,它定义了必须按照精确的顺序出现的一组元素:

<xs:group name="persongroup">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

<xs:element name="birthday" type="xs:date"/>

</xs:sequence>

</xs:group>

在您把 group 定义完毕以后,就可以在另一个定义中引用它了:

<xs:group name="persongroup">

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

<xs:element name="birthday" type="xs:date"/>

</xs:sequence>

</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">

<xs:sequence>

<xs:group ref="persongroup"/>

<xs:element name="country" type="xs:string"/>

</xs:sequence>

</xs:complexType>

属性组

属性组通过 attributeGroup 声明来进行定义:

<xs:attributeGroup name="组名称">

...

</xs:attributeGroup>

下面这个例子定义了名为 "personattrgroup" 的一个属性组:

<xs:attributeGroup name="personattrgroup">

<xs:attribute name="firstname" type="xs:string"/>

<xs:attribute name="lastname" type="xs:string"/>

<xs:attribute name="birthday" type="xs:date"/>

</xs:attributeGroup>

在您已定义完毕属性组之后,就可以在另一个定义中引用它了,就像这样:

<xs:attributeGroup name="personattrgroup">

<xs:attribute name="firstname" type="xs:string"/>

<xs:attribute name="lastname" type="xs:string"/>

<xs:attribute name="birthday" type="xs:date"/>

</xs:attributeGroup>

<xs:element name="person">

<xs:complexType>

<xs:attributeGroup ref="personattrgroup"/>

</xs:complexType>

</xs:element>

n WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。

n WSDL 指网络服务描述语言 (Web Services Description Language)。

n WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。

n WSDL 指网络服务描述语言

n WSDL 使用 XML 编写

n WSDL 是一种 XML 文档

n WSDL 用于描述网络服务

n WSDL 也可用于定位网络服务

WSDL 文档结构

元素

定义

<portType>

web service 执行的操作

<message>

web service 使用的消息

<types>

web service 使用的数据类型

<binding>

web service 使用的通信协议

一个 WSDL 文档的主要结构是类似这样的:

<definitions>

<types> definition of types........

</types>

<message> definition of a message....

</message>

<portType> definition of a port.......

</portType>

<binding> definition of a binding....

</binding>

</definitions>

n 每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。

<message name="getTermRequest">

<part name="term" type="xs:string"/>

</message>

<message name="getTermResponse">

<part name="value" type="xs:string"/>

</message>

Wsdl的端口

n <portType> 元素是最重要的 WSDL 元素。

n 它可描述一个 web service、可被执行的操作,以及相关的消息。

n 可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。

请求-响应是最普通的操作类型。一个 request-response 操作的例子

<message name="getTermRequest">

<part name="term" type="xs:string"/>

</message>

<message name="getTermResponse">

<part name="value" type="xs:string"/>

</message>

<portType name="glossaryTerms">

<operation name="getTerm">

<input message="getTermRequest"/>

<output message="getTermResponse"/>

</operation>

</portType>

在这个例子中,端口 “glossaryTerms”

定义了一个名为 “getTerm” 的

request-response 操作。

“getTerm” 操作会请求一个名为

“getTermRequest” 的输入消息,

此消息带有一个名为 “term” 的参数,

并将返回一个名为 “getTermResponse”

的输出消息,此消息带有一个名为

"value" 的参数。

一个 one-way 操作的例子:

<message name="newTermValues">

<part name="term" type="xs:string"/>

<part name="value" type="xs:string"/>

</message>

<portType name="glossaryTerms">

<operation name="setTerm">

<input name="newTerm" message="newTermValues"/>

</operation>

</portType >

在这个例子中,端口 "glossaryTerms" 定义了一个名为 "setTerm" 的 one-way 操作。

这个 “setTerm” 操作可接受新术语表项目消息的输入,这些消息使用一条名为

“newTermValues” 的消息,此消息带有输入参数 “term” 和 “value”。

不过,没有为这个操作定义任何输出。

Notification操作

n Operation只发送output,不接受input,因此,只有output message。

n Server发送Response给client,不期望接受Request 。

n SOAP简易对象访问协议,用于访问网络服务的协议。

n SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。

n 语法规则

SOAP 消息必须用 XML 来编码

SOAP 消息必须使用 SOAP Envelope 命名空间

SOAP 消息必须使用 SOAP Encoding 命名空间

SOAP 的消息结构与数据的组织方法

SOAP 为在一个松散的、分布的环境中使用 XML 对等地交换结构化的和类型化的信息提供了一个简单的轻量级机制。而传送信息的基本单元承载体就是 SOAP 消息。从根本上来看, SOAP 消息是从发送方到接受方的一种传输方法,但就象前面 SOAP 技术及应用概览 一文中阐述的那样, SOAP 消息一般会和实现模式结合,例如请求 / 响应。 SOAP 的实现可以为特殊网络系统的特有特征来优化。例如,通过 HTTP binding 将 SOAP 响应消息通过 HTTP 响应来传输,请求和响应使用同一连接。

当然,无论 SOAP 是与哪种协议绑定,它都使用同一种消息的描述框架格式,这种框架格式就是以 SOAP Envelope(SOAP 信封 ) 为根元素,内含 SOAP Header 和 SOAP Body 子元素的这样一个 XML 文档。 SOAP 消息描述文本是一种 XML Application 。之所以称之为描述框架,而不称为描述,是因为 SOAP 规范为 SOAP Header 和 SOAP Body 定义了强大的扩展机制,使用户可以按需要在其中增加与应用相关的自定义描述格式, SOAP 规范只是定义了消息描述的一个骨架。

所有的 SOAP 消息都是使用 XML 格式来编码的。 SOAP 应用程序在生成由 SOAP 定义的所有元素和属性的时候,应该包含恰当的 SOAP 的命名空间。 SOAP 应用程序必须能处理其收到的消息中的 SOAP 命名空间。它必须丢弃那些包含不正确命名空间的消息,并且可以处理那些不包含 SOAP 命名空间的 SOAP 消息,就好象他们包含了正确的命名空间一样。

SOAP 定义了两个命名空间:

SOAP 信封的命名空间标识为 http://schemas.xmlsoap.org/soap/envelope/

SOAP 编序的命名空间标识为 http://schemas.xmlsoap.org/soap/encoding/

SOAP 消息必须不包含 DTD ,同时 SOAP 消息也必须不包含 PI(Processing Instructions) 。

除 SOAP mustUnderstand attribute 和 SOAP actor attribute 外,一般允许属性及属性值自由地选择是在 XML 实例中描述还是在 XML Schema 中描述,当然前提是他们具有相同的效果。也就是说,在模式 (schema) 中使用默认值或固定值定义在语义上等价于在实例中的值定义。

例如:在 Schema 中定义

<element type=”string” fixed=”DealEasy”>

然后在 XML 实例中定义

<company />

与直接在 XML 实例中定义

<company>DealEasy</company>

在语义上是等价的。

SOAP 的消息框架
SOAP 消息是由一个强制的 SOAP Envelope 、一个可选的 SOAP Header 和一个强制的 SOAP Body 组成的 XML 文档。作为 SOAP 消息的该 XML 文档将在本规范的其余部分被引用。而本节的元素和属性的命名空间标识是 http://schemas.xmlsoap.org/soap/envelope/ 。 SOAP 消息应当包含如下部分:

Envelope 是表示该消息的 XML 文档的顶级元素

Header 则是为了支持在松散环境下在通讯方之间尚未预先达成一致的情况下为 SOAP 消息增加特性的通用机制。 SOAP 定义了很少的一些属性来用于指明谁可以处理该特性以及它是可选处理的还是强制处理的。

Body 为该消息的最终接收者所想要得到的那些必须处理的信息提供了一个容器。此外, SOAP 定义了 Body 的一个子元素 Fault 用于报告错误。

这些 XML 元素的语法规则如下:

1. Envelope

元素名为 Envelope

该元素必须在 SOAP 消息中出现,一般是根元素

该元素可以包含命名空间申明和额外的属性。如果出现额外属性 ( 并非是 SOAP 规范预定义的属性 ) ,则必须使用命名空间修饰。类似的,该元素可以包含额外的子元素,这些子元素如果出现,必须有命名空间修饰并且必须跟在 SOAP Body 元素之后,也就是说 Envelope 的直接子元素 Header 和 Body 必须排列在最前面。

2. Header

元素名为 Header

该元素可以在 SOAP 消息中出现,但并不是必须出现 ( 也就是说可以仅使用 Body 元素完成一次 SOAP 消息的信息描述 ) 。如果出现,该元素必须是 SOAP Envelope 元素的第一个直接子元素。

该元素可以包含一系列的 Header 条目,这些条目都应当是 Header 元素的直接子元素。 Header 的所有直接子元素必须有命名空间修饰。

Header 条目自身可以包含下级子元素,但这些元素不是 Header 条目,而是 Header 条目的内容。

3. Body

§ 元素名为 Body

该元素必须在 SOAP 消息中出现,同时必须是 SOAP Envelope 元素的一个直接子元素。若该消息中包含 Header 元素,则 Body 元素必须直接跟随 Header ,为 Header 元素的相邻兄弟元素。若 Header 不出现,则其必须是 Envelope 的第一个直接子元素。

该元素可以包含一系列的 Body 条目,这些条目都应当是 Body 元素的直接子元素。 Body 的所有直接子元素必须有命名空间修饰。 SOAP 定义了 SOAP Fault 元素,它用来指示调用错误的信息。

Boidy 条目自身可以包含下级子元素,但这些元素不是 Body 条目,而是 Body 条目的内容。

下面是一个 SOAP 消息的例子,其中 Envelope 包含一个 Header 元素和一个 Body 元素。 Header 元素有两个 Header 条目,他们的命名空间修饰都是 uniB2B ,两个 Header 条目各有一个子元素。而 Body 元素有一个 Body 条目,该条目包含两个子元素。

<SOAP-ENV:Envelope
xmlns:SOAP-ENV=” http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
<uniB2B:AccessAuthenticated xmlns:uniB2B=”Some-URI”>
<SessionKey>76E4#12A@-98JA#V5GQ</SessionKey>
</uniB2B:AccessAuthenticated >
<uniB2B:GetLastProductPrice xmlns:uniB2B ="Some-URI">
<Price>243900.00</Price>
</uniB2B:GetLastProductPrice>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
<ProductID>Jaguar_X_Type</ProductID >
<ProductPrice>243900.00</ProductPrice>
</uniB2B:RequestPurchaseOrder >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SOAP encodingStyle 属性
SOAP 的全局 encodingStyle 属性被用于指明在 SOAP 消息中使用哪种编序规则。该属性可以在任意元素中出现,并且其作用范围包括该元素的内容和所有其子元素中未使用该属性的所有子元素,这就象 XML 命名空间定义的作用范围一样,是向下传递的。对于一个 SOAP 消息来说,没有默认的编码定义。

SOAP encodingStyle 属性的值是一个或多个用于标识编序规则 ( 对数据类型和数据类型实例的描述规则 ) 和用于标识解序 SOAP 消息的规则的有序列表,其排序是按照详尽程度从大到小排列。下面是一些值的例子:

"http://schemas.xmlsoap.org/soap/encoding/"
"http://schema.dealeasy.com/soap/encoding/ http://schema.dealeasy.com/soap/encoding/additional/"
""

而 SOAP 规范中定义的编序规则的标识为 http://schemas.xmlsoap.org/soap/encoding/ 。消息若要使用特别的编序应该使用 SOAP encodingStyle 属性来指明。另外,所有在句法上由 http://schemas.xmlsoap.org/soap/encoding/ 开始的 URI 序列表明这其中包含的所有 URI 都与 SOAP 规范中定义的 SOAP 编码规则相一致。 ( 虽然可能会添加潜在的更为严格的规则,也就是说 http://schemas.xmlsoap.org/soap/encoding/ 标识的编码规则是一个编码的基类 )

一个空值的 URI( “” ) 明确地指明并未为其所包含的元素声明任何编码风格。这可以为包含的元素关闭任何前面预先的声明。


SOAP Header
SOAP 提供了一个可扩展的机制用于在分散的网络环境下,模块化地扩展 SOAP 消息的描述能力,而通讯双方并不需要有完整的预先的约定。典型的扩展例子可以是实现一些诸如认证、事务管理以及支付的 Header 条目,当然对于更复杂的多步骤的 B2B 协同,通过扩展相对复杂的 Header 条目也可以实现,在前面的文章 SOAP 技术及应用概览 中就有一个完整的例子。

按照 SOAP 的语法, Header 元素应当被编码为 SOAP Envelope XML 文档的第一直接子元素。 Header 的所有直接子元素都被称为 Header 条目。

Header 条目的编码规则包括:

1. 一个 Header 条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间 URI 和局部名来组成。 SOAP Header 元素的所有直接子元素都必须是完整修饰的。不允许任何不带命名空间修饰的 Header 条目存在。

2. SOAP encodingStyle 属性可以用于指明 Header 条目的编码风格,而 encodingStyle 属性在前面已经详细介绍了。

3. SOAP mustUnderstand 属性和 SOAP actor 属性可以用于指明如何处理条目和由谁来处理条目。


在 SOAP Header 中, SOAP Header 属性的设置是为了让 SOAP 消息的接收者了解应该如何处理该消息。一个生成 SOAP 消息的 SOAP 应用程序应该仅使用 SOAP Header 元素的直接子元素的 SOAP Header 属性。而对于那些并非作为 SOAP Header 元素的直接子元素出现的 SOAP Header 属性, SOAP 消息的接受者必须忽略。

以下是一个 Header 的例子,其中包含了一个元素标识 Priority 和一个 mustUnderstand 属性及其值 1 ,以及 Priority 的值 7 ,该元素表明该消息的处理优先权为 7 。

<SOAP-ENV:Header>
<uniB2B:Priority
xmlns:uniB2B="some-URI" SOAP-ENV:mustUnderstand="1">
7
</uniB2B:Priority>
</SOAP-ENV:Header>

SOAP actor 属性
SOAP 消息从生成者到达最终接受者,将潜在地沿着消息路径 (message path) 经过一系列的 SOAP 中间介。 SOAP 中间介是一个能够接受和转发 SOAP 消息的应用程序。所有的中间介都如同最终接受者一样由一个 URI 来标识。

并非一个 SOAP 消息的所有部分都是最终接收者需要了解的调用信息,其中部分是路径中的一个或多个中间介所需要处理的。 Header 元素中接收者角色类似合约的接受者,他并不能将其交给其它方。也就是说,一个接收者接到其需要接收的 Header 元素必须不转发该 Header 给 SOAP 消息路径中的下一个应用程序。该接收者可以插入一个类似的 Header 元素,但在这个情况下,合约关系存在于该应用程序及下一个 Header 元素的接收者之间了。

SOAP actor 全局属性可以被用于指明 Header 元素的接收者。而 SOAP actor 属性的值是一个 URI 。 URI: http://schemas.xmlsoap.org/soap/actor/next 指明该 Header 元素是直接的下一个进行消息处理的 SOAP 应用程序需要处理的。这与 HTTP 的连接头字段的 hop-by-hop scope model 的表示是一致的。

若省略 SOAP actor 属性,则表明该消息的接收者是 SOAP 消息的最终接收者。

对于一个 SOAP 消息的实例 ( 在实际传输中的 SOAP 消息 ) ,这个属性必须出现以指明该消息的接收方的 URI 。


SOAP mustUnderstand 属性
SOAP mustUnderstand 全局属性用于指明一个 Header 条目是强制必须处理的还是可选的要求接收者处理的。 Header 条目的接收者由 SOAP actor 属性来定义。 mustUnderstand 属性的值可取为“ 0 ”或“ 1 ”。若没有使用 SOAP mustUnderstand 属性,则在语义上等价于 mustUderstand 属性出现同时取值为“ 0 ”。

若 Header 元素带有值为“ 1 ”的 SOAP mustUnderstand 属性,则该 Header 条目的接收者要么必须遵循语义 ( 由具备完整修饰的元素名来传达 ) 并正确地处理这些语义,要么必须宣称处理消息失败。也就是说如果该应用程序发现自己无法识别某一个 Header 条目 ( 应为在自己的处理逻辑里面没有该条目 ) ,那么必须申明错误,并响应该错误信息。

SOAP mustUnderstand 属性是为了考虑健壮地升级而设置的。所有用值为“ 1 ”的 SOAP mustUnderstand 属性来标记的元素必须被认为是可以影响该元素的上级元素或同级元素的语义。而这种风格标记的元素应保证对语义的修改并不能被那些不能完全理解该修改后的语义的那些元素静默地或假设地、不正确地忽略。

该属性若要生效必须在实例中出现,也就是说不能依靠 XML Schema 的缺省值或固定值的设置来使该属性生效。。



SOAP Body
SOAP Body 元素提供一个简单的用于与消息的最终接收者交换信息 ( 这些信息都是必须处理的 ) 的机制。而 Body 元素的典型应用包含序列的 RPC 调用和错误报告。

Body 元素在编码上应当作为 SOAP Envelope 元素的一个直接子元素。如果包含 Header 元素,则 Body 元素必须直接跟随 Header 元素,为 Header 元素的直接下一个兄弟元素,否则 Body 元素必须是 Envelope 元素的第一直接子元素。

所有 Body 元素的直接子元素被称为 Body 条目,同时每一个 Body 条目都应当编码为 SOAP Body 元素里的一个独立元素。

Body 条目的编码规则包括:

1. 一个 Body 条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间 URI 和局部名来组成。 SOAP Body 元素的直接子元素可以是命名空间修饰的。

2. SOAP encodingStyle 属性可以被用来表明 Body 条目中使用的编码规则。

SOAP 只预定义了一个 Body 条目:用于向调用方报告错误的 Body 条目 :Fault 。

SOAP Body 的应用
下面是一对 SOAP 调用 / 响应的例子,在调用消息中 Body 包含了一个描述调用方法的 Body 条目 RequestPurchaseOrder ,它包含两个参数 ProductID 和 ProductPrice 。而在响应消息中, Body 中包含了一个 Body 条目 ResponsePurchaseOrder 用于描述响应调用的返回信息,其中包含 OrderID 、 AuthenticatedID 、 ProductID 、 ProductNumber 、 IssueDate 。

RPC 调用的 SOAP 消息表示

POST /ProductQuote HTTP/1.1
Host: service.eMarketplace.com.cn
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

<SOAP-ENV:Envelope
xmlns:SOAP-ENV=” http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Header>
<uniB2B:AccessAuthenticated xmlns:uniB2B=”Some-URI”>
<SessionKey>76E4#12A@-98JA#V5GQ</SessionKey>
</uniB2B:AccessAuthenticated >
<uniB2B:GetLastProductPrice xmlns:uniB2B ="Some-URI">
<Price>243900.00</Price>
</uniB2B:GetLastProductPrice>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<uniB2B:RequestPurchaseOrder xmlns:uniB2B ="Some-URI">
<ProductID>Jaguar_X_Type</ProductID >
<ProductPrice>243900.00</ProductPrice>
</uniB2B:RequestPurchaseOrder >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

RPC 响应的 SOAP 消息表示

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope
xmlns:SOAP-ENV=” http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<uniB2B:ResponsePurchaseOrder xmlns:uniB2B ="Some-URI">
<OrderID>AJR786503</OrderID>
<AuthenticatedID>76E4#12A@-98JA#V5GQ</AuthenticatedID>
<ProductID>Jaguar_X_Type</ProductID >
<ProductPrice>243900.00</ProductPrice>
<ProductNumber>1</ProductNumber>
<IssueDate>2001-4-1</IssueDate>
</uniB2B:ResponsePurchaseOrder >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


SOAP Header 和 SOAP Body 的语义关系
Header 和 Body 在定义上是独立的,但在事实上是相联系的。一个 Body 条目和一个 Header 条目的关系是:一个 Body 条目在语义上与这样一个 Header 条目等价:该 Header 条目将由默认参与者 ( 最终接受者 ) 解释同时由值为“ 1 ”的 SOAP mustUnderstand 属性标记。默认参与者可以不使用 actor 属性的方式来指明。



SOAP Fault
SOAP Fault 元素是用于在 SOAP 消息中传输错误及状态信息。如果 SOAP 消息需要包含 SOAP Fault 元素的话,它必须作为一个 Body 条目出现,同时在 Body 元素内它必须不出现多于一次 ( 至多出现一次 ) 。

SOAP Fault 元素定义了如下子元素:

faultcode

faultcode 元素是应那些要以算法的机制来标识错误的软件的需要。 faultcode 必须在 SOAP Fault 元素中出现,同时 faultcode 的值必须是属于后面一节中定义的一个修饰名。 SOAP 定义了一个很小的 SOAP 错误代码的集合用于覆盖基本的 SOAP 错误。

faultstring

faultstring 元素是为那些错误代码提供人可以读懂的错误解释,它不是为程序处理而设。 Faultstring 元素有点类似于 HTTP 中定义的’ Reason-Phrase ’。 faultstring 必须在 SOAP Fault 元素中出现,同时它至少应该提供一些解释该错误种类的信息。

faultactor

faultactor 元素是为在消息路径中是谁引起了该错误的发生这一情况描述信息。它类似于 SOAP actor 属性,不过它不是用于指示 Header 条目的接收者,而是用于指示错误源。 faultactor 属性的值是一个标识该源的一个 URI 。作为 SOAP 消息的非最终接收者的应用程序必须在 SOAP Fault 元素中包含 faultactor 元素。而消息的最终接收者可以使用 faultactor 元素来明确地指明是它生成了该错误。

detail

detail 元素是用于传输与 Body 元素相关的应用程序特别的错误信息。如果 Body 元素中的内容不能被成功地处理的时候,它必须出现。它必须不能被用于传输属于 Header 条目的错误信息。详细的属于 Header 条目的错误信息必须在 Header 条目中表示传输。

若 Fault 元素中不出现 detail 元素则表明其中的错误与 Body 元素的处理无关。这可以用于区分在在错误情况下 Body 元素是否被处理过。

detail 元素的所有直接子元素都被称为 detail 条目,同时每个 detail 条目都作为 detail 元素中的一个独立的元素进行编码。

Detail 条目的编码规则如下:

1. 一个 detail 条目由一个完整修饰的元素名来标识,所谓完整修饰的元素名是由一个命名空间 URI 和局部名来组成。 Detail 元素的直接子元素可以是命名空间修饰的。

2. SOAP encodingStyle 属性可以被用来表明 detail 条目中使用的编码规则。

其他的 Fault 子元素可以出现,他们都应当提供命名空间修饰。


SOAP Fault Codes
当描述由本规范定义的错误的时候, faultcode 元素必须使用在本节中定义的 faultode 的值。这些 faultcode 值的命名空间标识为 http://schemas.xmlsoap.org/soap/envelope/

默认的 SOAP faultcode 值是按照一种可扩展的风格来定义的,它允许在维持以有的 faultcode 值的向后兼容的基础定义新的 SOAP faultcode 值。这一机制在使用上非常类似与 HTTP 中基本状态类的定义 1xx, 2xx, 3xx 等。不过,他们是用 XML 修饰名来定义,而不是用整数。“ . ”符号是 faultcode 值的分隔符,用于指明“ . ”左边的是一个比右边更泛化的错误代码。例如:

Client.Authentication

在本文档中定义的 faultcode 值集合是:

Name Meaning

VersionMismatch 处理程序发现在 SOAP Envelope 元素中有一个非法的命名空间。

MustUnderstand SOAP Header 元素的一个直接子元素无法被理解或者他并不遵守由处理对象要求的 SOAP mustUnderstand 属性必须取值为“ 1 ”的要求。

Client Client 错误类用于指示以下错误:消息的格式有误或消息中缺乏能成功处理所必须的一些适当信息。例如,消息中可能缺乏适当的认证和支付信息。一般情况下应指明消息不应该在没有修改过的情况下重发。可参阅 Fault detail 子元素的描述。

Server Server 错误类用于表明消息无法被处理的原因,但那些属于内容上的错误并不属于该范畴,它主要被用于指示那些属于处理上的错误。例如,处理操作需要包含与一个上游处理程序进行通讯,但该程序没有响应。但该消息可能在下一个时间点上被成功处理。可参阅 Fault detail 子元素的描述。

分享到:
评论

相关推荐

    Web Service学习笔记

    NULL 博文链接:https://ztc.iteye.com/blog/286098

    Web Service学习笔记.doc

    Web Service学习笔记

    web service学习笔记

    web service的概述,包括定义,基本架构,使用的主要技术以及常用框架的简单介绍

    web service学习笔记1

    * 目前两种主要的技术类型 * 1、soap-based web service * 2、restful-based web service * * soap-

    Eclipse插件开发指南

    [Web Service学习笔记]第 1 篇 SOAP的HelloWord实例 ******************************************************* 作者:陈刚,程序员,广西省桂林人,广西师范大学数学系 97 届毕业。 blog:...

    [Web Service学习笔记]第1篇 SOAP的HelloWord实例

    里面只有这样几句话:“交易消息(包括请求和应答)是以XML格式表达的,包括两个部分:Message Header(消息头)与Service Content(交易业务内容)。” “接口协议使用HTTP协议,落地方为发起方提供访问的URL,发起方...

    web service入门学习笔记

    web service入门学习笔记,包含运行实例代码

    axis开发web_service程序_学习笔记

    axis开发web_service程序_学习笔记,学习axis开发,学习笔记

    Java/JavaEE 学习笔记

    Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 ...Web Service学习笔记.....388

    J2EE学习笔记(J2ee初学者必备手册)

    内容目录 .......................1 Java/JavaEE.....1 2008年11月1日...............1 Unix 学习笔记7 一、Unix前言............7 二、Unix基础知识....7 三、Unix常用命令....8 ...Web Service学习笔记.....388

    Axis 开发Web Service(学习笔记)

    网上无意中找到的... 介绍Axis 开发WEB SERVICE,挺不错的.

    SAP 中文学习笔记

    SAP 中文学习笔记SAP NW AS as web service Server and Client .pdf

    JBoss ESB 学习笔记

    自己辛苦整理的网上的JBoss ESB学习笔记 ,非常详细,代码操作都有截图; 希望大家多支持! 学习笔记PDF的目录如下: 1——搭建ESB开发环境 2 2——第一个ESB代码...16——第十五个ESB代码Web Service Consumer 1 151

    net学习笔记及其他代码应用

    2.使用VS.NET中的Add Web Reference菜单选项 23..net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。 24.在C#中,string str = null 与 string str = ...

    第一天MySQL的自我系统学习笔记

    第一天MySQL的自我系统学习笔记

    spring培训学习笔记

    从服务上讲(With a service abstraction),它将程序代码从J2EE环境解耦到普通的java对象(自然,这些代码可以脱离J2EE而在多种环境中运行)。它还在很多功能上提供了除EJB之外的选择――比如为所有的POJO提供声明式...

    黑马程序员_Webservice公开课源码和笔记

    学习本次公开课你将收获和体会到什么: 学习完本次公开课,你将深入理解Web Service,快速上手企业开发。 主要讲解内容如下: Web Service是什么? Web service的优势和前景 Web Service和Web服务器的区别? 在什么...

    JavaEE5学习笔记09-将EJB发布成WebService总结

    JavaEE5学习笔记09-将EJB发布成WebService总结。

    webservive学习笔记

    Web Service的定义,原理,应用,源码

Global site tag (gtag.js) - Google Analytics