君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

为何引入名称空间?

XML的用途不是单一的。虽然读者可能看到编写只使用一个标记符号集的文档是相当 有用的。

但是,问题是,当混杂和匹配不同的XML应用程序的标记时,可能会发现同一个标记 已用于两个不同对象。TITLE是指页标题还是书的标题?ADDRESS是指公司的邮件地 址还是Web站点管理人员的电子邮件地址?名称空间(namespace)可以解决这些诸 如此类的问题,它是将URI与各标记集相关联,并在每个元素前加上一个前缀,以表 示它属于哪个标记集。于是,就可以有BOOK:TITLE和HTML:TITLE两个元素或 POSTAL:ADDRESS和HTML:ADDRESS元素,而不只一类TITLE或ADDRESS。

名称空间允许文档中的每个元素和特性放在不同的命名域中。

 

URI和URL

XML文档可用于Web,正如HTML和其他文档一样。使用时,也如HTML文档一样, 被统一资源定位符(Uniform Resource Locator,简写为URL)所引用。虽 然URL已被人们广泛理解并被广泛支持,但XML规范使用的是更为通用的统一资 源标识符(Uniform Resource Identifier,简写为URI)。URI对于定位 Internet上的资源是更为通用的架构,更为注重资源而不太注重位置。理论上 说,URI可找出镜像文档的最为近似的副本或是找出已经从一个站点移动到另一 站点的文档。实际上,URI仍然处于进一步的研究之中,被当前的软件所唯一支 持的一种URI正是URL。

 

用xmlns声明名称空间

这个一个声明名称空间的例子

xmlns:xsl="http://www.w3.org/TR/WD-xsl"

 

"http://www.w3.org/TR/WD-xsl"是一个URI引用。

URI为统一资源标识符(Uniform Resource Identifier,简写为URI)。 URI对于定位Internet上的资源是更为通用的架构,更为注重资源而不太注重 位置。不过当前的软件所唯一支持的一种URI正是URL。要注意的是这里用URI 只是为了声明一个唯一的名称空间,并不是真的上www.w3.org的网站去寻找 这个链接。

xsl表明以后如果用到以xsl为前缀的名字,那么它所表示的规则是在名称空间里 预先定义好的,如“xsl:value-of”在"http://www.w3.org/TR/WD-xsl"这 个名称空间预置的,它的意义是求值。

 

合法名称

合法名称的形式应该是:前缀部分:本地部分

其中,“前缀部分”和“本地部分”都要求是一个合法的XML名称。前缀部分必须 是一个已经经过声明的名称空间前缀,语法分析器将把它与名称空间声明中的 URI引用相联系;本地部分则是在DTD或Schema中定义的元素和属性名。下面 给出一个合法名称的例子:

企业经理:姓名

 

此外,由于名称空间的声明方式有直接方式和缺省方式两种,合法名称也稍有 变化。缺省的声明方式为 xmlns=URI。

由于缺省方式声明的名称空间就是作用域内的缺省名称空间,因此,在这个作 用域内使用该名称空间的元素、属性的合法名称无须再写前缀部分。这样一来, 元素的合法名称看上去和我们前面常用的元素名是一致的。由此可见,我们一直 在使用“合法名称”,只不过没有意识到罢了。

 

名称空间作用于元素

合法名称可以用于起始元素标记、结束元素标记和空元素标记。合法名称中的前缀 部分必须是一个已经声明过的名称空间前缀,声明的位置,既可以在使用该前缀的 起始元素的标记处,也可以是引用处的父辈元素标记处。名称空间声明是作用到说 明它的元素和该元素的所有子元素的,除非被其它名称空间声明所覆盖 
例如:

<联系人:联系人列表 xmlns:联系人 ="联系人列表.dtd">
	  <联系人:联系人>
		<联系人:姓名>张三</联系人:姓名>
		<联系人:ID>001</联系人:ID>
		<联系人:公司>A公司</联系人:公司>
		<联系人:EMAIL>zhang@aaa.com</联系人:EMAIL>
		<联系人:电话>(010)62345678</联系人:电话>
		<联系人:地址>
		  <联系人:街道>五街1234号</联系人:街道>
		  <联系人:城市>北京市</联系人:城市>
		  <联系人:省份>北京</联系人:省份>
		</联系人:地址>
		<联系人:直接上级 xmlns:企业经理 ="企业经理.dtd">
		  <企业经理:姓名>王五</企业经理:姓名>
		  <企业经理:电话>
			<企业经理:秘书电话>(010)62345678</企业经理:秘书电话>
			<企业经理:手机>13601234567</企业经理:手机>
		  </企业经理:电话>
		</联系人:直接上级>
	  </联系人:联系人>
	</联系人:联系人列表> 

 

名称空间"联系人列表.dtd"的作用域,在除"直接上级"元素范围以外的任何地方; 而名称空间"企业经理.dtd"的作用域在"直接上级"的各个子元素中。 同样,缺省的名称空间是作用到声明它的元素和该元素的子元素的。当然,这里所 说的元素都是那些没有名称空间前缀的元素,有了前缀的元素仍然遵照前缀所指示 的名称空间。

 

名称空间作用于属性

同样,合法名称也可用于属性。除了XML预留的属性(如我们反复用到的声明命名 空间的属性)外,其它属性都应该使用"合法名称"。

一个具体的例子如下:

<联系人 xmlns:企业经理 = "http://www.xml.net.cn/联系人列表.dtd">
	  <姓名 企业经理:文种 = "中文">李华</姓名>
	  <电话 企业经理:城市 = "北京">62348765</电话>
</联系人> 



关于作者

IBM has authored this article

posted on 2013-05-15 18:32  刺猬的温驯  阅读(135)  评论(0编辑  收藏  举报