xml/schema/wsdl

来源:互联网 发布:一键必杀xkey软件 编辑:程序博客网 时间:2024/06/05 10:50

xml/schema

在看webservice时,牵扯到很多xml的知识,看的一片头疼,不得不硬着头皮系统看了一遍这方面的知识,作为学习笔记记录下自己易混淆的地方……

XML可扩展标记语言(EXtensible Markup Language),是 W3C 的推荐标准,设计宗旨是传输数据和存储数据,而非显示数据。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

HTML 被设计用来显示数据。

头部:

<?xml version="1.0" encoding="utf-8" ?>
standalone="no" (yes)文档是否独立
<?xml version="1.0" encoding="utf-8" standalone="yes"?>

 

对于xml标签中出现的所有空格和换行,xml解析程序都会当作标签内容进行处理。在xml中,空格和换行都作为原始内容被处理,所以在编写xml文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好” 书写习惯可能要被迫改变,例如下面两段内容是不一样的:

<网址>ljfbest.com</网址>

<网址>
ljfbest.com
</网址>

有些内容不想被解析,可以放在CDATA区里<![CDATA[<it>abc</it>]]>
转义字符&lt;等

 

要约束一个xml文档可以通过dtd或者schema,schema已经成为w3c的标准schema文件本身就是一个xml文件,但扩展名通常为.xsd,一个schema文档必须有根节点schema编写了一个schema文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在schema技术中有一个专业术语来描述这个过程,即把schema文档声明的元素绑定到一个名称空间上,以后xml文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束,看下面一个例子:

ai.xsd

<?xml version="1.0" encoding="utf-8" ?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  targetNamespace="http://ljfbest.com"elementFormDefault="qualified"><xs:element name="书架"><xs:complexType><xs:sequence maxOccurs="unbounded"><xs:element name="书名" type="xs:string" /><xs:element name="作者"><xs:complexType><xs:sequence maxOccurs="1"><xs:element name="fname" type="xs:string" /><xs:element name="lname" type="xs:string" /></xs:sequence></xs:complexType></xs:element><xs:element name="售价" type="xs:float" /></xs:sequence></xs:complexType></xs:element></xs:schema>

2行:引入schema的命名空间,並且加入前缀xs,如果不加xs的话,文档中的xs:都要刪去 -->

3行:为该文档指定命名空间-->

4行:unqualified,则无须通过命名空间前缀限定目标命名空间的元素, qualified,则必须通过命名空间前缀限定目标命名空间的元素。

然后下面的内容就是对xml约束内容了,主要注意以下的点

简单元素:只含有文本的XML元素,不可以含有其他元件或属性定义简明元素的语法为:

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

属性:简单的元素没有属性,当元素含有属性时,它会被认为是复合元素,但属性本身总是被声明为简单类型。定义一项属性的语法是:
<xs:attribute name="xxx" type="yyy"/>

复合元素:包含其他元素或属性

 

其它细节在schema文档中均有详细介绍。下面来看如何在xml中引入该schema……

<?xml version="1.0" encoding="utf-8" ?><xi:书架 xmlns:xi="http://ljfbest.com" xs:schemaLocation="http://ljfbest.com ai.xsd"xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"><xi:书名>java</xi:书名><xi:作者><xi:fname>Jianfeng</xi:fname><xi:lname>Li</xi:lname></xi:作者><xi:售价>23.00</xi:售价></xi:书架>

2行:引入书架和的命名空间,并且指出xsd所在位置
3行:引入schemaLocation的命名空间

wsdl 文档介绍

WSDL 网络服务描述语言 (Web Services Description Language),使用 XML 编写的文档,可描述某个 Web service,它可规定服务的位置,以及此服务提供的操作(或方法)。WSDL文档只是一个Web Service相关特征、规范的定义集,在根部有一个“definitions"元素,其中包含一些定义。具体来说,服务使使用以下七个主要元素来定义的:

•Types - web service 使用的数据类型,一般使用XML Schema中的类型系统。
•Message - web service 使用的消息,每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。使用Types所定义的类型来定义整个消息的数据结构。

•PortType - 指明服务器接口,并且通过operation绑定in(参数)/out(返回值)消息,它可描述一个 web service可被执行的操作,以及相关的消息。
•Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
•Binding - 为每个端口定义消息格式和协议细节。
•Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
•Service - 相关服务访问点的集合。

