在XML解析器把XML文档解析并将其中的数据传递给应用程序后,应用程序需要把来自不同文档的元素组合到同一个XML文档里。
无论是在同一个文档还是在不同的文档,为了解决命名冲突的问题,可以在每个元素前添加前缀。但这个方法也有缺点,就是在为HTML的XML版的元素前添加前缀时,浏览器可能无法正常读取XML文档中的XHTML内容。
命名空间只是起到“分装容器”的作用,除此之外,无任何意义。
命名空间的定义有了,但是由谁来管理这些命名空间?要使命名空间有效,命名空间前缀本身也必须是唯一的。这个问题的解决方法与因特网上域名管理方法相似,即在使用某个前缀前先向“前缀管理员”申请,如果这个前缀还没有被其他人或公司使用,那么就可以使用该前缀。
命名空间的运行机制:
当我们要在XML文档中使用命名空间时,元素名的概念就变成了所谓的限定名。它由两部分组成:本地部分,即我们之前称呼的元素名;命名空间前缀,它确定了这个名称所在的命名空间。
要特别注意书中讲述的声明XML命名空间的语法。
比如开始标签<pers:person xmlns:pers=”http://www.wiley.com/pers”>,表示person元素属于pers所指代的命名空间。
有了命名空间后,元素不能只根据它的名字来标识,而要根据它的限定名来标识。
当XML文档被解析时,解析器会把所有的命名空间前缀替换为命名空间即xmlns中的内容。
默认的命名空间:
标准的语法要求我们要在每个元素名前添加命名空间前缀,不过如此一来文档的形式就不太美观了。为解决这一问题,我们可以使用默认的命名空间。即在上面的开始标签中省去前缀的书写和声明,这样,就可以写成<person xmlns=”http://www.wiley.com/pers”>,此开始标签对应的结束标签和标签之间的所有元素名就不用再添加前缀了,它们的命名空间默认属于”http://www.wiley.com/pers”。当然,同一个标签里只能使用一个默认命名空间,要再使用一个命名空间那就得乖乖声明一个命名空间前缀了。
注意书上讲述的命名空间的更多用法。
命名空间和属性:
命名空间对元素的作用与它对属性的作用并不一样。虽然某元素属于某命名空间的一部分,但它的属性只是对所属的元素关联而已,要想使某属性隶属于某个命名空间,则该属性前也要有命名空间前缀。
URI:
URI(统一资源标识符)是一个用来标识资源的字符串。它有两种形式:URL和URN。
URL第一部分使用了协议(scheme),通常是http协议。协议后面是冒号,冒号后面是资源的路径。
比如,http://www.google.com/intl/en/about.html是某个网页的URL。这个URL表示从Internet上的一个名为www.google.ca服务器上检索一个名为about.html的文件,该文件位于/intl/en目录里,并且这个文件必须要用HTTP协议读取。
通过URL能检索到的资源是有限的,因为它们只有在计算机里才能读取到。
URN不是很经常使用。它们的存在为资源提供了一个持久的、独立于位置的名字。
用URL而不是URN来表示XML的命名空间的原因:
URL本身保持了它的唯一性,所以用域名创建命名空间会更容易。
命名空间URI的真实含义:
根据XML命名空间规范,URI只是用来给命名空间一个名字而已,除此之外没有任何意义。XML解析器不会试图进入URL也不会检索任何东西。当然,对于具体的应用程序而言,它们可以根据自己的需要利用这些URL。