无废话XML阅读笔记(二)
2008年6月6日
四. 名称空间(命名空间)
名称空间[命名空间](namespace)的概念,对XML非常重要,如果少了它,XML的应用范围会大大的受到限制.命名空间的规定,并没有收录再XML1.0的标准中,而透过后来的一份单独的标准增补的,这份标准的全名叫"NameSpaces in XML".
1.为什么需要命名空间.
假设我们有个XML的电子通讯录,专门用来存放客户的资料,记载平日往来的公司客户.
<客户名单>
<!-- 客户甲 -->
<客户>
<名称>新香发</名称>
<地址>******</地址>
<电话>******</电话>
</客户>
<!-- 客户乙 -->
<客户>
...
</客户>
</客户名单>
不过有些客户是业务专员带进来的,通常在和这些客户的联系方面,都是透过各种负责的业务专员.至于业务专员的联系电话,等详细记录在公司的另一份XML文件--[职工名单]中.
<职工名单>
<职工>
<姓名>职工甲</姓名>
<部门>业务部</部门>
<电话>******</电话>
</职工>
<职工>
...
</职工>
</职工名单>
为了联系方便,我们想在<客户名单>中,增加一项<联系人>,用来存放业务专员的资料,这样我们要联系由专员来负责的客户时,便可以马上知道该找那个专员,打那个电话.至于业务专员的联系资料,则可以直接从<职工名单>中提取;换句话说,就是把<职员名单>中的部分资料,和<客户名单>结合在一起.就像这样:
<客户名单>
<!-- 客户甲 -->
<客户>
<名称>新香发</名称>
<地址>******</地址>
<电话>******</电话>
<业务员>
<姓名>XXX</姓名>
<电话>***</电话>
</业务员>
</客户>
<!-- 客户乙 -->
<客户>
...
</客户>
</客户名单>
这样的话,"电话:这个元素重复使用了,在这种情况下,我们需要的是一套简单名了的办法,让机器在处理的时候,不用大伤脑筋.即使没有任何名称上的冲突,我们仍旧需要一个简单的办法,让电脑知道,那些元素来自于那个语汇,以便使用该语汇的DTD来确认文件结构的正确性.
命名空间的设计,就再这样的北京下应运而生.它的概念非常直接--如果每套XML语汇,都各自用一个独一无二的标识来代表,并且在使用时,把这个标志和语汇中的元素,属性名连在一块使用,就绝对不会和其他的语汇扯不清了,因为每个语汇中的名称,都已经被该语汇的独特的标识码给修饰,限定(qualify)住了.一个独特的标识码,代表一套语汇;各语汇中的名称,因而能各得其所,有自己的活动空间.[命名空间]的命名也就由此而来.
2.命名空间的长相.
(1). 标示物:XML采用了一个聪明,简便的方法来制定命名空间--用网址来代表命名空间.
(2). URL/URN/URI别搞迷糊了.
我们惯称的"网址",大致上是相当于URL.其实命名空间的规定中的是URI.URI的全名叫Uniform Resource Identifier(统一资源标识码),这是一个Internet标准.至于一般人较为熟知的URL全名叫Uniform Resource Locator(统一资源定位码).基本上URI比较广义,泛指所有以字符串标示的网络资源,范围涵盖了URL和URN.URL指的是标有通信协定的(如 Http/Ftp/Gopher)的字符串.URN(Uniform Resource Name)则通常用来标示持久,而且有专责机构的资源.
3. 命名空间实例.
<?xml version="1.0" encoding="UTF-8"?>
<k:客户名单 xmlns:k="http://foo.bar.com/xml/customer.dtd"
xmlns:职工="http://foo.bar.com/xml/employee.dtd">
<k:客户>
<k:名称>新香发</k:名称>
<k:地址>******</k:地址>
<k:电话>******</k:电话>
<k:联系人>
<职工:名称>XXX</职工:名称>
<职工:电话>***</职工:电话>
</k:联系人>
</k:客户>
<客户 xmlns="http://foo.bar.com/xml/customer.dtd">
<名称>新香发</名称>
<地址>******</地址>
<电话>******</电话>
<联系人>
<职工:名称>XXX</职工:名称>
<职工:电话>***</职工:电话>
</联系人>
</客户>
</k:客户名单>
3. 命名空间的声明.
(1). 前置字符串.命名空间的原理是[独特的标识码+名称].XML选用URI来做独特的标示,但是一般URI一般都很长,使用起来是不是太长了点?对于这个XML命名空间标准中提出了一个叫"前置字符串(namespace prefix)",来解决这个问题,前置字符串(namespace)值能是含有XML标准中允许做属性名的字符(包括英文字符和所有收录再Unicode中的汉字).还有XML标准把所有以"xml"这三个字母开头的前置字符串保留作为特殊用途,所以使用者自订的前置串不许用这三个字母来起头.事实上,XML软件在处理文件之前,会先将所有前置字符串还原成他们所代表的URI.
那前置字符串和它所代表的名称空间,要透过什么样的声明方式,才能把他们关联在一起呢?这得透过一种特别的属性来达成.这类属性的属性名一律以"xmlns:前置字符串"的形式出现,而属性值则正是该前置字符串所要代表的名称空间,也就是一个URI,属性名中的xmlns和前置字符串间,必须以英文的冒号(:)相连.因为冒号已经被选做分隔记号,有特殊的功用,所以前置字符串中不可以再用冒号.
例子:
<?xml version="1.0" encoding="UTF-8"?>
<某元素 xmlns:keona="http://www.keona.com.cn/xml/namespace">
...
</某元素>
4. 命名空间的范畴(Scope).
命名空间也是先声明后使用的.!
5. 预设的命名空间.
XML命名空有预设(default)的概念.没有冠上前置字符串和冒号的元素,属性名一律视为在预设的命名空间底下.预设的命名空间,都会被认作是属于该空间的.预设的名称空间,可以在文件中变来变去,就像一个前置字符串在一份文件中,可以先后和不同的URI串连一样,并非声明过一次,就不能再用了.值不过后面的声明会覆盖前面同名的声明.
无废话XML阅读笔记(二)
最新推荐文章于 2024-08-15 09:46:02 发布