无废话XML阅读笔记(二)

无废话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串连一样,并非声明过一次,就不能再用了.值不过后面的声明会覆盖前面同名的声明.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值