在为soap寻觅表述要领时,这个规范的制定者们其实有很多种挑选。但他们终究挑选了尽量应用现有的手艺,把必要的新术语数目压缩到起码。为了形貌soap信息的内容,这些作者们挑选了xml言语。它的全称是“extensible Markup Language”,可扩大标记言语。
xml言语包含的功用异常多,比soap用到或许须要用到的要多的多。比方说,在soap 规范v1.1的第三节“与xml言语的关联”部份有说“在soap音讯中不得包含文档范例申明(Document Type Declaration, DTD)”。在soap音讯中不得包含处置惩罚指令(Processing Instructions)。就soap采用的xml言语规范的有关内容来看,它定义的是soap功用的运用要领。我们很快就可以体会到这一决议的贤明的地方:由于开发人员在运用soap的时刻不须要具有全功用的xml语法剖析器,所以用soap来完成某个解决方案的事情很轻易举行。为了明白soap,我们先要弄懂以下几个观点:
1.一致资本标识符(Uniform Resource Identifiers, 简称URI)。
2.xml言语基础。
3.xml花样定义。
4.xml名字空间。
5.xml属性。
1.1 一致资本标识符
为了接见因特网上某个举世无双的资本项目,必需晓得怎样从浩瀚的对象中把它标识出来。一致资本形貌符(URI)就是给各个资本起的名字。URI的花样:
<schema>:<schema-specific-part>
schema-specific-part部份往往还包含一些斜线字符(/),这些斜线字符示意的是途径中的条理构造。
1.1.1 一致资本定位器(URL)
人人最为熟习的URI要算是一致资本定位器(Uniform Resource Locator, URL)了,他就是我么平常所说的URL所在。URL所在也要恪守URI标识符的所在示意要领。
URL所在中的schema-specific-part部份花样是如许的:
//<user>:<password>@<host>:<port>/<url-path>
上述语法中各组成元素的寄义以下所示:
1.user:目的所在处的用户名(可选项)。
2.password:分配给用户user的暗码(可选项)。
3.host:某个收集主机的因特网协定所在或完全域名(必选项)。
4.port:用来竖立衔接时运用的端口号。大部份协定都有默许的端口号,比方http在缺省时将运用80端口举行通讯(可选项)。
5.url-path:接见某个特定资本的细致途径。紧跟在主机名或端口号背面的斜线字符(/)不是url-path的组成部份。
1.1.2 一致资本名字(URN)
与无处不在的url所在比拟,大多数web用户对一致资本名字(Uniform Resource Name, URN)的熟习水平要差很多。URN与URL的差别的地方在于前者不会被剖析成一个举世无双的物理所在。URN是一种永久性的资本标识符(不像URL所在那样会有一些动态的途径信息),他们许可来自某个名字空间的其他范例标识符被映射到URN空间里来。因而,URN的语法供应了应用现有的种种协定对字符数据举行剖析和编码的才能。URN的组成划定规矩也恪守URI的通用性划定,它的罕见花样以下:
<URN>::=”urn:”<NID>”:”<NSS>
在URN名字里要用字符串”urn:”来示意这是一个URN名字。NID是”Namespace ID”的缩写,NSS是”Namespace-Specific String”的缩写,给出的是与NID代表的名字空间有关的字符串。在碰到URN名字的时刻,我们要依据NID的值来决议怎样诠释NSS字符串。在读取或运用URN名字的时刻,要记着前导字符串”urn:”以及<NID>内容里的字母是分大小写的。
URL和URN是URI两种最罕见的用法。背面我们还会看到URI的别的一种用法:xml Namespace(xml定名空间)。
1.2 xml基础
xml言语是在1996-1997年间进入人们视线的。下面是xml代码示例:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactId>framework</artifactId> <groupId>com.**.framework</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> </project>
纵然你从没渡过xml程序代码,这个例子也不是很难明。我们可以经由过程这段代码看出xml文档的一些编写划定规矩。
(1)第一行是一条处置惩罚指令,作用是声明这份文档运用的xml版本和编码花样,文档中的这条语句并不是不可或缺,但最好照样把它加载内里。
(2)xml文档必需有一个关闭元素(版本信息不能算作是一个关闭元素)。在例子中project把全部文档包含在了它的肇端标记和完毕标记之间。它还有几个子元素,子元素又可以嵌套定义。
(3)这段代码中的一切单词都不是xml的关键字。
(4)注重文档里标记不要拼错了。纵然拼错了,xml语法剖析器也会接收这份文档,但它不会正确剖析你的企图了。假如我们想让xml语法剖析器为我们做一些搜检事情,而且只读取正确的数据构造,那可以加上一个文档范例申明(Document Type Declaration, DTD)或许一个xml纲要(xml schema)。这里不就DTD举行议论了,soap手艺规范的第三小节也已明确划定“在soap信息中不得包含文档范例声明”。
1.3 xml纲要
xml纲要(xml schema)比DTD的形貌才能更强。这两种事物都供应了对一个xml元素的构造举行定义的要领。虽然花样定义和DTD都许可对元素举行定义,但只要花样定义许可给出数据的范例信息。xml数据是基于文本的,它会用字符”4”而不是”0100”如许的二进制情势来示意数字4(xml许可在信息中对二进制数据举行编码,如许使我们可以把图象数据等内容夹在一条xml信息里发送出去)。
下面给出实例,感觉下纲要优于DTD的现实。
一个简朴的DTD有一些包含其他元素或字符数据的元素。最简朴的元素声明是如许的:给出元素的名字,再把元素的内容定义为字符数据。以下所示:
<! ELEMENT element-name (#PCDATA)>
一个元素可以由其他元素组合而成。假如一个元素不多不少只包含有某个给定元素的一个实例,我们就如许定义:
<! ELEMENT parentElement (childElement)> <! ELEMENT childElement (#PCDATA)>
假如parentElement元素中能够包含零个或多个childElement元素,我们就用一个星号(*)来定义,以下:
<! ELEMENT parentElement (childElement *)> <! ELEMENT childElement (#PCDATA)>
别的,还可以在一个DTD里指导出元素的组合状况,比方parentElement元素里包含有两种差别数据片断的状况,以下所示:
<! ELEMENT parentElement (childElement1, childElement2)> <! ELEMENT childElement1 (#PCDATA)> <! ELEMENT childElement2 (#PCDATA)>
详细示例,比方图书馆里有很多书,书又有书名,作者,版权等属性,那定义的DTD文件Library.dtd可所以:
<! ELEMENT Library (Book*)> <! ELEMENT Book (Title, Author*, Copyright)> <! ELEMENT Title (#PCDATA)> <! ELEMENT Author (#PCDATA)> <! ELEMENT Copyright (#PCDATA)>
Library是由零个或多个Book范例的元素组成的。每一个Book又是由一个Title元素,零个或多个Author范例的元素和一个Copyright元素组成。Title,Author和Copyright这三种元素都包含着字符数据。我们运用这个DTD来搜检xml内容,可以定义xml文档:
<?xml version=”1.0”?> <!DOCTYPE Library PUBLIC “.” “Library.dtd”> <Library> <Book> <Title>Green Eggs</Title> <Author>Dr.Seuss</Author> <Copyright>1957</Copyright> </Book> <Book> <Title>Windows</Title> <Author>Scott</Author> <Copyright>2000</Copyright> </Book> </Library>
语法剖析器在须要对数据的范例举行搜检时会自动加载Library.dtd,并依据它对文档的内容举行搜检。如许做的优点是不言而喻的,但假如我们还能在“这个元素包含着字符数据”之外给出更多的信息岂不是更好?由于种种来由,W3C终究宣布了关于xml纲要的发起稿。下面用xml纲要重写适才的DTD文档:
<Schema xmlns:xsd =”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”> <complexType name=”Book” content=”mixed”> <element type=”Title”></element> <element type=”Author”></element> <element type=”Copyright”></element> </complexType> <simpleType name=”Title” content=”textOnly” xsi:type=”string”></simpleType> <simpleType name=”Author” content=”textOnly” xsi:type=”string”></simpleType> <simpleType name=”Copyright” content=”textOnly” xsi:type=”integer”></simpleType> </Schema>
把上面这段代码存为一个xml文件(平常是xsd后缀)。在运用纲要的时刻,只需简朴地在文档里援用就好了,像下面:
<myLibrary:Library xmlns:myLibrary=”x-schema:http://www.scottseely.com/LibrarySchema.xml”> <myLibrary:Book> <myLibrary:Title>Green Eggs</ myLibrary:Title > <myLibrary:Author>Dr.seuss</ myLibrary:Author > < myLibrary:Copyright>1957</ myLibrary:Copyright> </myLibrary:Book> … </myLibrary:Library>
纲要和文档都运用了文本“text”。这个字符串的作用是关照语法剖析器此文档里运用的变量名属于给定URI指定的名字空间。假如URI以x-schema打头,语法剖析器就必需从指定所在加载响应的纲要文件。假如没有其他申明,带有xmlns声明的肇端标记及对应的完毕标记之间的一切元素都是指定的名字空间的一部份。
1.3.1 数据特征
为了更好地对数据举行定义和范例校验,xml纲要运用了“数据特征(facets)”来定义某个特定的数据范例的特征。一个数据值域空间的每一个特征都必需用一个数据特征来定义。而一个“数据值域空间”就是一个给定的数据范例的全部有用数据值的鸠合。差别的数据范例是经由过程他们各自的数据特征来辨别的。xml纲要文档定义的数据特征又分为两大类:基础特征和非基础特征。
一个基础特征就是某个数据值域空间里的数据值的一个笼统特征,他给出了这类数据值的一个基础特性。数据值的基础特征包含:
1.相称
2.递次
3.边境
4.势。这是一个鸠合论的观点。有些值域空间里的值在数目上是有限的,而一些则是无穷的。
5.数值
6.长度,最小长度,最大长度
7.式样
8.罗列
9.最大内边境,最大外边境,最小内边境,最大内边境
10.经度
11.数值局限
12.编码体式格局
13.持续时间
14.周期
1.3.2 数据范例
xml花样定义把数据范例和数据特征结合起来,这就使在花样定义中定义的数据项有了正确的寄义。www.w3.org/2001/XMLSchema中定义了很多数据范例。
1.4 xml定名空间
在上面已见过xml定名空间(xml namespaces)的用法了。定名空间的作用简朴说来就是对用在一段上下文里的一组变量名举行定义和声明。名字空间可以运用恣意URN,但前提条件是这个URN必需是举世无双的。
1.5 xml属性
出现在这本书里的一切xml文档都运用了元夙来示意数据。但人人应当晓得xml也支撑属性观点。元素必需有肇端标记和完毕标记,属性则差别,他们不须要标记,只要把他们放到元素的肇端标记里就好了。
对属性举行声明有三种差别的方法:
1.经心编写的xml,但不包含任何DTD或纲要
2.经心编写的xml,运用一个DTD
3.经心编写的xml,运用一个或很多个纲要。
第一种方法能一般运转,但有用环境中结果并不好,而soap又制止运用DTD,所以我们就说下第三种要领吧。在xml纲要建立属性的时刻,须要运用attributeType和attribute这两个关键字。这两个关键字只在纲要所属的名字空间里有意义。attributeType用来定义某个范例的特征,而attribute则指出该元素范例定义所针对的对象。
为了运用属性对book举行形貌,响应的纲要应当是下面这个模样:
<Schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”> <attributeType name=”title” xsi:type=”string” /> <attributeType name=”name” xsi:type=”string” /> <complexType name=”Author” content=”empty”> <attribute type=”name” /> <element type=”Author”> </complexType> </Schema>
attributeType的完全语法以下:
<attributeType default=”default value” xsi:type=”type” xsi:values=”enumerated values” name=”idref” required=”{yes|no}” >
default:属性的默许值。
xsi:type:该属性的数据范例。假如挑选的是罗列范例,还要天上xsi:value。
name:属性范例的名字。为了对attributeType举行范例搜检,必需有一个名字。
required:表明一个包含有attributeType的元素是不是必需带有此处定义的属性。
以上就是细致引见soap相干的xml学问的细致内容,更多请关注ki4网别的相干文章!