看看下面的一段WSDL文件:

<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tns="http://service.ljfbest.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service.ljfbest.com/"name="MyServiceImplService"><types><xsd:schema><xsd:import namespace="http://service.ljfbest.com/"schemaLocation="http://localhost:8089/na?xsd=1" /></xsd:schema></types><message name="add"><part name="parameters" element="tns:add" /></message><message name="addResponse"><part name="parameters" element="tns:addResponse" /></message><portType name="IMyService"><operation name="add"><input message="tns:add" /><output message="tns:addResponse" /></operation></portType><binding name="MyServiceImplPortBinding" type="tns:IMyService"><soap:binding transport="http://schemas.xmlsoap.org/soap/http"style="document" /><operation name="add"><soap:operation soapAction="" /><input><soap:body use="literal" /></input><output><soap:body use="literal" /></output></operation></binding><service name="MyServiceImplService"><port name="MyServiceImplPort" binding="tns:MyServiceImplPortBinding"><soap:address location="http://localhost:8089/na" /></port></service></definitions>

xml文档第一句:definitions--WSDL文档的根元素,该元素的属性指明了wsdl文档的名称,文档的目标名字空间,以及WSDL文档应用的名字空间的速记定义。它指明了此Web Service的名称为:MyServiceImplService。然后找到名为“MyServiceImplService”的service具体定义如下所示:
<service name="MyServiceImplService">
<port name="MyServiceImplPort" binding="tns:MyServiceImplPortBinding">
<soap:address location="http://localhost:8089/na" />
</port>
</service>
service---相关port元素的集合,用户组织endpoint定义。
port--通过binding和物理地址定义的endpoint,这个元素将所有抽象定义聚集在一起
这部分是具体的Web服务的定义,在这个名为MyServiceImplService的Web服务中,提供了一个服务访问入口,访问地址是"http://localhost:8089/na",使用的消息模式是由前面的binding“MyServiceImplService”所定义的。这段xml定义的操作“add”使用的是SoapDocumentProtocol消息格式(style="document")。输入和输出参数格式都是“Literal”(use="literal")。

<portType name="IMyService">     

           <operation name="add">                 

                   <input message="tns:add" />

                   <output message="tns:addResponse" />
           </operation>
</portType>
portType---描述服务逻辑接口的operation元素的集合。IMyService只有一个操作add。这部分定义了服务访问点的调用模式的类型,表明 MyService的add入口类型是请求/响应模式,请求消息是add,而响应消息是addReponse。

<message name="add">
<part name="parameters" element="tns:add" />
</message>
<message name="addResponse">
<part name="parameters" element="tns:addResponse" />
</message>
这部分是消息格式的抽象定义,其中定义了两个消息格式:
•addResponse( 响应消息格式 ): 由一个消息片断组成,该消息片断的名字是parameters,包含的具体元素类型是addResponse。
•add( 请求消息格式 ) : 由一个消息片断组成,该消息片断的名字是parameters ,包含的具体元素类型是add。

<types>
<xsd:schema>
<xsd:import namespace="http://service.ljfbest.com/" schemaLocation="http://localhost:8089/na?xsd=1" />
</xsd:schema>
</types>
上面这部分是数据类型的定义,其中为定义了两个元素的结构:
•add(请求参数的类型): 将该元素定义为包含一个字符串元素(arg0)的复合类型元素。
•addResponse(响应参数的类型): 将该元素定义为包含一个字符串元素(return)的复合类型元素。
数据类型的详细消息在schemaLocation="http://localhost:8089/na?xsd=1 这个地址里,打开可以看到一个xsd文件:

<xs:schema xmlns:tns="http://service.ljfbest.com/"         xmlns:xs="http://www.w3.org/2001/XMLSchema"version="1.0" targetNamespace="http://service.ljfbest.com/"><xs:element name="add" type="tns:add" /><xs:element name="addResponse" type="tns:addResponse" /><xs:complexType name="add"><xs:sequence><xs:element name="arg0" type="xs:int" /><xs:element name="arg1" type="xs:int" /></xs:sequence></xs:complexType><xs:complexType name="addResponse"><xs:sequence><xs:element name="return" type="xs:int" /></xs:sequence></xs:complexType></xs:schema>

这表明add操作是一个 int add(int n)的方法。其中上述的类型均遵循xsd的定义。


原创粉丝点击