XML知识点滴(10)

XML知识点滴(10)

(引用文章,版权归作者,如需删除请联系我)

XML名称空间

n         一个XML文档中可以包含许多元素与属性,当我们使用其他人的XML文档,或者在文档中使用多个DTD文件时,就有可能碰到名称相同的元素,而这些名称相同的元素就可能代表了完全不同的含义。比如:title可以用于表示标题,也可以用于表示某个人的头衔;table可以表示表格,也可以表示桌子。当这些具有相同名称不同含义的元素混合到一个文档中时,就会造成理解和处理上的混乱。为了解决这个问题,就要用到W3C发布的另一个推荐标准——XML名称空间。

n         可以在http://www.w3.org/TR/REC-xml-names/上查看XML名称空间规范的详细内容。

 

声明名称空间

n         名称空间通过使用一系列的保留属性来声明,这种属性的名字必须是以xmlns或以xmlns:作为前缀。与其他任何XML属性一样,这些属性可以直接或以缺省的方式给出。

n         XML名称中的冒号“:”在XML命名中有特殊的含义。冒号前面的部分称为元素的“前缀”(Prefix),后面的部分称为元素的“本地名”(Local name)。前缀、冒号和本地名合起来称为元素的“限定名”(Qualified name)。前缀和特定的“统一资源标识符”(URI)相联系。具有该前缀的元素或属性称为属于该前缀对应URI所表示的名称空间。

n         名称空间的声明有两种形式:

Ø         第一种形式

              <元素名 xmlns:prefixname=”URI”>

元素名是指你在哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性,以及该元素内容中的所有元素及其属性。

xmlns:prefixname作为该元素的属性名,属性的值是一个URI引用,是标识该名称空间的名称空间名字。其中prefixname给出名称空间前缀的名字,该前缀用于将元素及属性的名字与URI关联在一起。要注意的是,在这样的声明中,名称空间的名称不能为空(””)。如果有两个URI,其组成字符完全相同,可以认为它们标识了同一个名称空间。

来自于XML名称空间的名字可以作为限定名(qualified names)出现,限定名包括了一个以冒号(:)分隔的名称空间前缀和一个本地部分(local part)。映射到URI引用的名称空间前缀选择了一个名称空间。

              例如:

                     <hr xmlns:hr=”http://localhost/hr”>

                     <hr:employee>

       名称空间前缀可以是不包含冒号的任何合法的XML名称。

在声明名称空间时,有两个前缀是不允许使用的,它们是xmlxmlnsxml前缀只能用于XML1.0规范中定义的xml:spacexml:lang属性,前缀xml被定义为与名称空间名字http://www.w3.org/XML/1998/namespace绑定。前缀xmlns仅仅用于声明名称空间的绑定,它被定义为与名称空间名字http://www.w3.org/2000/xmlns绑定。

名称空间推荐标准中指出,在名称空间声明中,使用相对URI引用已经被废弃了(不赞成使用)。

Ø         第二种形式

              <元素名 xmlns=URI>

       这种声明形式没有给出名称空间的前缀名,URI所标识的是缺省的名称空间。在这样的 缺省声明中,属性可以为空(””)。例如:

              <hr xmlns=”http://localhost/hr”>

表明声明了一个缺省的名称空间,hr元素及其内容中所有的没有前缀的元素都属于http://localhost/hr所标识的名称空间,除非被hr元素内容中其他的缺省名称空间声明所覆盖。注意:在声明名称空间时,选择的URI不需要指向实际的内容,在URI所标识的位置上,可以不存在任何东西。在名称空间声明中的URI只是形式上的标识符,其唯一的目的是提供一个唯一的名字。

 

名称空间在元素和属性中的运用

n         在具有很多元素(这些元素都在同一个名称空间中)的文档中,给每个元素名称都添加一个前缀将是一件烦琐的事情。为此,我们可以使用没有前缀名的xmlns属性将缺省的名称空间附加给元素及其子元素,元素本身及其子元素都被认为是在缺省的名称空间中,除非它们有明确的前缀。

n         缺省名称空间中的URI可以设为空字符串,这样的话,在它的声明范围内,没有前缀的元素将被认为不存在于任何的名称空间中,这和没有声明缺省名称空间是一样的。

n         一个属性要想在某个名称空间中,必须给该属性加上名称空间的前缀,没有前缀的属性不在任何的名称空间中(包括缺省的名称空间)。即使拥有属性的元素在某个名称空间中,没有前缀的属性仍然不在该名称空间或任何其他的名称空间中。

n         XML文档中,没有任何一个标签可以包含两个相同的属性,所谓相同有两种情况,一种是属性的名字完全相同,另一种是属性限定名中的本地部分完全相同,而不同的前缀绑定到了相同的名称空间名字。例如:

       <?xml version=”1.0” encoding=”gb2312”?>

       <x xmlns:n1=”http://www.w3.org” xmlns: n2=”http://www.w3.org”>

       <!—错误,两个属性的名字相同-->

       <bad a=”1” a=”2”/>

       <!—错误,前缀n1n2绑定的是同一个名称空间名字,而本地部分也完全相 -->

       <bad n1:a=”1” n2:a=”2”/>

       </x>

       <?xml version=”1.0” encoding=”gb2312”>

       <x xmlns:n1=” http://www.w3.org” xmlns=” http://www.w3.org”>

       <!—正确,属性名不同-->

       <good a=”1” b=”2”/>

       <good a=”1” n1=”2”/>

       </x>

 

名称空间和DTD

n         DTD和名称空间并不相关,当XML处理器在验证文档的有效性时,根本不管元素前缀的含义,只是按照DTD的规范对文档进行有效性验证。

n         我们声明名称空间时,使用了xmlnsxmlns:prefixname属性,而在验证时,会发现在DTD中没有声明该属性,当然验证就会失败;另外,如果在DTD中声明的是book元素,而在文档中使用的是bks:book元素,则文档也是无效的。

n         为了让使用名称空间的文档有效,我们必须在DTD像声明其他属性一样声明xmlnsxmlns:prefixname属性,此外,还需要重写说有带有前缀的元素和属性的声明。例如:

<?xml version="1.0" encoding="gb2312"?>

<!--没有使用名称空间的文档-->

<!DOCTYPE book[

     <!ELEMENT book (title,author)>

     <!ELEMENT title (#PCDATA)>

     <!ELEMENT author (#PCDATA)>

]>

<book>

     <title>JSP深入编程</title>

     <author>张三</author>

</book>

 

<?xml version="1.0" encoding="gb2312"?>

<!--应用了名称空间后,要重写DTD-->

<!DOCTYPE book[

     <!ELEMENT book (bk:title, bk:author)>

     <!ATTLIST book xmlns:bk CDATA #REQUIRED>

     <!ELEMENT bk:title (#PCDATA)>

     <!ELEMENT bk:author (#PCDATA)>

]>

<book xmlns:bk="http://localhost/bk">

     <bk:title>JSP深入编程</bk:title>

     <bk:author>张三</bk:author>

</book>

缺省名称空间只要在DTDxmlns属性进行声明就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值