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>]]>
转义字符<等
要约束一个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元素,不可以含有其他元件或属性定义简明元素的语法为:
<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的定义。