【WebService】第二章、XML文件命名空间以及约束

本章主要介绍一下XML文件的命名空间,为以后学习WebService打下基础。

1、疯狂XML讲义中对XML文档的分类。

      1. 格式不良好(malformed)的XML文档。例如:完全没有遵守XML规则,乱写!标签不成对,反正不是个正经的XML文档。

      2. 格式良好(well-formed)但无效的XML文档。例如:格式完全正确,但是缺少DTD或者Scheam语意约束。可以随便添加元素。

      3. 有效(valid)的XML文档。例如:格式正确,并且拥有完整的语意约束是个正经的XML文档。

2、命名空间的介绍

      这里并不详细介绍DTD与Scheam,只要求能够读懂XML文档即可。如果感兴趣推荐《疯狂XML讲义》,可以看一看的。

     下面将贴出一个常见的XML文档,主要讲解下XML中的各个要素。为以后看WSDL提供前置技能。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-3.0.xsd">
                     
  <context:annotation-config/>

  <bean id="idName" class="com.ztesoft.some.ClassName" />
  
</beans>

      一个XML文档只有一个根节点,上面的文档是Spring中的一部分配置。在XML文件中首先根节点beans上引入了XML的约束Scheam。

在这里面有两个需要注意的地方:命名空间,前缀(别名)。

      为了说明为什么要有命名空间,这里举个生活中的例子。

      假如你是研发部的员工,你们部门有个人叫张伟。你和他玩的特别好,天天中午你都会说,张伟我们吃饭去。就这样日子过得挺

平淡的,终于到了过年的时候了,公司开年会,到了抽奖环节的时候这个叫张伟的运气特别好中了一等奖。主持人说,恭喜张伟获得

本次年会一等奖,有请张伟上台领奖!突然站起来2个人。卧槽,当时主持人就懵B了。然后主持人很机智的说,你们猜猜是哪个部门

的张伟?研发部?销售部?最终原来闹了一个笑话,是销售部的。再见

      例如下面这份文档,也能够说明一个问题

<?xml version="1.0" encoding="UTF-8"?>
<年会 >
	<抽奖>
		<一等奖>
			<名称>张伟</名称>
			<名称>苹果</名称>
		</一等奖>
	</抽奖>
</年会>

      在这个文档中,一等奖下面有两个名称元素。你能够一眼看出来,张伟是人名,苹果是奖品。但是计算机却不认识啊。我们需要添加

修饰词语,并且修饰词是唯一的。在这里能够确定唯一元素的描述,叫命名空间。也就是说,这个元素属于哪个空间内的。例如java中的

包名,就是一种命名空间。因为你写个类叫StringUtils,别人也可以写那个。难道不会冲突吗,所以添加命名空间用来表示这是属于哪个

空间内的就没问题了。所以修改后的就是:

<?xml version="1.0" encoding="UTF-8"?>
<年会 xmlns="参与年会抽奖的员工"
      xmlns:奖品="年会抽奖奖品">
	<抽奖>
		<一等奖>
			<名称>张伟</名称>
			<奖品:名称>苹果</奖品:名称>
		</一等奖>
	</抽奖>
</年会>

      例如上面我们会特别指定名称是属于哪个空间下的。上面的年会抽奖奖品就是命名空间,可是它太长了,我们就给他起一个短点的

名字叫奖品。一般来说别名是随意的。上面参与年会抽奖员工却不用添加,这是因为他默认的是空。不写表示是属于员工范围内的名称。

      下面看上面Spring中的配置文件的详细说明:

      xmlns :表示xml的nameSpaces 也就是xml命名空间。

      xmlns:context :这里引入了一个命名空间,并且给他起了一个短的名字叫context。想用这个空间内的元素就添加这个前缀说明下。

      xsi:schemaLocation:这里的schemaLocation元素在默认范围和context范围内都没有。所以引入他,也就是xmlns:xsi="xxxx“那里

引入的。然后我使用了那个范围的元素。schemaLocation这个是干嘛的呢?你只说明了命名空间,这没用的。他找不到约束他

的xsd(schema)在哪里,所以这个schemaLocation用来说明,这个命名空间的约束文件在哪里。这个空间的又在哪里。这样

我们就可以找到文件了。具体语法就是先写命名空间,在写对应的文件地址。你会发现schemaLocation奇数行都在上面的

xmlns:xxx里面出现过,偶数行都是xxxxxx.xsd表示文件位置。

      annotation-config:这个元素是context范围的,所以添加了前缀表示他属于哪个里面的。

      bean:这个元素属于默认空间内的。所以不写没问题。

3、schema的介绍

      上面介绍了XML文档,并且多次提到了约束他的东西schema。其实你可以把xml看做是java的实例,而schema则是定义的类。

      下面贴一份schema的案例,就用wsdl来说明。

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tns="http://WebXml.com.cn/"
	xmlns:s="http://www.w3.org/2001/XMLSchema" 
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	targetNamespace="http://WebXml.com.cn/"	>
	<wsdl:types>
		<s:schema elementFormDefault="qualified" >
			<s:element name="string" nillable="true" type="s:string" />
		</s:schema>
	</wsdl:types>
</wsdl:definitions>

      上面就是一份简单的Schema文档,对比Spring的配置文件你发现差不多。其实Schema也是一个xml文件。所以他也需要约束,

引入的约束就是第三行xmlns:s="http://www.w3.org/2001/XMLSchema" 所以你会发现下面第七行用到了里面的元素,前面就添加

了别名。以及wsdl也是的。这里你会发现他没有schemaLocation,以及多出了一个元素targetNamespace。

      targetNamespace:目标命名空间,这是一个schema。这个文件写好以后别的实例文件会引用的。引用的时候需要写

xmlns:xxx="XXXXX"。所以需要定义说明下如果你想用这个文件,你就用这个命名空间就好了。所以这里的值需要唯一在第二行

有xmlns:tns 意思就是说,如果我在这个文件中定义了一个新元素,下面要用到了就可以使用tns:xxx这种形式说明下。如果你写

直接xxx元素名,他就认为是默认命名空间的。

4、特别说明

      一般来说为了确定命名空间的唯一性,我们都使用公司网站域名。因为域名是唯一的,所以自然就是唯一的了。

所以你看到的命名空间都是网址形式。而java类里面的包则是域名的倒写,如果正着写一开始就不在一个包下了。

你可能感兴趣的:(xml,文档)