微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml/schema/wsdl

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的定义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类