?? 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 + -