1、准备知识
- XML命名空间
XML命名空间为防止xml元素命名冲突提供了解决方案。
- 命名冲突
对于一个XML文件,它的元素名称是由开发者定义的。当合并不同应用的XML文档时经常会导致命名冲突。
下面的XML代码一段HTML表格信息:
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
下面的XML表示一张桌子的信息:
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
如果把这两段XML合并起来,就会发生命名冲突。都含有一个<table>元素,但是格子的内容和含义不同。
XML解析器不知道如何处理这些差异。
- 使用前缀解决命名冲突
使用名称前缀可以很容易的避免命名冲突。
下面的XML表示一个HTML表格和一个家具的信息:
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
上面的例子中不存在冲突,因为两个<table>元素有不同的名字。
- XML命名空间-xmlns属性
在XML中使用前缀时时,必需定义命名空间。
通过在元素的开头放置xmlns属性来定义命名空间。
定义命名空间的语法:xmlns:prefix="URI"。
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3schools.com/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
上面的例子中,<table>标签中的xmlns属性赋予前缀h:和f:一个命名空间。
当一个元素定义了命名空间之后,所有具有相同前缀的子元素都和相同的命名空间关联。
命名空间可以在XML根元素处定义。
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Note: 解析器在查找信息的时候不会使用命名空间的URI。作用只是给命名空间一个独特的名字。
- 默认命名空间
为元素定义一个默认的命名空间,可以应用到所有的子元素上。语法如下:
下面的XML表示一个HMTL表格信息:
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
下面的XML表示家具信息:
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
- 命名空间的实际应用
XSLT是一种XML语言,它可以把XML文档翻译成其他的格式,比如HTML。
在下面的XSLT标签中,你会发现大部分标签都是HTML标签。
不是HMTL的标签都有xsl前缀,通过命名空间xmlns:xsl="http://www.w3.org/1999/XSL/Transform"标识:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr>
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
2、WSDL
WSDL是一个基于XML的语言,它用来描述Web Service以及如何访问这些Web Service。
WSDL的作用
- WSDL 全称是Web Services Description Language
- WSDL 是用XML写的
- WSDL 是一个XML文档
- WSDL 用来描述Web Service
- WSDL 也用来定位Web Servcie
- WSDL 是W3C 推荐使用
WSDL文档使用下面几个主要的元素来描述Web Service:
Element | Description |
---|---|
<types> | A container for data type definitions used by the web service |
<message> | A typed definition of the data being communicated |
<portType> | A set of operations supported by one or more endpoints |
<binding> | A protocol and data format specification for a particular port type |
WSDL文档的主要结构:
<types>
data type definitions........
</types>
<message>
definition of the data being communicated....
</message>
<portType>
set of operations......
</portType>
<binding>
protocol and data format specification....
</binding>
</definitions>
WSDL文档可以包含其他元素,比如扩展元素、以及服务元素(集合几个Web Service定义在一个WSDL文档中)。
WSDL Ports
<protType>是WSDL中最重要的元素。它可以比喻成传统编程语言中的一个函数库(或者一个模块,一个类)。<protType>元素用来一个一个Web Service、可以执行的操作,以及包含的message.
WSDL Messages
<message>元素定义了一个操作的数据。每个message可以包含一个或者多个parts。parts可以比如成传统编程语言中的函数形参。
WSDL Types
<types>元素定义了Web Service使用的数据类型。为了最大的平台无关性,WSDL使用XML Schema语法定义数据类型。
WSDL Bindings
<binding>元素为每个port type定义了message格式和协议。
一个请求-响应操作:
<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>
<binding type="glossaryTerms" name="b1">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation>
<soap:operation soapAction="http://example.com/getTerm"/>
<input><soap:body use="literal"/></input>
<output><soap:body use="literal"/></output>
</operation>
</binding>
binding 有两个属性 - name和type。
name属性(可以任意起名)定义binding的名字,type属性指定绑定的端口(端口的概念在这里就是一个web service)。
soap:binding 有两个属性 - style和transport。
style属性可以是”rpc"或者“document”;transport属性定义了使用的SOAP协议,例子中我们使用HTTP。
operation 元素定义了protType暴露的每个操作。SOAP action定义的每个操作,必需指定如何加密input和output。例子中我们使用“literal”。
WSDL Example
下面是一个简单的WSDL文档片段:
<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>
上例中, <portType>元素定义了"glossaryTeams"作为一个port的名字,并且定义了"getTerm"作为一个operation的名字。"getTerm" operation包含一个叫”getTermRequest"的input message和一个叫“getTermResponse"的output message。
<message>元素定义定义了每个消息的parts,以及关联的数据类型。
和传统编程相比,glossaryTerms是一个函数库,”getTerm"是一个函数(getTermRequest作为输入参数,getTermResponse作为输出参数)。