» 网友学堂 » XML教程 » 3.3.2.1 前缀标识法
3.3.2.1 前缀标识法
作者:hinet 发表时间:2007-2-25 17:38 阅读:1432次 在百度搜索相关内容

3.3.2.1 前缀标识法


命名冲突问题是XML文档中引入多DTD的老大难问题,那么,命名空间标准又是如何解决这一问题的呢?
一个直接的想法是保证所引用到的DTD没有重名的元素。可是,你所引用的DTD可能来自世界上各个地方,由不同的人制定,要求这成千上万的DTD没有重名现象似乎有些异想天开,且想想你身边重名的人还有多少呢!再有一个想法就是要求所引用到的DTD改名字,把“联系人列表”中的元素“姓名”改为“联系人姓名”,“电话”改为“联系人电话”;相应地,“企业经理”中的“姓名”改为“经理姓名”,“电话”改为“经理电话”。但是,如果出现了大量重名元素,这个修改的工作量就很大了,如此麻烦,多DTD的优势消失殆尽,还不如自己重新定义一个呢。
命名空间标准提供了一个很聪明的方法,就是所谓前缀标识法,即在元素名和属性名前面增加一个标识,以唯一区分当前元素或属性来自哪一个DTD。使用了命名空间后,上节那个"联系人列表"的例子就变成下面的样子。
<联系人:联系人列表 xmlns:联系人 ="联系人列表.dtd" xmlns:企业经理 ="企业经理.dtd">
<联系人:联系人>
<联系人:姓名>张三
<联系人:ID>001
<联系人:公司>A公司
<联系人:EMAIL>zhang@aaa.com
<联系人:电话>(010)62345678
<联系人:地址>
<联系人:街道>五街1234号
<联系人:城市>北京市
<联系人:省份>北京

<联系人:直接上级>
<企业经理:姓名>王五
<企业经理:电话>
<企业经理:秘书电话>(010)62345678
<企业经理:手机>13601234567




现在,由于在"直接上级"的"姓名"元素前增加了标识——"企业经理",而"联系人"的"姓名"元素前增加了标识——"联系人",这两个"姓名"在元素名称上的冲突被化解了。同样,语法分析器也会对两个“电话”元素识得庐山真面目,分别作不同的处理。
要实现元素、属性的前缀标识命名法,我们需要解决以下几个问题:
如何声明命名空间,即如何定义上例中的"联系人"、"企业经理"这样的前缀标识?
什么是合法名称,即标记中带有前缀标识的元素和属性应该是什么样子?
怎样使用合法名称,即在XML文档中应该如何发挥命名空间的威力?
下面的章节中,我们就来详细地讨论这几个问题。

#1 hinet 发表评论于:2007-2-25 17:38
3.2.2.2 Schema 文件的结构


在说到元素的定义方法之前,我们先来讲一下Schema文件的结构。其实,Schema文件和其它XML文件的样子非常相似,它是由一组元素构成的,其根元素是“Schema”。“Schema”元素是XML Schema中第一个出现的元素,用于表明该XML文档是一个Schema文档,相应的,“Schema”的结束标记一般在文档的末尾。这样,一个Schema的结构如下:

...

Schema具有两个属性:name指定该Schema的名称,而xmlns则指定该Schema包含的命名空间。注意,一个XML Schema文档中可以包含多个命名空间,比如下面的语句指定了三个命名空间:
xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:myNS=http://www.xml_step_by_step.edu\ns.xml
>
第一个是xmlns="urn:schemas-microsoft-com:xml-data",它指定本文档是一个XML Schema文档;第二个是xmlns:dt="urn:schemas-microsoft-com:datatypes",它定义了在本文档中可以使用的数据类型;第三个是xmlns:myNS="http://www.xml_step_by_step.edu\ns.xml",它表明下面可能会用到在myNS中定义的元素或属性。
至于文件结构中的省略号,可以是关于元素的声明语句、也可以是关于属性的声明语句,一切听从你的实际需要。关于它们的使用方法,我们会在下面两个小节中详细讲述。
#2 hinet 发表评论于:2007-2-25 17:38
3.3.2.3 什么是合法名称


在声明了命名空间之后,文件中的元素可能也要脱胎换骨了,我们在3.3.2.1节中看到的例子和3.3.1节中仿佛就有很大的差别。其实,说“脱胎换骨”还是有些言过其实的,恰如其分的说法应该是“新瓶装旧酒”,元素的内容并没有丝毫改变,改变的是XML文件中使用的元素名。引入了命名空间的合法元素、合法属性名称都有一番新的规定。
合法名称的形式应该是:
前缀部分:本地部分
其中,“前缀部分”和“本地部分”都要求是一个合法的XML名称。前缀部分必须是一个已经经过声明的命名空间前缀,语法分析器将把它与命名空间声明中的URI引用相联系;本地部分则是在DTD或Schema中定义的元素和属性名。下面给出一个合法名称的例子:
企业经理:姓名
此外,由于命名空间的声明方式有直接方式和缺省方式两种,合法名称也稍有变化。由于缺省方式声明的命名空间就是作用域内的缺省命名空间,因此,在这个作用域内使用该命名空间的元素、属性的合法名称无须再写前缀部分。这样一来,元素的合法名称看上去和我们前面常用的元素名是一致的。由此可见,我们一直在使用“合法名称”,只不过没有意识到罢了。