XML文档可以创建自定义的元素和属性词汇来描述数据。当XML文档较为复杂或是需要从别的地方取得内容时,一个文档中有可能会需要不止一个词汇,这样就会产生名称相同而含义不同的元素出现在不同词汇中的情况。
例如,如果需要建立一个含有XHTML信息的家具目录:
在这个XML文档中,同样名为<table>的两个元素却有着完全不同的含义。
命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再将该前缀应用于XML文档中的元素上:
虽然有一些惯例可以遵循,但这里选择的前缀并不理想。在上个例子中,第一个前缀cat表示的是目录项。你同样可以将之称为dog或catalog。第二个前缀xhtml表示的是文档中的XHTML元素。这是一个符合命名空间惯例的例子。
命名空间使用统一资源定位符(URI)来识别每个词汇。在上面包含XHTML内容的例子中,URI是由W3C控制的,因为它控制着XHTML标准。你也可以将cat前缀置于自己的控制之下。
值得注意的是,URI并不一定需要指向一个实际的文档或目录。对它仅有的要求就是,在XML文档中它必须是唯一的。然而很多处理程序,包括XML模式、XHTML和XSLT处理程序,都使用URI来注明它们必须处理文档的某一部分。因此,对于这些应用程序需要使用正确的URI。
在http://www.w3.org/TR/REC-xml-names/中可以找到W3C关于“XML中的命名空间(Namespaces in XML)”的推荐标准。
2.1.1 在XML文档中加入命名空间
为了引用一个命名空间,可以将其以属性的形式加入任何包含了属于该命名空间中元素的节点中。命名空间经常加在文档元素中,因为它包含了所有其他的元素。在上面的XML文档中,最开始的元素可改写为如下形式:
这决定了命名空间cat指向URI http://www.apress.com/ns/furniture。命名空间cat可置于任何元素名字前,并以冒号分开:
2.1.2 添加默认命名空间
一个XML文档的大部分通常都属于一个XML词汇。在这种情况下,可以定义一个默认的命名空间,而不是为每个元素重复地添加命名空间前缀。可以使用xmlns关键字来定义默认的命名空间。这样,就不用为默认命名空间内的元素指定前缀了。
例如,可以将catalog指定为默认命名空间:
现在这是默认的命名空间了,因而就不必再在此命名空间内的元素名前加上前缀了。
可以在文档中的任何位置声明默认命名空间。被声明的默认命名空间适用于包含了声明的元素及其所有子元素,而且会覆盖此前所做的声明。
下面的XML文档演示了如何使用多个默认命名空间:
默认的catalog命名空间适用于除了包含于第二个<table>元素内的所有元素。因为加入了命名空间声明,下面元素默认的就是XHTML命名空间:
关于命名空间的最后一点是关于它们使用的属性。默认情况下,属性与它包含的元素属于同一个命名空间中。除非你使用的是不同于其包含元素的其他命名空间中定义的属性,否则就不必进行验证。
在关于如何使用DTD和XML模式定义XML词汇的内容中,将会进一步说明命名空间的重要性。
例如,如果需要建立一个含有XHTML信息的家具目录:
在这个XML文档中,同样名为<table>的两个元素却有着完全不同的含义。
命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再将该前缀应用于XML文档中的元素上:
虽然有一些惯例可以遵循,但这里选择的前缀并不理想。在上个例子中,第一个前缀cat表示的是目录项。你同样可以将之称为dog或catalog。第二个前缀xhtml表示的是文档中的XHTML元素。这是一个符合命名空间惯例的例子。
命名空间使用统一资源定位符(URI)来识别每个词汇。在上面包含XHTML内容的例子中,URI是由W3C控制的,因为它控制着XHTML标准。你也可以将cat前缀置于自己的控制之下。
值得注意的是,URI并不一定需要指向一个实际的文档或目录。对它仅有的要求就是,在XML文档中它必须是唯一的。然而很多处理程序,包括XML模式、XHTML和XSLT处理程序,都使用URI来注明它们必须处理文档的某一部分。因此,对于这些应用程序需要使用正确的URI。
在http://www.w3.org/TR/REC-xml-names/中可以找到W3C关于“XML中的命名空间(Namespaces in XML)”的推荐标准。
2.1.1 在XML文档中加入命名空间
为了引用一个命名空间,可以将其以属性的形式加入任何包含了属于该命名空间中元素的节点中。命名空间经常加在文档元素中,因为它包含了所有其他的元素。在上面的XML文档中,最开始的元素可改写为如下形式:
这决定了命名空间cat指向URI http://www.apress.com/ns/furniture。命名空间cat可置于任何元素名字前,并以冒号分开:
2.1.2 添加默认命名空间
一个XML文档的大部分通常都属于一个XML词汇。在这种情况下,可以定义一个默认的命名空间,而不是为每个元素重复地添加命名空间前缀。可以使用xmlns关键字来定义默认的命名空间。这样,就不用为默认命名空间内的元素指定前缀了。
例如,可以将catalog指定为默认命名空间:
现在这是默认的命名空间了,因而就不必再在此命名空间内的元素名前加上前缀了。
可以在文档中的任何位置声明默认命名空间。被声明的默认命名空间适用于包含了声明的元素及其所有子元素,而且会覆盖此前所做的声明。
下面的XML文档演示了如何使用多个默认命名空间:
默认的catalog命名空间适用于除了包含于第二个<table>元素内的所有元素。因为加入了命名空间声明,下面元素默认的就是XHTML命名空间:
关于命名空间的最后一点是关于它们使用的属性。默认情况下,属性与它包含的元素属于同一个命名空间中。除非你使用的是不同于其包含元素的其他命名空间中定义的属性,否则就不必进行验证。
在关于如何使用DTD和XML模式定义XML词汇的内容中,将会进一步说明命名空间的重要性。