本章主要介绍一下XML文件的命名空间,为以后学习WebService打下基础。
1. 格式不良好(malformed)的XML文档。例如:完全没有遵守XML规则,乱写!标签不成对,反正不是个正经的XML文档。
2. 格式良好(well-formed)但无效的XML文档。例如:格式完全正确,但是缺少DTD或者Scheam语意约束。可以随便添加元素。
3. 有效(valid)的XML文档。例如:格式正确,并且拥有完整的语意约束是个正经的XML文档。
这里并不详细介绍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:这个元素属于默认空间内的。所以不写没问题。
上面介绍了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元素名,他就认为是默认命名空间的。
一般来说为了确定命名空间的唯一性,我们都使用公司网站域名。因为域名是唯一的,所以自然就是唯一的了。
所以你看到的命名空间都是网址形式。而java类里面的包则是域名的倒写,如果正着写一开始就不在一个包下了。