1.7 名称空间

1.7.1 名称空间的概念

因为 XML 标记可以由任何组织和个人自行定义,因此在不同的约束模式文档中,出现表示不同含义的相同标记名称是完全有可能的。例如,有一个约束模式文档中使用 <table> 表示桌子,而在另一个约束模式文档中使用 <table> 表示表格,如果要在一个 XML 文件中同时引用这两个约束模式文档,就会出现名称冲突的问题。XML 从两个方面来解决这种名称冲突的问题:

(1)使用名称空间这个概念来区分每个约束模式文档,每个约束模式文档被赋以一个唯一的名称空间,每个名称空间都用唯一的 URI(Uniform Resource Identifier,统一资源标识符)表示。

(2)在 XML 实例文档中为元素增加前缀部分,元素名称前增加的前缀名称代表该元素所属于的模式文档的名称空间,来自不同模式文档的元素前增加的前缀部分是不同的,应用程序通过前缀部分来判断一个元素来自于哪一个约束模式文档。

1.6.2节中 xmlbook.xsd 文件是一个 XML Schema 模式文档,但它本身也是一个 XML 格式的文档,它里面使用的各个元素名就是在另一个 XML Schema 模式文档中定义的,所以,xmlbook.xsd 文件中定义了一个前缀名来代表那个 XML Schema 模式文档的名称空间,并在每个元素前都加上这个前缀名。例如,在 xmlbook.xsd 文件的开始部分有如下两句内容:

<xs:schema xmlns:xs="http://wwww.w3.org/2001/XMLSchema">

<xs:element name='书架'>

......

上面的语句定义的 xs 前缀名来代表名称空间 "http://wwww.w3.org/2001/XMLSchema",schema和 element 元素前都增加了 xs 前缀来说明它们是来自 "http://wwww.w3.org/2001/XMLSchema" 名称空间所对应的模式文档中的词汇。

URI 比 URL(Uniform Resource Locator,统一资源定位符)表示的概念更大,它不仅限于描述 Internet 资源的地址,还包括数字对象标识符(DOI)和国际标准书号(ISBN)等标识名称。URI 更为注重资源而不太注重位置,从理论上说,URI 可以找出文档的镜像副本或是找出已经从一个站点移动到另一个站点的文档。URI 仍然处于进一步的研究之中,被当前的软件所唯一支持的一种 URI 就是 URL。将域名作为名称空间的 URI 的一部分,可以很好地避免各个组织发布的名称空间之间的冲突,实际上作为名称空间使用的 URI 基本上都符合 HTTP 的 URL 语法。所以,在一般情况下,可以简单地等同 URI 和 URL。在 XML 实例文档中引入名称空间,就是以 “前缀部分: 本地部分” 的形式作为元素或属性的完整名称,前缀部分是一个能唯一标识某个约束模式文档的 URI 的临时缩写,本地部分则是元素或属性在该名称空间内定义的名字。

制定 XML 名称空间标准的目的就是为了解决 XML 文档中的名称冲突问题。

1.7.2 名称空间的声明

名称空间声明就是在 XML 实例文档中为某个模式文档的名称空间指定一个临时的简写名称,这个简写名称将作为该名称空间的元素或属性的前缀名。名称空间声明与元素属性定义非常类似,可以位于任何一个元素的开始标记中,并且在一个元素中可以声明多个名称空间。

名称空间声明的基本格式为:xmlns:前缀名="URI",其中的前缀名称是名称空间的一个临时缩写,URI需要使用引号(单引号或双引号)引起来。

例子:xmlbook.xml

<?xml version="1.0" encoding="UTF-8"?>

<it315:书架 xmlns:it315="http://wwww.it315.org/xmlbook/schema">

  <it315:书>

    <it315:书名>JavaScript 网页开发</it315:书名>

    <it315:作者>张孝祥</it315:作者>

    <it315:售价>28.00元</it315:售价>

  </it315:书>

</it315:书架>

在上例中,xmlns:it315="http://wwww.it315.org/xmlbook/schema" 语句就是将前缀名 it315 关联到名称空间 "http://wwww.it315.org/xmlbook/schema" 上,it315 被作为多个元素名称的前缀部分,必须通过名称空间的声明将它关联到唯一标识某个名称空间的 URI 上。可见,名称空间的应用就是将一个前缀(如 it315)绑定到达标某个名称空间的 URI 上,然后将前缀添加到元素名称前面来说明该元素的领域范畴。

在任何元素中声明的名称空间,只对该元素及其中嵌套的所有子元素有效。一个名称空间声明可以作用到的那些元素和属性,就是该名称空间的作用域。如果在里层元素中声明的名称空间前缀与外层元素中声明的另一个名称空间的前缀名相同,那么在里层元素及其子孙元素范围内,该前缀名对应的是里层元素中声明的名称空间。从 <it315:书架 xmlns:it315="http://wwww.it315.org/xmlbook/schema"> 这条语句上可以看出,在声明名称空间的元素自身上也可以使用代表该名称空间的前缀。另外,这种用冒号(:)把前缀与本地部分进行分隔的名称,有一个专门的术语,即QName(Qualified Name,限定名),它表示被限定在某个名称空间中的名称。

1.7.3 默认名称空间

