📄 0303-0400.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0071)http://162.105.170.55/ASPs/GetLearningArticleTemp.asp?section=0303-0400 -->
<HTML><HEAD><TITLE>XML中国论坛 - 初学进阶 - 3.3.4 命名空间与DTD</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TABLE {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"
}
.pt9 {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"
}
.pt10 {
FONT-WEIGHT: 700; FONT-SIZE: 10pt; LINE-HEIGHT: 18pt; FONT-FAMILY: "宋体"
}
.TempOutline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; COLOR: #666666; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.TempOutline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; COLOR: #666666; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.Outline11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage0 {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.passage111 {
FONT-SIZE: 9pt; MARGIN-LEFT: 51pt; TEXT-INDENT: -64pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
</STYLE>
<META content="Microsoft FrontPage 5.0" name=GENERATOR></HEAD>
<BODY vLink=#000000 aLink=#000000 link=#000000 leftMargin=0 topMargin=0
onload=""><!-- 以下为主体内容 -->
<div align="center">
<center>
<TABLE width="100%" border=0 style="border-collapse: collapse" bordercolor="#111111" cellpadding="0" cellspacing="0">
<TBODY>
<TR vAlign=top>
<TD rowSpan=2 width="60"></TD>
<TD vAlign="center" " >
<p align="center" >
<p align="center"><IMG height=33
src="image/title_learner.gif" width=226></TD>
<TD rowSpan=2 ></TD>
</TR>
<TR vAlign=top>
<TD ><!-- 正文内容 -->
<DIV class=pt10><B>3.3.4 命名空间与DTD</B></DIV>
<DIV></DIV><BR>
<DIV class=pt9>
<P>们在前面讨论命名空间的话题中,一直没有提到命名空间与DTD的关系。不错,命名空间与DTD之间确有隐情,而且正是这个隐情使命名空间的标准倍受攻击。</P>
<P>其实,在命名空间声明中,等号右边的命名空间名虽说要求是一个URI,但其目的并不是要直接获取一个Schema或DTD文件,而在于标识特定的命名空间。也就是说,语法分析器看到一个命名空间声明后,就把等号左边的命名空间前缀和右边的命名空间名绑定在一起,对于后面使用了该前缀的合法名称,都看作是这个命名空间中的。但是,等到语法分析器进行有效性检测时,它不是把这个命名空间映射到URI所指的Schema文件或DTD文件,而是去找所有在DOCTYPE中声明的内部和外部的DTD或Schema,看哪一个所定义的<STRONG>合法</STRONG>元素/属性名与文件中用到的<STRONG>合法</STRONG>元素/属性名相同。</P>
<P>命名空间规范是通过在元素名和属性名前加命名空间前缀来区分一个元素或属性是来自哪一个DTD的,追本溯源,这又是通过修改元素名和属性名来实现的。也就是说,由于“联系人列表”这个前缀已经和命名空间名“<FONT
color=#000000><STRONG>http://www.xml.net.cn/联系人列表.dtd</STRONG></FONT>”绑定在一起,所以,我们在XML文件中看到的“联系人列表:姓名”元素,在语法分析器看来是这个样子:</P>
<DIV align=center>
<CENTER>
<TABLE height=23 width="80%" border=1>
<TBODY>
<TR>
<TD width="100%" height=17><STRONG><FONT
color=#000000>http://www.xml.net.cn/联系人列表.dtd</FONT></STRONG> :
姓名</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>按照"有效的"XML文档规范的要求,这些元素名和属性名,应该由DTD来定义。这样说来,DTD中定义元素名和属性名的地方也应该加上命名空间前缀了?否则,带有命名空间的XML文档找不到相对应的DTD文档,不就成了不符合"有效的"XML规范的XML文档了吗?不错,要使用命名空间,必须还要满足下面两个条件:
<OL>
<LI>定义DTD时必须定义好命名空间,并作用于相关的元素和属性的定义。
<LI>使用命名空间的文档,其命名空间声明中定义的“命名空间名”必须与DTD中所定义的相同。 </LI></OL>
<P>根据这个规定,联系人列表的DTD应该改为下面的样子:</P>
<DIV align=center>
<CENTER>
<TABLE height=23 width="80%" border=1>
<TBODY>
<TR>
<TD width="100%" height=17><?xml version="1.0"
encoding="GB2312"?><BR><BR><!ELEMENT 联系人:联系人列表
(联系人)*><BR><!ATTLIST 联系人:联系人列表 xmlns:
联系人<BR>
"http://www.xml.net.cn/联系人列表.dtd" IMPLIED> <BR><!ELEMENT
联系人:联系人 (联系人:姓名, 联系人:ID, 联系人:公司, 联系人:EMAIL, 联系人:电话,
联系人:地址)><BR><!ELEMENT 联系人:姓名 (#PCDATA)><BR><!ELEMENT
联系人:ID (#PCDATA)><BR><!ELEMENT 联系人:公司
(#PCDATA)><BR><!ELEMENT 联系人:EMAIL
(#PCDATA)><BR><!ELEMENT 联系人:电话 (#PCDATA)><BR><!ELEMENT
联系人:地址 (联系人:街道, 联系人:城市, 联系人:省份)><BR><!ELEMENT 联系人:街道
(#PCDATA)><BR><!ELEMENT 联系人:城市 (#PCDATA)><BR><!ELEMENT
联系人:省份 (#PCDATA)></TD></TR></TBODY></TABLE></CENTER></DIV>
<P>现在,语法分析器在XML文档中看到元素“联系人列表:姓名”时,先将其转换为“<FONT
color=#000000>http://www.xml.net.cn/联系人列表.dtd</FONT> :
姓名”,然后再到DOCTYPE中指定的元素类型声明文件中去找,恰好在“联系人列表.dtd”中看到了“联系人:姓名”,转换过来以后也是“<FONT
color=#000000>http://www.xml.net.cn/联系人列表.dtd</FONT> :
姓名”。二者完全吻合,语法分析器也就大功告成了。</P>
<P>可是,目前大多数公布和使用的DTD都没有关于命名空间的定义,为了实现包含多种DTD的XML文档,也许需要再定义一套含有命名空间的DTD。使用时根据需要再分别选择不同的DTD。更糟的是,问题还没有这么简单,别忘了在命名空间标准中,允许以缺省方式声明命名空间,这种方式下,元素名和属性名前面是没有命名空间前缀的。这也就是说,在多DTD的XML文档中,也可能使用没有命名空间的DTD。这样说来,一个"有效的"XML解释器,在确定使用DTD的类型时,要做如下的判断:</P>
<P align=center><IMG height=224 src="image/liucheng.jpg"
width=482></P>
<P
align=left>本来命名空间的作用是为了方便地解决命名冲突问题,可经过上面的分析,我们发现问题的解决方法似乎并不尽如人意。现在,对于每一个原始的DTD,都要有两个版本,一个没有定义命名空间,元素的定义中也没有缀上命名空间前缀,以供缺省方式下的元素使用;还有一个定义了命名空间,而且这个命名空间名需要与XML文件中的命名空间名一致,留给非缺省方式的元素。相信读者已经发现这其中的问题,命名空间标准虽然已经推出,但由于这一先天不足,现在仍旧争议不断,应用开发也受到了限制。</P></DIV>
<P></P>
<P></P></TD></TR></TBODY></TABLE>
</center>
</div>
<P></P>
<P>
<P></P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -