XML 和 HTML 的根本区别在于:HTML 中的各种标记是已经定义好的、固定的,而 XML 的标记是自定义的、可扩充的。在大型而复杂的 XML 文档中,很可能会出现标记名称相同,然而其所代表的元素意义却各不相同的现象。尤其是将多个 XML 文档组合使用时,出现这种标记名混乱的现象几乎是不可避免的。
一个命名空间通常是和一个特定的 DTD 对应起来的,某个 DTD 中定义的元素名称集合就是其对应的命名空间中的元素名称集合。在 XML 文档中,对于不同命名空间的区分非常简单,即对于每一套特定应用的 DTD,赋予它一个独一无二的标识符来代表,如果在文档中使用某个 DTD 中定义的元素,就将该 DTD 的标识符作为元素名或属性名的前导符,这就相当于指明了这些元素的标记名称来自什么地方,或者说归属于哪个命名空间。
由于是通过在元素的标记名前添加一个独特的标识符来表明该标记的归属,因而这个标识符在 XML 文档中应该是唯一的。当然,每一个命名空间本身也应该是唯一的。在 XML 规范中,对命名空间的定义采用了一种相当巧妙的方法,即采用 Web 上某个唯一的 URI 来定义不同的命名空间。这个 URI 可以是 URL,也可以是 URN,并将其与某个特定的命名空间标识符对应起来。
定义命名空间
命名空间通过给标识名加一个网址(URL)定位的方法来区分这些名称相同的标识。命名空间的定义一般放在元素的开始标记处,其使用的语法格式:
<标记名 xmlns:标识符="URI">
对上面代码中各名词的含义说明如下:
- “标记名”是用户要在其中定义命名空间的某个元素标记的名称。
- “xmlns”是定义命名空间时所使用的固定词语,与其后面的标识符之间必须有冒号分割。
- “标识符”是用户为命名空间定义的对应标识名称,此名称在文档中应该是唯一的,而且不能含有冒号。
- “URI”即统一资源标识符,通常是这个命名空间的元素在 Web 上所归属的文档的 URL 或 URN。
需要注意的是,命名空间的标识符不允许使用 xml、html、xsl、xmlns 等保留字。此外,定义语句中的 URI 通常只起一个标识的作用,并不是真的要从该网络资源得到什么,所以它的精确性并不重要,甚至根本就不存在。
示例:
<?xml version="1.0" encoding="GB2312"?> <Films xmlns:films="http:www.bb.com" xmlns:director="http:www.dd.com"> <Film> <films:NAME>钢铁侠</films:NAME> <director:NAME>沙恩•布莱克</firector:NAME> <Starring>小罗伯特•唐尼</Starring> </Film> </Films>
默认命名空间
在实际编程的过程中,对于一个很长的 XML 文档来说,如果需要为文档中的每一个元素都添加命名空间标识将会是一个很麻烦的事,所以,可以将文档中使用较多的命名空间定义为默认命名空间,并设法使这个默认命名空间与某个元素及其子元素相关联。这样的话,在 XML 文档中为某个元素定义了默认命名空间后,该元素及其所有未加命名空间标识符的子元素都归属于这个默认命名空间,除非它们另外拥有指定的命名空间标识符。
默认命名空间也是在元素的起始标记内进行定义的,与定义一般命名空间不同的是,默认命名空间的定义不使用标识符,具体的定义语法格式如下:
<标记名 xmlns="URI">
示例:
<?xml version="1.0" encoding="GB2312"?> <Films xmlns="http:www.bb.com" xmlns:director="http:www.dd.com"> <Film> <NAME>钢铁侠</NAME> <director:NAME>沙恩•布莱克</firector:NAME> <Starring>小罗伯特•唐尼</Starring> </Film> </Films>
一个默认命名空间的作用范围仅限于定义这个命名空间的元素,及其子元素。需要指出的是,定义默认命名空间之后,可以作用到有关的元素,但无法作用到元素所包含的属性。换句话说,对元素的属性来说是不存在默认命名空间的。
本文节选自:《XML 实用教程》 陈作聪、苏静、王龙等编著