在名称空间的声明中也可以省略前缀部分,其格式为:xmlns="URI"。以这种方式声明的名称空间将作为其作用域内的所有元素的默认名称空间,即该作用域内的所有没有指定前缀部分的元素都属于这个名称空间。

虽然使用默认名称空间会减少一些书写工作量,而使用带前缀的非默认名称空间会增加一些书写工作量,但命名合理的前缀却可以为人们浏览 XML 文档提供便利,例如,book:title 很容易让人联想到 title 是 book 词汇表中定义的元素。

1.7.4 属性的名称空间

当在一个模式文档的词汇表中定义了某个元素及其属性,在 XML 实例文档中通常只需要将元素限定于该模式文档的名称空间中,而不需要将该元素的属性限定于名称空间中。例如下面的 XML 语句:

<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="http://example.com/std/defs" parse="xml" />

虽然 include 元素的 href 和 parse 属性也是在名称空间 "http://www.w3.org/2001/XInclude" 中定义的,但是,在 XML 实例文档中不用为它们指定名称空间,但是,这并不代表 href 和 parse 属性属于名称空间 "http://www.w3.org/2001/XInclude"(默认名称空间),而是不属于任何名称空间。处理程序必须对此做出正确的解释。

一个元素中可以包含另外一个名称空间中定义的属性,例如,<movie:title xml:lang="fr"> 语句中使用了一个不是来自 movie 名称空间的属性。如果属性名称中有一个前缀部分,该属性将被限定在该前缀所指定的名称空间中。如果属性名称中没有前缀部分,那么该属性就不属于任何名称空间。属性不受默认名称空间的影响,即使在一个没有前缀部分的属性出现之前已经指定默认名称空间,该属性也不属于默认名称空间,XML 建议书是使用下面的示例来说明这一点的。

<x xmlns="http://www.w3.org" xmlns:n1="http://www.w3.org">

  <good a="1" n1:a="2" />

</x>

因为 "http://www.w3.org/" 被声明成默认名称空间,且默认名称空间对没有前缀的元素起作用,所以 x 和 good 都属于 "http://www.w3.org/" 这一名称空间。由于 n1 指向了名称空间 "http://www.w3.org/",所以属性 n1:a 中的属性属于名称空间 "http://www.w3.org/",由于无前缀的 a 属性不属于任何名称空间,所以,在同一个元素中定义这两个 a 属性也不会发生冲突。

1.7.5 xml:space 和 xml:lang 属性

在 XML 的规范中,定义了两个内置的属性,即 xml:space 和 xml:lang。在每一个 XML 实例文档中,前缀名 “xml” 都已经隐式地绑定到了一个名称空间上,内置属性名称以 xml: 作为前缀,自定义的属性名不能以 xml: 作为前缀,否则在解析时将发生错误。

由于空格等字符在 XML 文件是有意义的,XML 解析程序会将它们一个个如实地交给下游程序去处理,xml:space 属性则是用于设置下游应用程序应该如何处理解析器传递的空格等字符。xml:space 是一个 Enumerated 类型的属性,它的设置值只能是 “default” 或 “perserve” :“default” 表示应用程序可以自行随意处理空格等字符;“preserve” 则表示应用程序应把空格等字符当做普通文本字符处理。如果没有设置 xml:space 属性,解析器默认采用 “default” 作为其设置值。下面的语句采用 xml:space 内置属性来明确告诉 XML 处理程序,把元素中的空格当做正式的普通字符与其他字符合并处理:

<网址 xml:space="preserve"> www.it315.org </网址>

xml:lang 属性用于设置元素的本地化语言信息,ISO-639 规范中规定了代表各个国家和地区的本地化语言的名称,例如 "en" 表示英文、"la" 表示拉丁文、"zh" 表示中文、"zh-CN" 表示中文(中国)、"zh-TW" 表示中文(中国台湾地区)。xml:lang 属性的默认值为 "en"。不同的国家地区不仅使用的文字互不相同,而且人们使用货币、时间、数字等的表现格式也各不相同,例如:在美国要表示一个日期类型的属性,它采用的语句如下:

<product release-date="8/18/2018" />

而在中国,相应的语句应采用如下形式:

<product release-date="2018-08-18" />

如果 XML 文档的处理程序把 “2018-08-18” 当做了美国的日期来解析,也就是按 “月月/日日/年年年年” 的格式来解析,那将无法得到正确的结果。所以,对于 XML 文档的处理程序来说,它必须知道应将 "8/18/2018" 和 "2018-08-18" 这样的文本串当做哪个国家或地区的日期来解析。xml:lang 属性正是用于解决这种国际化的问题,以帮助 XML 文档支持国际化的应用。只要将上面的语句修改成如下形式:

<product xml:lang="zh-CN" release-date="2018-08-18" />

XML 文档的处理程序就知道应该将 "2018-08-18" 这个字符串当做中国的一个日期来解析,也就是按 “年年年年-月月-日日” 的格式来解析,它就可以得到 2008 年 8 月 18 日的正确结果。

如果在某个元素中设置了 xml:space 和 xml:lang 属性,那么,嵌套在该元素中的子孙元素都将沿袭其设置结果。如果在子孙元素重新设置 xml:space 和 xml:lang 属性,那么在子孙元素的范围内采用它们自己的设置结果。

====== 以上内容来源于 张孝祥老师的《深入体验Java Web开发内幕 》,记录下来,只作为个人读书笔记。===========

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值