文檔類型定義DTD(Document Type Definition)--聖思園-WS-DTD詳解


爲何使用 DTD

1,DTD 用來描述 XML 文檔的結構
2,經過 DTD,您的每個 XML 文件都可攜帶一個有關其自身格式的描述。
3,經過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換數據。
4,而您的應用程序也可以使用某個標準的 DTD 來驗證從外部接收到的數據。
5,您還可使用 DTD 來驗證您自身的數據。

DTD文檔組成

1,元素 ( ELEMENT ) 的定義規則。
2,元素之間的關係規則。
3,屬性 ( ATTLIST ) 的定義規則。
4,可以使用的實體 ( ENTITY ) 或符號 ( NOTATION ) 規則。

內部的 DOCTYPE 聲明

假如 DTD 被包含在您的 XML 源文件中,它應當經過下面的語法包裝在一個 DOCTYPE 聲明中:
<!DOCTYPE 根元素 [DTD聲明]>
.dtd 文件中是不能使用 DOCTYPE
 
帶有 DTD 的 XML 文檔實例:
     
     
     
     
    1. <!--這裏全部定義的子元素都要被使用1次,使用順序按照定義的順序-->
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE note [<!ELEMENT note (to,from,heading,body)><!--聲明根元素note有4個子元素--><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>]><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>
!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔,note是根元素的名稱。
!ELEMENT note (第三行)定義 note 元素有四個子元素:"to、from、heading、body"
!ELEMENT to  (第四行)定義 to 子 元素 數據類型 爲 "#PCDATA" 
!ELEMENT from (第五行)定義 from  元素 數據類型 爲 "#PCDATA"  
!ELEMENT heading (第六行)定義 heading  元素 數據類型 爲 "#PCDATA"  
!ELEMENT body (第七行)定義 body  元素 數據類型 爲 "#PCDATA" 
注意:例子中的定義關鍵字必定要大寫,如DOCTYPEELEMENT#PCDATA
且元素名稱與數據類型之間也要有空格

外部文檔聲明:

假如 DTD 位於 XML 源文件的外部,那麼它應經過下面的語法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
例:
F:/dream/聖思園/Web.Service/note.dtd
    
    
    
    
<?xml version="1.0" encoding="UTF-8"?><!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>
   
   
   
   
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE note SYSTEM "F:/dream/聖思園/Web.Service/note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>
公用DTD:
有一種外部DTD,是由某個權威機構制定,供特定行業或公司,這種DTD又被稱爲公用DTD
    <!DOCTYPE 根元素名 PUBLIC 「DTD-NAME」 「DTD-URL」>
公用DTD與外部DTD區別在於:公用DTD使用PUBLIC代替了原來的SYSTEM,並增長了DTD標識名。


內外部DTD文檔結合

