您的位置:寻梦网首页编程乐园XML 编程XML技术讲座
XML 编程

XML技术讲座之六

XML中的命名空间

XML命名空间并不是XML1.0标准的一部分,而是一个被称为"Namespace in XML"的独立标准。W3C组织于1998年2月提出XML命名空间标准的第一个草案,直到1999年1月14日才正式发布为推荐标准。

一、 XML命名空间的由来

简单说来,制定XML命名空间标准的初衷是为了解决XML文档中命名的冲突问 题。那么何为命名冲突问题呢?请看下面这个例子。

假设我们已有两个XML文档,"学生.xml"和"老师.xml",如下所示:

<?xml version ="1.0" encoding = "GB2312"?>
<学生>
<姓名>李明</姓名>
<班级>三年级二班</班级>
<住址>135楼210室</住址>
</学生>

<?xml version ="1.0" encoding = "GB2312"?>
<教师>
<姓名>李华</姓名>
<住址>432楼133室</住址>
<电话>(021)32566178</电话>
</教师>

下面我们希望把这两个XML文档的内容结合成一个新的XML文档--"新学生.xml",新XML文档如下所示:

<?xml version ="1.0" encoding = "GB2312"?>
<学生>
<姓名>李明</姓名>
<班级>三年级二班</班级>
<住址>135楼210室</住址>
<班主任>
<教师>
<姓名>李华</姓名>
<住址>432楼133室</住址>
<电话>(021)32566178</电话>
</教师>
</班主任>
</学生>

在这个新XML文档--"新学生.xml"中即出现了命名冲突的问题。"学生"元素的"姓名"子元素,其语义是"学生的姓名",而"教师"元素的"姓名"子元素的语义是"班主任教师的姓名"。"住址"的元素名也有同样的命名冲突问题。

解决命名冲突问题的一个直接的方法是,给重名的元素或属性重新命名。例如将上例中"教师"的"姓名"元素改为"教师姓名",然而这不是一种长期解决问题办法。在XML的实际应用中,人们常常为不同行业和领域用XML制定不同的语言标准,比如电子商务、远程教育、电子书都分别用XML制定了语言标准,然后针对不同的语言编写不同的模块化处理程序。通过重用现存的语言标准和处理程序,人们可以很快地定义出新的语言标准和处理程序。假如我们通过重新命名的方法解决名称冲突问题,那么我们将面临着,针对原名称开发的应用程序不可再利用的危险。

解决名称冲突的一个比较好的解决方案是,给不同的语言赋以不同的名称空间,应用程序通过名称空间来区分一个元素到底来自于那一个语言。XML命名空间就是对这种方案的具体实现。

二、 XML命名空间的定义

XML命名空间解决命名冲突问题采用的方法是所谓"两段式命名法",其中第一段是代表特定命名空间的"命名空间前缀",第二段是元素或属性原来的名字,两段之间用冒号":"分开。用XML命名空间重写后的"新学生.xml"文档如下:

<?xml version ="1.0" encoding = "GB2312"?>
<学生:学生 xmlns:学生 = http://www.xml.net.cn/学生
xmlns:班主任 = http://www.xml.net.cn/班主任>
<学生:姓名>李明</学生:姓名>
<学生:班级>三年级二班</学生:班级>
<学生:住址>135楼210室</学生:住址>
<学生:班主任>
<班主任:教师>
<班主任:姓名>李华</班主任:姓名>
<班主任:住址>432楼133室</班主任:住址>
<班主任:电话>(021)32566178</班主任:电话>
</班主任:教师>
</学生:班主任>
</学生:学生>

修改后的"新学生.xml"文档中,"姓名"和"住址"元素的名称前增加了"学生"和"班主任"这样的前缀,因此不再冲突。下面我们就对XML命名空间的定义作一说明。

XML命名空间的定义由命名空间的声明、"合法名称"的定义及应用、命名空间的作用域三部分组成。

(1) XML命名空间的声明

XML命名空间的声明是通过保留属性"xmlns"来实现的。上例中的

<学生:学生 xmlns:学生 = http://www.xml.net.cn/学生
xmlns:班主任 = http://www.xml.net.cn/班主任>

就是命名空间声明。

命名空间声明有两种方式,即直接定义方式和缺省定义方式:

直接定义方式:    xmlns: [命名空间前缀] = [命名空间名]

缺省定义方式:    xmlns = [命名空间名]

命名空间声明中,等号右边的属性值部分是一个URI(Uniform Resource Identifier统一资源标识符)引用,其功能是区分不同的命名空间。因此,这个URI引用被称为命名空间名,它应该具有唯一性和持久性。虽然该属性值使用了URI,但其目的并不是要直接得到一个schema或DTD,主要的目的在于标识特定的命名空间。

