2.1 XML命名空间概述

XML命名空间是由国际化资源标识符(IRI)标识的XML元素和属性的集合,该集合通常称作XML“词汇”。随着XML在因特网上应用的日益广泛,能够创建可组合和重用的标记词汇表(方法类似于软件模块的组合和重用)变得日益重要。如果已经存在一个定义完善的标记词汇表,用于描述硬币集合、程序配置文件或快餐店的菜单,则重用它会比从头设计一个更有意义。但是,在同一个文档中,来自不同词汇表的同一个标记(特别是XML元素和属性)可能具有不同的语义,这最终会产生标记冲突问题。XML的高度可扩展性以及它在因特网上的广泛应用,排除了应用指定保留的元素或属性名称作为解决此冲突问题的解决方案。W3C XML命名空间建议旨在创建一个机制,以便XML文档中来自不同标记词汇表的元素和属性可以被明确标识和组合,而无须处理命名所产生的问题。XML命名空间建议提供了一种方法,即基于处理要求对XML文档中的各个项目进行分区,而无须针对应当如何命名这些项目去设置过多的限制。简而言之,定义XML命名空间的主要动机之一就是在使用和重用多个词汇时避免名称冲突。想象如下的情景,你将你公司的所有员工信息存储在XML文档中,同时你想在该XML文档中为每位员工添加一段HTML格式的履历。基础的XML文档如下所示。

employees-base.xml
<?xml version="1.0" encode="UTF-8"?>
<employees>
 <employee id="001">
  <firstName>Joe</firstName>
  <lastName>Fawcett</lastName>
  <title>Mr</title>
  <dateOfBirth>1962-11-19</dateOfBirth>
  <dateOfHire>2005-12-05</dateOfHire>
  <position>Head of Software Development</position>
  <biography><!-- biography here --></biography>
 </employee>
 <!-- more employee elements can be added here-->
</employees>

该文档没有使用命名空间,它仍然能正常工作。现在,假设你要使用XHTML格式为每个员工添加履历(这是使用命名空间的绝佳机会),但首先,来看看没有声明任何的命名空间的文档(如下所示),会产生什么问题。

employees-with-bio.xml
<?xml version="1.0" encode="UTF-8" ?>
<employees>
 <employee id="001">
  <firstName>Joe</firstName>
  <lastName>Fawcett</lastName>
  <title>Mr</title>
  <dateOfBirth>1962-11-19</dateOfBirth>
  <dateOfHire>2005-12-05</dateOfHire>
  <position>Head of Software Development</position>
  <biography>
   <html>
   <head>
    <title>Joe's Biography</title>
   </head>
   <body>
    <p>After graduating from the University of Life
    Joe moved into software development,
    originally working with COBOL on mainframes in the 1980s.</p>
   </body>
   </html>
  </biography>
 </employee>
 <!-- more employee elements -->
</employees>

由于文档没有采用命名空间,因而文档中的两个<title>元素就存在一个冲突:两个<title>元素表示了两个不同的功能,一个表示员工的职位,另一个表示员工履历的标题。如果是人阅读的话不会有任何问题,但如果是软件程序来读取文档,要想获得每个<title>元素的准确值,不对文档做出修改会是相当困难的。有两种方法可用于解决这个问题,一是把两组信息——员工数据和履历资料——放入两个不同的命名空间;二是为员工的职位使用不同的元素名称。既然你设计基本的XML格式,并决定了元素的名称,你绝对有权使用这种方法,但是,你在履历部分所使用的元素是XHTML标准的一部分,所以不能随意去改变它的<title>元素而用其他的名称代替<title>元素。因此,第二种方法虽较为简单,但是存在局限性。这也是为何在XML文档中广泛采用命名空间,即第一种方法的原因。通常需要命名空间的主要原因是用户并非总是使用完全在自己的系统内部运作的XML格式。XML的一个主要目的就是跨系统、跨机构共享数据,用户会用到大量来自外部系统的XML格式,无法保证XML文档中的所有的元素和属性的名字都是独一无二的,来自外部的XML文档可能具有相同的名称。所以,在使用这些文档的某些阶段,需要用到命名空间。