<!DOCTYPE 根元素  SYSTEM "DTD文件路徑" [DTD聲明內容]>
F:/dream/聖思園/Web.Service/note.dtd
    
    
    
    
<?xml version="1.0" encoding="UTF-8"?><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>
     
     
     
     
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE note SYSTEM "F:/dream/聖思園/Web.Service/note.dtd"[<!ELEMENT note (to,from,heading,body,name)><!ELEMENT name (#PCDATA)>]><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body><name>z</name></note>


XML 文檔構建模塊

XML 以及 HTML 文檔的主要構建模塊是相似 <body>....</body> 這樣的標籤。
全部的 XML 文檔(以及 HTML 文檔)均由如下簡單的構建模塊構成:
元素,屬性,實體,PCDATA ,CDATA  

下面是每一個構建模塊的簡要描述。
元素
元素是 XML 以及 HTML 文檔的主要構建模塊。
HTML 元素的例子是 "body" 和 "table"。
XML 元素的例子是 "note" 和 "message" 。
元素可包含文本、其餘元素或者是空的。
空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
例:
<body>body text in between</body>
<message>some message in between</message>

屬性
屬性可提供有關元素的額外信息。
屬性老是被置於某元素的開始標籤中。
屬性老是以名稱/值的形式成對出現的。
下面的 "img" 元素擁有關於源文件的額外信息:
<img src="computer.gif" />元素的名稱是 "img"。屬性的名稱是 "src"。屬性的值是 "computer.gif"。
因爲元素自己爲空,它被一個 " /" 關閉。

實體
實體是用來定義普通文本的變量。實體引用是對實體的引用。
大多數同窗都瞭解這個 HTML 實體引用:"&nbsp;"。
這個「無折行空格」實體在 HTML 中被用於在某個文檔中插入一個額外的空格。
當文檔被 XML 解析器解析時,實體就會被展開。
下面的實體在 XML 中被預約義:
實體引用 字符
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

PCDATA(用於元素) 的意思是被解析的字符數據(parsed character data)。
可把字符數據想象爲 XML 元素的開始標籤與結束標籤之間的文本。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
文本中的標籤會被看成標記來處理,而實體會被展開。
不過, 被解析的字符數據不該當包含任何 &、< 或者 > 字符;須要使用 &amp;、&lt; 以及 &gt; 實體來分別替換它們。
CDATA(用於屬性)
CDATA 的意思是字符數據(character data)。
CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被看成標記來對待,其中的實體也不會被展開。

DTD - 元素

在 DTD 中,XML 元素經過元素聲明來進行聲明。
元素聲明使用下面的語法:
<!ELEMENT 元素名稱 類別> 或者   <!ELEMENT 元素名稱 (元素內容)>

元素類別: web

EMPTY-該元素不能包含子元素和文本,但能夠有屬性-(空元素) spa

ANY-該元素能夠包含任何在DTD中定義的元素內容 code

#PCDATA-能夠包含任何字符數據,可是不能在其中包含任何子元素 orm

純元素類型-只包含子元素,而且這些子元素外沒有文本 xml

混合類型-包含子元素和文本數據的混合對象

空元素
空元素經過類別關鍵詞EMPTY進行聲明:
<!ELEMENT 元素名稱 EMPTY>
例: <!ELEMENT br EMPTY>
XML例子: <br />
只有 PCDATA 的元素
只有 PCDATA 的元素經過圓括號中的 #PCDATA 進行聲明:
<!ELEMENT 元素名稱 (#PCDATA)>
例: <!ELEMENT from (#PCDATA)>
帶有任何內容的元素
經過類別關鍵詞 ANY 聲明的元素,可包含任何可解析數據的組合:
<!ELEMENT 元素名稱 ANY>
例: <!ELEMENT note ANY>
    
    
    
    
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE note [<!ELEMENT note (to,from*)><!ELEMENT to ANY><!ELEMENT from (#PCDATA)>]><note> <to><from>X</from></to></note>
帶有子元素(序列)的元素
帶有一個或多個子元素的元素經過圓括號中的子元素名進行聲明:
<!ELEMENT 元素名稱 (子元素名稱 1)>
或者
<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>
例: <!ELEMENT note (to,from,heading,body)>
當子元素按照由逗號分隔開的序列進行聲明時,這些子元素必須按照相同的順序出如今文檔中。
在一個完整的聲明中,子元素也必須被聲明,同時子元素也可擁有子元素。
"note" 元素的完整聲明是:
    
    
    
    
<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>
聲明只出現一次的元素
<!ELEMENT 元素名稱 (子元素名稱)>
例: <!ELEMENT note (message)>
上面的例子聲明瞭:message 子元素必須出現一次,而且必須只在 "note" 元素中出現一次。
聲明最少出現一次的元素
<!ELEMENT 元素名稱 (子元素名稱+)>
例: <!ELEMENT note (message+)>
上面的例子中的加號聲明瞭:message 子元素必須在 "note" 元素內出現至少一次。
聲明出現零次或屢次的元素
<!ELEMENT 元素名稱 (子元素名稱*)>
例: <!ELEMENT note (message*)>
上面的例子中的星號聲明瞭:子元素 message 可在 "note" 元素內出現零次或屢次。
聲明出現零次或一次的元素
<!ELEMENT 元素名稱 (子元素名稱?)>
例: <!ELEMENT note (message?)>
上面的例子中的問號聲明瞭:子元素 message 可在 "note" 元素內出現零次或一次。
聲明「非.../既...」類型的內容
例: <!ELEMENT note (to,from,header,(message|body))>
上面的例子聲明瞭:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
聲明混合型的內容
例: <!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子聲明瞭:"note" 元素可包含出現零次或屢次的 PCDATA、"to"、"from"、"header" 或者 "message"。
    
    
    
    
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE note [<!ELEMENT note (#PCDATA|to|from|header|message)*><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT header (#PCDATA)><!ELEMENT message (#PCDATA)>]><note> abc <to>to</to> <from>from</from> def</note>

符號 圖片

用途 ci

示例 文檔

示例說明 get

(  )

用來給元素分組

(古龍|金庸|梁羽生),(王朔|餘傑),毛毛

分紅三組

|

在列出的對象中選擇一個

(男人|女人)

表示男人或者女人必須出現,二者選一

+

該對象最少出現一次,能夠出現屢次 (1或屢次)

(成員+

表示成員必須出現,並且能夠出現多個成員

*

該對象容許出現零次到任意屢次(0到屢次)

(愛好*

愛好能夠出現零次到屢次

?

該對象能夠出現,但只能出現一次 (01)

(菜鳥?

菜鳥能夠出現,也能夠不出現,若是出現的話,最多隻能出現一次

,

對象必須按指定的順序出現

(西瓜,蘋果,香蕉)

表示西瓜、蘋果、香蕉必須出現,而且按這個順序出現


DTD - 屬性

在 DTD 中,屬性經過 ATTLIST 聲明來進行聲明。
屬性聲明使用下列語法:
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
DTD 實例:
<!ATTLIST payment type CDATA "check">
XML 實例:
<payment type="check" />
如下是屬性類型的選項:
類型 描述
CDATA 值爲字符數據 (character data)
(en1|en2|..) 此值是枚舉列表中的一個值
ID 值爲惟一的 id
IDREF 值爲另一個元素的 id
IDREFS 值爲其餘 id 的列表,以空格分隔
NMTOKEN 值爲合法的 XML 名稱,NMTOKEN是CDATA的一個子集,表示屬性值必須是英文字母、數字、句號、破折號、下劃線或冒號,屬性值不能含有空格
NMTOKENS 值爲合法的 XML 名稱的列表,NMTOKENS與NMTOKEN相似,包含多個由空格分隔的字符
ENTITY 值是一個實體
ENTITIES 值是一個實體列表
屬性的默認值
解釋
屬性的默認值
#REQUIRED 屬性值是必需的
#IMPLIED 屬性不是必需的
#FIXED value 屬性值是固定的
規定一個默認的屬性值
例:
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:  <square width="100" />
在上面的例子中,"square" 被定義爲帶有 CDATA 類型的 "width" 屬性的空元素。若是寬度沒有被設定,其默認值爲0 。
#IMPLIED
語法: <!ATTLIST 元素名稱 屬性名稱 屬性類型 #IMPLIED>
例:
DTD:  <!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:  <contact fax="555-667788" />
合法的 XML:  <contact />
假如您不但願強制做者包含屬性,而且您沒有默認值選項的話,請使用關鍵詞 #IMPLIED。
#REQUIRED
語法: <!ATTLIST 元素名稱 屬性名稱 屬性類型 #REQUIRED>
DTD:  <!ATTLIST person number CDATA #REQUIRED>
合法的 XML:  <person number="5677" />
非法的 XML:  <person />
假如您沒有默認值選項,可是仍然但願強制做者提交屬性的話,請使用關鍵詞 #REQUIRED。
#FIXED
語法: <!ATTLIST 元素名稱 屬性名稱 屬性類型 #FIXED "value">
DTD:  <!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:  <sender company="Microsoft" />
非法的 XML:  <sender company="W3School" />
若是您但願屬性擁有固定的值,並不容許改變這個值,請使用 #FIXED 關鍵詞。
若是使用了不一樣的值,XML 解析器會返回錯誤。
列舉屬性值
語法: <!ATTLIST 元素名稱 屬性名稱 (en1|en2|..) 默認值>
DTD :  <!ATTLIST payment type (check|cash) "cash">
XML :  <payment type="check" />  或者  <payment type="cash" />
若是您但願屬性值爲一系列固定的合法值之一,請使用列舉屬性值。
定義ENTITY和ENTITIES類型的屬性其屬性值只能是未解析的實體,與外部數據相連。如圖像文件,音像文件等。
注意:
一旦聲明某個屬性的類型是entity或entities,就意味着該屬性值只能是一個或多個未解析的實體,而不是已經解析的實體。對於未解析的實體而言,不能經過普通實體引用方式去引用,他們只能做爲entity或entities類型的屬性值。


DTD - 實體

實體是用於定義引用普通文本或特殊字符的快捷方式的變量。
          實體是包含了文檔片斷的虛擬存儲單元,可用來存儲XML聲明、DTD、其餘形式的文本及二進制數據等。簡單來說就是一段代碼或數據的代稱,這個代稱即爲實體 的名字。
          當須要在文檔中引用某段代碼或數據時,能夠引用與段代碼或數據相對應的實體名稱來代替實體的具體內容。具備正確性檢查功能的XML處理器在提交文檔給最終應用程序以前或在顯示文檔之前,將先把全部不一樣的實體引用替換爲與其對應的具體內容,從而構成一個結構完整的文檔。

          按照實體的具體內容來分類,實體可分爲可解析與不可解析兩類。可解析實體的具體內容爲簡單的字符、數字、文本塊,而不可解析實體的具體內容則爲圖片、聲音等二進制文件。
          按照邏輯存儲來分類,實體可分爲內部實體與外部實體兩類。內部實體的內容是在文檔內部設定的;而外部實體則是一個外部獨立的物理存儲對象,如某個外部文件。
          按照使用的範圍來分類,實體可分爲通常實體與參數實體兩類。通常實體都用來構成文檔的具體內容,可出如今XML文檔中,也可出如今DTD中;而參數實體只能出如今DTD中,不能出如今XML文檔中
實體引用是對實體的引用。
實體可在內部或外部進行聲明。
一個內部實體聲明
語法: <!ENTITY 實體名稱 "實體的值">
例: DTD:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML:  <author>&writer;&copyright;</author>
註釋: 一個實體由三部分構成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。
一個外部實體聲明
語法: <!ENTITY 實體名稱 SYSTEM "URI/URL">例子:
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">XML 例子:
<author>&writer;&copyright;</author>

類型

普通實體

參數實體

使用場合

用在XML文檔中

只用在DTD中元素和屬性的聲明中

聲明方式

內部

<!ENTITY 實體名 "文本內容">

<!ENTITY % 實體名 "文本內容">

外部

<!ENTITY 實體名 SYSTEM"外部文件URL地址">

<!ENTITY % 實體名 SYSTEM "外部文件URL地址">

引用方式

&實體名;

%實體名;

參數實體
 F:\dream\聖思園\Web.Service\note.dtd
    
    
    
    
<?xml version="1.0" encoding="UTF-8"?><!ENTITY % p "to"><!ELEMENT %p; (#PCDATA)><!ATTLIST %p; addr CDATA #FIXED 'sp'>
     
     
     
     
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE note SYSTEM "F:\dream\聖思園\Web.Service\note.dtd"[<!ELEMENT note (to) >]><note> <to addr = "sp">nn</to></note>

DTD - 符號

NOTATION   主要是用來代表文檔中須要來自外部源的數據,而該數據XML自己是不能進行解析的,好比各類格式的二進制文件(好比圖形文件、聲音文件等),須要外部的應用程序進行處理。
NOTATION  聲明的語法格式以下:
  <!NOTATION NAME ExternalID>
 須要注意的是NAME必須由字母、數字、句點、破折號或冒號組成,而且第一個字符必須爲字母或者是下劃線。下面的例子表示GIF圖象做爲不解析的外部內容。
       
       
       
       
<?xml version="1.0" encoding="UTF-8"?><!NOTATION gif SYSTEM "iexplore.exe"><!ENTITY logo SYSTEM "http://web/category/sg.gif" NDATA gif><!-- 這裏NDATA表示XML不解析該數據 --><!ELEMENT PIC EMPTY><!ATTLIST PIC loc ENTITY #REQUIRED>
而後,在具體的實例化文檔中包含下面一行代碼:
  <PIC loc="&logo;" /> 
根據DTD定義,loc屬性值是一個不解析的實體。解析器能夠根據DTD定義知道這一點,而後它就不對其進行解析,也不會象解析實體同樣把它包括到XML文檔裏面。同時,XML解析器將通知iexplore.exe該引用的存在。





相關文章
相關標籤/搜索