第五章 XML名称空间
在XML中,命名一个元素的名称在一定程度上来说是很随意的,每个人都会按照一定的习惯方式来命名一个元素,那么就会存在一个问题,两个人不约而同的使用相同的名称XX来命名了各自定义的元素,如果他们的XML文档不存在交流时,问题是不会发生的,但是,一旦他们各自的文档结合到一起了,问题随之产生,究竟XX指的是谁定义的元素呢?解决这类问题的方法就是引入名称空间,在同名的元素前面指定是属于哪一个名称空间,以此来详细区分不同的元素,特别是随着互联网的快速发展、越来越多的数据需要通过网络传递,或者整合不同来源的数据,这些数据存在重名的可能性非常高,因此使用名称空间也就显得尤为必要了。
5.1 XML名称空间简介
XML名称空间是W3C于1998年2月提出的,刚开始是一个草案,直到1999年1月14日才正式发布为推荐标准,它是XML标准的补充部分。2004年2月4号又推出了1.1版本作为推荐标准。
名称空间通过使用统一资源标识(URI)来限定元素和属性,从而保证任何一篇XML文档中使用到的名字不发生重复。
下面给出一个使用名称空间的例子来开始熟悉名称空间的使用。 程序5-1-1
文件5-1-1.xml
1,2,3 4,5,6 7,8,9 10,11,12
149
本例默认的名称空间是http://year.xsd,对于season元素,它所属的名称空间是http://season.xsd,这个名称空间对应的前缀名是season,而month元素的名称空间是http://month.xsd,这两个字符串都不是严格意义上的URI,它对应的前缀是mon。这个例子仅是给出一个名称空间的初步印象,关于名称空间具体的使用,会在下面再进一步叙述。
5.2 名称空间的声明
在XML中,声明一个名称空间是使用关键字“xmlns”来声明的,它是一个属性。声明一个名称空间有两种方法,直接声明和默认声明。直接声明需要指定声明名称空间的前缀,而默认声明就是没有指定名称空间的前缀,是用这种方式声明的名称空间又称为默认名称空间。在名称空间声明语句中,通过“:”连接在xmlns关键字后面的部分就是名称空间的前缀。
直接声明的语法格式:xmlns:名称空间前缀=”名称空间名”。
默认声明的语法格式:xmlns=”名称空间名”
需要注意的是名称空间的前缀名一般不使用xml的任意大小写组合,因为它作为保留前缀以适应XML发展需要,名称空间名一般为URI,以保证名称空间的全球唯一性,但是它并不会导致对这个资源的访问,而只是为了确保唯一性,比如很多例子的名称空间用到了http://www.w3.org/2001/XMLSchema这个名称,但是实际上例子并不会访问W3C的这个文件。名称空间前缀代表名称空间,通过将前缀与元素、属性相结合来达到区别元素、属性的效果,比如设定名称空间http:// www.w3.org/2001/XMLSchema的前缀为xsd,则xsd与http:// www.w3.org/2001/XMLSchema是等价的,当XML处理器遇到xsd:element时,就会将它等价为http:// www.w3.org/2001/XMLSchema:element。
一个使用的名称空间的合法名称须由“:”将前缀和元素、属性名分隔,并且两边的名称都要是一个合法的XML名称,如果一个名称空间是默认名称空间,则可以省略掉前缀部分而只剩下元素、属性名称。一个合法名称最主要应用于三种情况:
第一种是用于起始、结束元素标记和空元素标记。例如:
第二种是用于属性,例如:
第三种是用于DTD,例如:
150
在DTD中使用名称空间时要注意是使用被应用名称空间的元属的属性声明的方式来声明名称空间,这个语句:
就是声明了sean是一个在名称空间前缀为sea下的元素,注意属性限制一定要是#FIXED的。
下面给出两个应用名称空间的XML例子,第一个是使用DTD作为文档类型声明,第二个则使用schema。
例5-2-1:
首先是使用DTD定义的文件格式。 程序5-2-1
文件5-2-1.dtd
CDATA #FIXED "http://season/sea">
接着是对应的是用该dtd文档的XML文档。
程序5-2-1
文件5-2-1a.xml
1,2,3 4,5,6 7,8,9 10,11,12
接下来是使用schema定义文档结构的方法。它与DTD是等效的。
程序5-2-1
文件5-2-1.xsd
targetNamespace="http://season/sea"
elementFormDefault="qualified">
151
最后是使用这个schema的XML文档。
程序5-2-1
文件5-2-1b.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://season/sea 5-2-1.xsd">
1,2,3 4,5,6 7,8,9 10,11,12
这个例子给出了声明名称空间的方法示例,使用DTD和schema都是可以进行名称空间声明的。
5.3 名称空间的作用范围
一个名称空间具有一定的作用范围,在名称空间范围内的元素和属性才能使用名称空间极其前缀,不在名称空间、或者属于另外一个名称空间的元素和属性是不受该名称空间约束的。
例如:
1,2,3 4,5,6 7,8,9 10,11,12 152
365
这一段文档,season是位于名称空间http://season.xsd之下的,它受到该名称空间的约束,而month是位于名称空间http://month.xsd之下,它不同于season的名称空间,因此sea名称空间是约束不到month的,反过来mon名称空间对于元素season也不具备约束力。
名称空间也有可能被覆盖,当一个名称空间中又包含了其他名称空间的声明时就会发生这种情况。此时内部的名称空间就会覆盖外部的名称空间,上面的代码中声明了一个默认名称空间http://year.xsd,它作用于year的全部内容,但是由于season和month声明了各自的名称空间,因此发生了名称空间被覆盖的现象,season和month不再属于默认名称空间,而是属于各自声明的名称空间。但是day元素没有再声明名称空间,因此它的名称空间就是默认名称空间,与year的名称空间是一致的。关于名称空间的作用范围实际上是比较复杂的,它需要结合默认名称空间是否定义、元素属性的elementFormDefault和attributeFormDefault的取值才能做出精确的判断。
因此一定要注意名称空间的作用范围,一定要在名称空间的作用域内使用名称空间,脱离了作用范围而谈名称空间是没有任何实际意义的。
5.4 schema中的名称空间
一般在schema中经常会用到名称空间,并且schema与名称空间的结合也比DTD更为灵活,因此在这里有必要再进一步讲述。
一个schema文档要应用名称空间,就需要在声明schema根元素的时候同时给出属性targetnamespace的值。没有targetnamespace值的声明是对应于不使用名称空间的XML文档。
例如文档:
这是一个没有使用名称空间的schema,相应的如果要在XML文档中应用这个schema文档就需要指出schmea文档是没有名称空间的,这可以通过在文档元素中使用noNamespaceSchemaLocation属性来实现。比如:
xsi:noNamespaceSchemaLocation="Untitled1.xsd">
365
153
这个文档就是一个没有应用名称空间的文档。
相反的,如果要指定名称空间,就一定需要指定targetnamespace属性的值,否则如果不指定targetnamespace的值又使用名称空间是不能通过有效性验证的。比如下面的文档就是一个使用名称空间的schema:
targetNamespace="http://year.net" xmlns="http://year.net">
这个schema通过将targetnamespace的值指定为http://year.net的方式从而将目标名称空间的值定为http://year.net,此后这个schema声明的元素和属性,在没有重新声明名称空间的情况下——也即是不发生覆盖的情况下都属于这个名称空间。相应的如果要在XML文档中使用这种具备目标名称空间的schema,则需要指定schemaLocation属性值,并且属性值中的名称空间需要与schema中指定的targetnamespace属性值中的名称空间一致,否则也是无效的。schemaLocation属性值的形式必须是:名称空间URI空格schema文档位置。比如上面的schema对应的XML文档就是:
365
此外针对元素和属性究竟属于哪一个名称空间也有一定的规定。
在一个XML schema中,通过elementFormDefault属性来指示schema中声明的元素或类型属于哪一个名称空间。一个schema声明的元素或者类型只能属于两个名称空间的其中一个,这两个名称空间分别是目标名称空间和非目标名称空间,非目标名称空间有可能是一个无名名称空间——即它是一个名字为空的名称空间,注意无名名称空间不同于默认名称空间。
如果elementFormDefault=”qualified”,则全局元素与类型属于目标名称空间,全局元素的子元素以缺省的方式属于目标名称空间,也即全局元素的子元素默认是属于目标名称空间的。如果elementFormDefault=”unqualified”,则所有全局元素的子元素以缺省的方式属于无名名称空间。
类似的,属性的名称空间也遵循这种方式来指定属性所属的名称空间,指定属性的名称空间使用attributeFormDefault属性,它的取值也是qualified和unqualified。
elementFormDefault具有一定的作用范围,它可以被继承,但是它也可以被覆盖,子元素中它的取值会覆盖父元素指定的值。
我们通过几个例子来说明elementFormDefault的作用效果。
例5-4-1:这是指定elementFormDefault为qualified的例子。
154
程序5-4-1
文件5-4-1.xsd
targetNamespace="qu"
这种方式下,全局元素属于目标名称空间也即targetNamespace 的值qu,而局部元素以缺省方式属于qu,,所以child1和child2也都属于qu名称空间。接下来是对应的XML文档。
程序5-4-1
文件5-4-1.xml
100
qualified
我们在XML文档中设定默认名称空间为qu名称空间,由于root、child1和child2都属于qu名称空间,又是默认名称空间,因此不需要添加前缀,如果此时还有其他名称空间,则需要在属于其他名称空间的元素添加前缀,以此区别不同的名称空间的元素。
例5-4-2:这是指定elementFormDefault为unqualified的例子。
程序5-4-2
文件5-4-2.xsd
targetNamespace="qu" elementFormDefault="unqualified" >
155 elementFormDefault="qualified" attributeFormDefault="unqualified">
这种方式下,全局元素属于目标名称空间qu,而局部元素以缺省方式属于无名名称空间,所以child1和child2也都不属于qu名称空间。接下来是对应的XML文档。 程序5-4-2
文件5-4-2a.xml
xmlns:n="qu" xmlns:xsi="http://www.w3.org/2001/ XMLSchema-instance" xsi:schemaLocation="qu 5-4-2.xsd"> 100 unqualified
这是不使用默认名称空间的方式,这种方式下,root所属的名称空间与child1和child2是不同的,root属于qu空间,前缀是n,child1和child2属于无名名称空间。
此外也可以使用默认名称空间的方式,如下面另外一种使用方法,它的效果与5-4-2a.xml的一样。
程序5-4-2
文件5-4-2b.xml
xmlns="qu" xmlns:xsi="http://www.w3.org/2001/XML Schema-instance" xsi:schemaLocation="qu 5-4-2.xsd"> 12 v
这种方式指定默认名称空间是qu,也等同于schema指出的目标名称空间,root属于qu名称空间,但是由于child1和child2不是属于默认名称空间,所以如果不指出它们所属的名称空间的话也是无效的,因此这里使用xmlns=””的形式,显式指出它们的名称空间是无名名称空间。
例5-4-3:子元素的elementFormDefault值覆盖父元素的值。
程序5-4-3
文件5-4-3.xsd
156
这里目标名称空间是qu,而且由于elementFormDefault的值是unqualified,所以全局 元素root属于目标名称空间,root的元素以缺省的方式属于无名名称空间,child1属于无名名称空间,但是child2通过属性form重新指定elementFormDefault的值变为qualified,因此此时child2变为是属于目标名称空间的元素了。与此对应的XML文档可以看出child1和child2的区别。
程序5-4-3
文件5-4-3.xml
xsi:schemaLocation="qu 5-4-3.xsd">
100 replace
如果此时将child2的前缀去掉反而会使XML文档无效。
另外一个问题是关于前缀的问题,一个名称空间可以拥有多个不同名字的前缀,比如同时使用a1,a2,a3标识一个名称空间http://name.net,是没有问题的,不管哪一个前缀都表示同一个名称空间 xmlns:n="qu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5.5 小结
本章介绍了W3C的名称空间的发展情况和基本概念,引入名称空间的目的是为了解决在不同XML文档出现同名标记的问题。
名称空间的声明有两种方式,直接声明和默认声明,直接声明的名称空间有相应的前缀名,一个名称空间可以拥有多个不同的名称空间前缀。前缀起到代表对应名称空间的作用。一个名称空间具有一定的作用范围,同时名称空间也可以被覆盖,子类在其范围内的名称空间可以覆盖它从父类继承的名称空间。DTD和schema中都可以相应的使用名称空间来提高XML文档的模块化程度和可重用性。
本章的重点是名称空间的声明,疑点是名称空间与前缀的关系,需要注意的是名称空 157
间的作用域范围。 158
习题
一、选择题 1. XML名称空间是W3C于( )提出的 A.1998年2月 A.xsd; B.1999年2月 C.xsi: C.1998年6月 D.http:: D.1999年6月 2.下列名称空间正确的是( ) B.tm:hy 3.下列哪个说法是错误的( ) A. 一个名称空间具有一定的作用范围,在名称空间范围内的元素和属性才能使用名称B. 一个正确的名称空间的合法名称须由“:”将前缀和元素、属性名分隔。 C. xmlns=””的形式,显式指出它们不属于任何名称空间。 D. 名称空间的前缀名一般不使用xml的任意大小写组合。 4. 一个合法的名称最主要应用于( )情况 A. 用于起始、结束元素标记和空元素标记。 B. 用于属性。 C. 用于DTD。 D.用于schema。 5.下列哪些说法是正确的( ) A. 一个schema文档要应用名称空间,就需要在声明schema根元素的时候同时给出属B. 在一个XML schema中,通过elementFormDefault属性来指示schema中声明的元C. 如果elementFormDefault=”qualified”,则全局元素与类型属于目标名称空间,全局空间极其前缀。 性targetnamespace的值。 素或类型属于哪一个名称空间。 元素的子元素以缺省的方式属于目标名称空间,全局元素的子元素默认是属于无名名称空间的。
D. elementFormDefault具有一定的作用范围,它可以被继承,但是它也可以被覆盖。 二、填空题 1. 声明一个名称空间是使用关键字来声明的,它是一个属性。声明一个名称2. 一个名称空间具有一定的作用范围,同时名称空间也可以被在其范
3. 名称空间通过使用来限定元素和属性,从而保证任何一篇XML文档中使用到的名字不发生重复。
空间有两种方法, 和 。 围内的名称空间可以覆盖它从 继承的名称空间。 4. 一个schema声明的元素或者类型只能属于两个名称空间的其中一个,这两个名称5. elementFormDefault具有一定的作用范围,它可以被继承,但是它也可以被覆盖,159 空间分别是 和 。 子元素中它的取值会 。
三、思考题 1.不使用名称空间会带来什么问题? 2.下列名称空间的声明或使用存在什么问题?
a)
b)
"test">
c)
xsi:schemaLocation="test Untitled17.xsd"/>(用b的schema,b为Untitled17.xsd)
3.分析下面的代码,指出每个名称空间的作用范围。
shally 20 China Beijing zhongshang street femal
4. elementFormDefault有什么作用?
三、上机题
试写出一个同学录的XML文档,使用schema作为文档类型声明的方式,同时需要使用名称空间。
160
第五章 XML名称空间
在XML中,命名一个元素的名称在一定程度上来说是很随意的,每个人都会按照一定的习惯方式来命名一个元素,那么就会存在一个问题,两个人不约而同的使用相同的名称XX来命名了各自定义的元素,如果他们的XML文档不存在交流时,问题是不会发生的,但是,一旦他们各自的文档结合到一起了,问题随之产生,究竟XX指的是谁定义的元素呢?解决这类问题的方法就是引入名称空间,在同名的元素前面指定是属于哪一个名称空间,以此来详细区分不同的元素,特别是随着互联网的快速发展、越来越多的数据需要通过网络传递,或者整合不同来源的数据,这些数据存在重名的可能性非常高,因此使用名称空间也就显得尤为必要了。
5.1 XML名称空间简介
XML名称空间是W3C于1998年2月提出的,刚开始是一个草案,直到1999年1月14日才正式发布为推荐标准,它是XML标准的补充部分。2004年2月4号又推出了1.1版本作为推荐标准。
名称空间通过使用统一资源标识(URI)来限定元素和属性,从而保证任何一篇XML文档中使用到的名字不发生重复。
下面给出一个使用名称空间的例子来开始熟悉名称空间的使用。 程序5-1-1
文件5-1-1.xml
1,2,3 4,5,6 7,8,9 10,11,12
149
本例默认的名称空间是http://year.xsd,对于season元素,它所属的名称空间是http://season.xsd,这个名称空间对应的前缀名是season,而month元素的名称空间是http://month.xsd,这两个字符串都不是严格意义上的URI,它对应的前缀是mon。这个例子仅是给出一个名称空间的初步印象,关于名称空间具体的使用,会在下面再进一步叙述。
5.2 名称空间的声明
在XML中,声明一个名称空间是使用关键字“xmlns”来声明的,它是一个属性。声明一个名称空间有两种方法,直接声明和默认声明。直接声明需要指定声明名称空间的前缀,而默认声明就是没有指定名称空间的前缀,是用这种方式声明的名称空间又称为默认名称空间。在名称空间声明语句中,通过“:”连接在xmlns关键字后面的部分就是名称空间的前缀。
直接声明的语法格式:xmlns:名称空间前缀=”名称空间名”。
默认声明的语法格式:xmlns=”名称空间名”
需要注意的是名称空间的前缀名一般不使用xml的任意大小写组合,因为它作为保留前缀以适应XML发展需要,名称空间名一般为URI,以保证名称空间的全球唯一性,但是它并不会导致对这个资源的访问,而只是为了确保唯一性,比如很多例子的名称空间用到了http://www.w3.org/2001/XMLSchema这个名称,但是实际上例子并不会访问W3C的这个文件。名称空间前缀代表名称空间,通过将前缀与元素、属性相结合来达到区别元素、属性的效果,比如设定名称空间http:// www.w3.org/2001/XMLSchema的前缀为xsd,则xsd与http:// www.w3.org/2001/XMLSchema是等价的,当XML处理器遇到xsd:element时,就会将它等价为http:// www.w3.org/2001/XMLSchema:element。
一个使用的名称空间的合法名称须由“:”将前缀和元素、属性名分隔,并且两边的名称都要是一个合法的XML名称,如果一个名称空间是默认名称空间,则可以省略掉前缀部分而只剩下元素、属性名称。一个合法名称最主要应用于三种情况:
第一种是用于起始、结束元素标记和空元素标记。例如:
第二种是用于属性,例如:
第三种是用于DTD,例如:
150
在DTD中使用名称空间时要注意是使用被应用名称空间的元属的属性声明的方式来声明名称空间,这个语句:
就是声明了sean是一个在名称空间前缀为sea下的元素,注意属性限制一定要是#FIXED的。
下面给出两个应用名称空间的XML例子,第一个是使用DTD作为文档类型声明,第二个则使用schema。
例5-2-1:
首先是使用DTD定义的文件格式。 程序5-2-1
文件5-2-1.dtd
CDATA #FIXED "http://season/sea">
接着是对应的是用该dtd文档的XML文档。
程序5-2-1
文件5-2-1a.xml
1,2,3 4,5,6 7,8,9 10,11,12
接下来是使用schema定义文档结构的方法。它与DTD是等效的。
程序5-2-1
文件5-2-1.xsd
targetNamespace="http://season/sea"
elementFormDefault="qualified">
151
最后是使用这个schema的XML文档。
程序5-2-1
文件5-2-1b.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://season/sea 5-2-1.xsd">
1,2,3 4,5,6 7,8,9 10,11,12
这个例子给出了声明名称空间的方法示例,使用DTD和schema都是可以进行名称空间声明的。
5.3 名称空间的作用范围
一个名称空间具有一定的作用范围,在名称空间范围内的元素和属性才能使用名称空间极其前缀,不在名称空间、或者属于另外一个名称空间的元素和属性是不受该名称空间约束的。
例如:
1,2,3 4,5,6 7,8,9 10,11,12 152
365
这一段文档,season是位于名称空间http://season.xsd之下的,它受到该名称空间的约束,而month是位于名称空间http://month.xsd之下,它不同于season的名称空间,因此sea名称空间是约束不到month的,反过来mon名称空间对于元素season也不具备约束力。
名称空间也有可能被覆盖,当一个名称空间中又包含了其他名称空间的声明时就会发生这种情况。此时内部的名称空间就会覆盖外部的名称空间,上面的代码中声明了一个默认名称空间http://year.xsd,它作用于year的全部内容,但是由于season和month声明了各自的名称空间,因此发生了名称空间被覆盖的现象,season和month不再属于默认名称空间,而是属于各自声明的名称空间。但是day元素没有再声明名称空间,因此它的名称空间就是默认名称空间,与year的名称空间是一致的。关于名称空间的作用范围实际上是比较复杂的,它需要结合默认名称空间是否定义、元素属性的elementFormDefault和attributeFormDefault的取值才能做出精确的判断。
因此一定要注意名称空间的作用范围,一定要在名称空间的作用域内使用名称空间,脱离了作用范围而谈名称空间是没有任何实际意义的。
5.4 schema中的名称空间
一般在schema中经常会用到名称空间,并且schema与名称空间的结合也比DTD更为灵活,因此在这里有必要再进一步讲述。
一个schema文档要应用名称空间,就需要在声明schema根元素的时候同时给出属性targetnamespace的值。没有targetnamespace值的声明是对应于不使用名称空间的XML文档。
例如文档:
这是一个没有使用名称空间的schema,相应的如果要在XML文档中应用这个schema文档就需要指出schmea文档是没有名称空间的,这可以通过在文档元素中使用noNamespaceSchemaLocation属性来实现。比如:
xsi:noNamespaceSchemaLocation="Untitled1.xsd">
365
153
这个文档就是一个没有应用名称空间的文档。
相反的,如果要指定名称空间,就一定需要指定targetnamespace属性的值,否则如果不指定targetnamespace的值又使用名称空间是不能通过有效性验证的。比如下面的文档就是一个使用名称空间的schema:
targetNamespace="http://year.net" xmlns="http://year.net">
这个schema通过将targetnamespace的值指定为http://year.net的方式从而将目标名称空间的值定为http://year.net,此后这个schema声明的元素和属性,在没有重新声明名称空间的情况下——也即是不发生覆盖的情况下都属于这个名称空间。相应的如果要在XML文档中使用这种具备目标名称空间的schema,则需要指定schemaLocation属性值,并且属性值中的名称空间需要与schema中指定的targetnamespace属性值中的名称空间一致,否则也是无效的。schemaLocation属性值的形式必须是:名称空间URI空格schema文档位置。比如上面的schema对应的XML文档就是:
365
此外针对元素和属性究竟属于哪一个名称空间也有一定的规定。
在一个XML schema中,通过elementFormDefault属性来指示schema中声明的元素或类型属于哪一个名称空间。一个schema声明的元素或者类型只能属于两个名称空间的其中一个,这两个名称空间分别是目标名称空间和非目标名称空间,非目标名称空间有可能是一个无名名称空间——即它是一个名字为空的名称空间,注意无名名称空间不同于默认名称空间。
如果elementFormDefault=”qualified”,则全局元素与类型属于目标名称空间,全局元素的子元素以缺省的方式属于目标名称空间,也即全局元素的子元素默认是属于目标名称空间的。如果elementFormDefault=”unqualified”,则所有全局元素的子元素以缺省的方式属于无名名称空间。
类似的,属性的名称空间也遵循这种方式来指定属性所属的名称空间,指定属性的名称空间使用attributeFormDefault属性,它的取值也是qualified和unqualified。
elementFormDefault具有一定的作用范围,它可以被继承,但是它也可以被覆盖,子元素中它的取值会覆盖父元素指定的值。
我们通过几个例子来说明elementFormDefault的作用效果。
例5-4-1:这是指定elementFormDefault为qualified的例子。
154
程序5-4-1
文件5-4-1.xsd
targetNamespace="qu"
这种方式下,全局元素属于目标名称空间也即targetNamespace 的值qu,而局部元素以缺省方式属于qu,,所以child1和child2也都属于qu名称空间。接下来是对应的XML文档。
程序5-4-1
文件5-4-1.xml
100
qualified
我们在XML文档中设定默认名称空间为qu名称空间,由于root、child1和child2都属于qu名称空间,又是默认名称空间,因此不需要添加前缀,如果此时还有其他名称空间,则需要在属于其他名称空间的元素添加前缀,以此区别不同的名称空间的元素。
例5-4-2:这是指定elementFormDefault为unqualified的例子。
程序5-4-2
文件5-4-2.xsd
targetNamespace="qu" elementFormDefault="unqualified" >
155 elementFormDefault="qualified" attributeFormDefault="unqualified">
这种方式下,全局元素属于目标名称空间qu,而局部元素以缺省方式属于无名名称空间,所以child1和child2也都不属于qu名称空间。接下来是对应的XML文档。 程序5-4-2
文件5-4-2a.xml
xmlns:n="qu" xmlns:xsi="http://www.w3.org/2001/ XMLSchema-instance" xsi:schemaLocation="qu 5-4-2.xsd"> 100 unqualified
这是不使用默认名称空间的方式,这种方式下,root所属的名称空间与child1和child2是不同的,root属于qu空间,前缀是n,child1和child2属于无名名称空间。
此外也可以使用默认名称空间的方式,如下面另外一种使用方法,它的效果与5-4-2a.xml的一样。
程序5-4-2
文件5-4-2b.xml
xmlns="qu" xmlns:xsi="http://www.w3.org/2001/XML Schema-instance" xsi:schemaLocation="qu 5-4-2.xsd"> 12 v
这种方式指定默认名称空间是qu,也等同于schema指出的目标名称空间,root属于qu名称空间,但是由于child1和child2不是属于默认名称空间,所以如果不指出它们所属的名称空间的话也是无效的,因此这里使用xmlns=””的形式,显式指出它们的名称空间是无名名称空间。
例5-4-3:子元素的elementFormDefault值覆盖父元素的值。
程序5-4-3
文件5-4-3.xsd
156
这里目标名称空间是qu,而且由于elementFormDefault的值是unqualified,所以全局 元素root属于目标名称空间,root的元素以缺省的方式属于无名名称空间,child1属于无名名称空间,但是child2通过属性form重新指定elementFormDefault的值变为qualified,因此此时child2变为是属于目标名称空间的元素了。与此对应的XML文档可以看出child1和child2的区别。
程序5-4-3
文件5-4-3.xml
xsi:schemaLocation="qu 5-4-3.xsd">
100 replace
如果此时将child2的前缀去掉反而会使XML文档无效。
另外一个问题是关于前缀的问题,一个名称空间可以拥有多个不同名字的前缀,比如同时使用a1,a2,a3标识一个名称空间http://name.net,是没有问题的,不管哪一个前缀都表示同一个名称空间 xmlns:n="qu" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5.5 小结
本章介绍了W3C的名称空间的发展情况和基本概念,引入名称空间的目的是为了解决在不同XML文档出现同名标记的问题。
名称空间的声明有两种方式,直接声明和默认声明,直接声明的名称空间有相应的前缀名,一个名称空间可以拥有多个不同的名称空间前缀。前缀起到代表对应名称空间的作用。一个名称空间具有一定的作用范围,同时名称空间也可以被覆盖,子类在其范围内的名称空间可以覆盖它从父类继承的名称空间。DTD和schema中都可以相应的使用名称空间来提高XML文档的模块化程度和可重用性。
本章的重点是名称空间的声明,疑点是名称空间与前缀的关系,需要注意的是名称空 157
间的作用域范围。 158
习题
一、选择题 1. XML名称空间是W3C于( )提出的 A.1998年2月 A.xsd; B.1999年2月 C.xsi: C.1998年6月 D.http:: D.1999年6月 2.下列名称空间正确的是( ) B.tm:hy 3.下列哪个说法是错误的( ) A. 一个名称空间具有一定的作用范围,在名称空间范围内的元素和属性才能使用名称B. 一个正确的名称空间的合法名称须由“:”将前缀和元素、属性名分隔。 C. xmlns=””的形式,显式指出它们不属于任何名称空间。 D. 名称空间的前缀名一般不使用xml的任意大小写组合。 4. 一个合法的名称最主要应用于( )情况 A. 用于起始、结束元素标记和空元素标记。 B. 用于属性。 C. 用于DTD。 D.用于schema。 5.下列哪些说法是正确的( ) A. 一个schema文档要应用名称空间,就需要在声明schema根元素的时候同时给出属B. 在一个XML schema中,通过elementFormDefault属性来指示schema中声明的元C. 如果elementFormDefault=”qualified”,则全局元素与类型属于目标名称空间,全局空间极其前缀。 性targetnamespace的值。 素或类型属于哪一个名称空间。 元素的子元素以缺省的方式属于目标名称空间,全局元素的子元素默认是属于无名名称空间的。
D. elementFormDefault具有一定的作用范围,它可以被继承,但是它也可以被覆盖。 二、填空题 1. 声明一个名称空间是使用关键字来声明的,它是一个属性。声明一个名称2. 一个名称空间具有一定的作用范围,同时名称空间也可以被在其范
3. 名称空间通过使用来限定元素和属性,从而保证任何一篇XML文档中使用到的名字不发生重复。
空间有两种方法, 和 。 围内的名称空间可以覆盖它从 继承的名称空间。 4. 一个schema声明的元素或者类型只能属于两个名称空间的其中一个,这两个名称5. elementFormDefault具有一定的作用范围,它可以被继承,但是它也可以被覆盖,159 空间分别是 和 。 子元素中它的取值会 。
三、思考题 1.不使用名称空间会带来什么问题? 2.下列名称空间的声明或使用存在什么问题?
a)
b)
"test">
c)
xsi:schemaLocation="test Untitled17.xsd"/>(用b的schema,b为Untitled17.xsd)
3.分析下面的代码,指出每个名称空间的作用范围。
shally 20 China Beijing zhongshang street femal
4. elementFormDefault有什么作用?
三、上机题
试写出一个同学录的XML文档,使用schema作为文档类型声明的方式,同时需要使用名称空间。
160