4.6.3 XML的命名空间
XML是一种自定义的标记语言,在XML文档中使用的标签可以自己定义。不同行业或者不同企业在定义标签名时,可能会使用同样的标签名来标注不同的数据内容。例如,“模型”这个词,在数学领域中的含义是“数学模型”,而在机械领域中的含义是“产品模子”。这势必会造成理解和处理上的混乱,为了解决这个问题,XML中引入了命名空间的概念。
命名空间(Namespace)是W3C推荐标准提供的一种统一命名XML文档中的元素和属性的机制。它通过给元素或属性加上命名空间,可以唯一地标识一个元素或属性,从而避免名称相同带来的问题。
以下是一个存在名称冲突的XML文档,其中描述了图书信息。
【例4-30】存在名称冲突的XML文档示例。
上面的例子都使用了两次title标签,但一个的含义是“书名”,而另一个的含义是“头衔”,它们同时出现在一个XML文档中,势必会造成理解上的混乱,为了区分这两个不同的标签,可以通过为标签名指定命名空间的办法来区分。
命名空间可以分为有前缀的命名空间和无前缀的命名空间。有前缀的命名空间声明语法如下:
xmlns:前缀名=命名空间名称
声明语句以元素属性的形式出现在元素的开始标签中。xmlns:前缀名是属性名,命名空间名称是属性值。其中xmlns是命名空间声明的关键字,前缀名是自定义的标识符,用于指代命名空间名称。W3C推荐使用URI作为命名空间的名称,但这里的URI不一定是一个真实的资源地址,不会被解析器用来查找信息,它唯一的用途是赋予该命名空间一个唯一的标识。
如果有一个标签中声明了有前缀的命名空间,则隶属于该命名空间的标签和子孙标签,均需在标签名前引用前缀名。
【例4-31】有前缀的命名空间使用示例。
从例子中的p:author xmlns:a=http://www.w3school.com.cn/person可以看出,在p:author的开始标签中声明了有前缀的命名空间,http://www.w3school.com.cn/person是该命名空间的标识,由前缀p代表。
注意这个例子跟前面的例子相比,在标签名前面都加上了前缀b或p,以区分“书名”和“头衔”,而这里的前缀b和p代表了不同的命名空间,隶属于这两个不同的命名空间的title的含义是不一样的。
有前缀的命名空间需要为每一个元素设置前缀名,对于一个长文档来说,操作会比较烦琐。通常可以将文档中使用较多的命名空间指定为默认名字空间,由此产生了无前缀的命名空间。
无前缀的命名空间声明语法如下:
xmlns=命名空间名称
若一个标签声明了无前缀的命名空间,则该标签及其无前缀的子孙标签都默认隶属于这个命名空间。使用默认命名空间时不需要在标签名前显式地引用命名空间标识符。
【例4-32】无前缀的命名空间使用示例。
该例子中所有不带前缀的标签,都是使用了命名空间“http://www.w3school.com.cn/book”。这种写法省去了大量书写前缀的烦琐工作,简化了文档。