命名空间声明中,等号左边的属性名部分,如果有用冒号":"分隔开的"命名空间前缀",就是直接定义方式,其中"命名空间前缀"是一个合法的XML名称。没有"命名空间前缀"的命名空间声明,就是缺省的命名空间声明。

命名空间声明将"命名空间名"与"命名空间前缀"绑定在一起。

(2) "合法名称"的定义和应用

在定义了命名空间的声明以后,对如何引用<命名空间前缀>构成新的元素名和属性名,需要再作进一步的统一规范,这就是所谓"合法名称"定义的由来。

"合法名称"由用西文冒号":"分开的前缀部分和本地部分组成,其中前缀部分和本地部分都是一个合法的XML名称。如:"班主任:姓名"。

"合法名称"的前缀部分,规定必须是一个"命名空间前缀",且这个命名空间前缀必须已经经过命名空间声明声明过,语法分析器会自动将其与声明中的URI引用相联系。冒号后的部分是该命名空间中定义的元素或属性名,提供了"合法名称"的本地部分。在用缺省方式声明命名空间时,由于"命名空间前缀"为空,因此,这时的"合法名称"只剩下本地部分。"新学生.xml"文档中,"http://www.xml.net.cn/学生"命名空间改为缺省命名空间后,如下所示:

<?xml version ="1.0" encoding = "GB2312"?>
<学生 xmlns = http://www.xml.net.cn/学生
xmlns:班主任 = http://www.xml.net.cn/班主任>
<姓名>李明</姓名>
<班级>三年级二班</班级>
<住址>135楼210室</住址>
<班主任>
<班主任:教师>
<班主任:姓名>李华</班主任:姓名>
<班主任:住址>432楼133室</班主任:住址>
<班主任:电话>(021)32566178</班主任:电话>
</班主任:教师>
</班主任>
</学生>

"合法名称"的应用主要有三种情况:

  • 用于起始元素标记、结束元素标记和空元素标记。如前面例子所示。
  • 用于属性的定义。
    例如:
    <?xml version ="1.0" encoding = "GB2312"?>
    <学生:学生 xmlns:学生 = http://www.xml.net.cn/学生>
    <学生:姓名>李明</学生:姓名>
    <学生:班级 学生:数字类型 = "中文">三年级二班</学生:班级>
    <学生:住址 学生:数字类型 = "阿拉伯">135楼210室</学生:住址>
    </学生:学生>
  • 用于DTD中的元素名和属性类型。
    例如:
    <?xml version="1.0" encoding="GB2312"?>
    <!ELEMENT 学生:学生 (学生:姓名, 学生:班级,学生:住址)>
    <!ATTLIST 学生:学生 xmlns:学生
    CDATA #FIXED "http://www.xml.net.cn/学生">
    <!ELEMENT 学生:姓名 (#PCDATA)>
    <!ELEMENT 学生:班级 (#PCDATA)>
    <!ELEMENT 学生:住址 (#PCDATA)>

(3) 命名空间的作用域

所谓命名空间的作用域范围是指,一个命名空间声明可以作用到哪些元素和属性。一般可以认为命名空间声明,能够作用到说明它的元素和该元素的所有内容元素,除非被其他命名空间声明所覆盖。再一次修改"新学生.xml"文档,将"http://www.xml.net.cn/班主任"命名空间移到"教师"元素中,如下所示:

<?xml version ="1.0" encoding = "GB2312"?>
<学生 xmlns = http://www.xml.net.cn/学生>
<姓名>李明</姓名>
<班级>三年级二班</班级>
<住址>135楼210室</住址>
<班主任>
<班主任:教师 xmlns:班主任 = http://www.xml.net.cn/班主任>
<班主任:姓名>李华</班主任:姓名>
<班主任:住址>432楼133室</班主任:住址>
<班主任:电话>(021)32566178</班主任:电话>
</班主任:教师>
</班主任>
</学生>

缺省命名空间"http://www.xml.net.cn/学生"的作用域在"教师"元素以外的地方,而"http://www.xml.net.cn/班主任"命名空间的作用域在"教师"元素内,包括"教师"元素本身。

与XML命名空间相关的主要概念,讨论到这里基本上可以结束了。由于篇幅的关系,与XML命名空间相关的一些曾经引起争论的问题,如"命名空间与DTD",就不在这里讨论了。XML命名空间已经在XSLT、Xlink等标准中得到应用,它已经成为XML标准家族不可或缺的一员。

来源:网络世界