文檔類型定義DTD


XML系列:文檔類型定義DTD

一,什麼是DTD?
 1,XMl是一種元標記語言,是描敘語言的語言,定義標記的語法結構,從而生成新標記。而DTD則是爲新標記建立文檔並進行規範說明。
  也就是說XML定義標記的語法結構是通過DTD來定義,並指定文檔結構的規範,而XML文檔來使用標記。
 2,自描述數據的規範。
 
二,DTD的作用
 1,DTD定義了文檔中的元素(標記和屬性)和實體,以及相互關係。數據和結構分離。
 2,通過DTD驗證XML文檔的有效性。DTD爲解析器提供瞭解析XML文檔的依據。所以每個XML文檔必須指定對於哪個DTD有效。

三,DTD的結構
 1,元素的聲明:使用元素聲明來聲明XML文檔中的元素

  ⑴,帶有數據的元素:
   <! ELEMENT 元素名 (數據類型)>
   數據類型:
    #CDATA:指元素包含不通過解析器解析的字符數據。特殊字符和保留字不需要轉義。
    #PCDATA:指元素包括解析器可解析字符數據。特殊字符和保留字需要轉義纔可以通過解析器。
    ANY:元素可以包含任何聲明類型的子元素和字符數據。
  
  ⑵,帶有子元素的元素:
   <! ELEMENT 元素名  (子元素1名,子元素2名)>
    多個子元素用逗號隔開。
    在文檔中的順序和定義中的順序一致。
    子元素可以有自己的子元素。 
   
   ①相同元素只出現一次:
    <! ELEMENT 元素名 (子元素)>  
   ②相同元素至少出現一次:+
    <! ELEMENT 元素名 (子元素+)>  
   ③相同元素出現零次或多次:*
    <! ELEMENT 元素名  (子元素*)>
   ④相同元素出現零次或一次:?
    <! ELEMENT 元素名  (子元素?)>
  
  ⑶ ,空元素:
   <! ELEMENT 元素名 (EMPTY)>
    空元素可以有屬性
   
  ⑷,混合聲明
   組可以是序列或選擇子元素和/或子組:
    ①序列
     <! ELEMENT A (B)> : 元素A由單個子元素B組成.
     <! ELEMENT A (B, C)> :元素A由子元素B和C組成.
     <! ELEMENT A (B, (C | D), E> :元素A由子元素B ,E和選擇子組(C或D中之一)組成.
    ②選擇 子元素和/或子組
     <! ELEMENT A (B | C)>:元素A由子元素選擇子組(B或C)組成.
     <! ELEMENT A (B | C | (D, E))>:元素A由包括序列子組(D和E)的選擇(B或C或D,E之一)組成.

 2,屬性的聲明   
  ⑴空屬性
   <! ATTTLIST 元素名 EMPTY>
  ⑵非空屬性
   <! ATTLIST 元素名  屬性名  屬性類型  屬性值>
   屬性值:
    ①,Default屬性值:指定一個默認值
      <! ATTLIST 元素名  屬性名  屬性類型  "默認值" >
      DTD示例:
       <! ATTLIST  售價 貨幣單位 CDATA "人民幣">
      XML示例:
       <售價  貨幣單位 = "人民幣">10.90</售價>
    ②,Implied屬性值:可以不提供該屬性,該屬性也沒有默認值。
      <! ATTLIST 元素名  屬性名  屬性類型  #IMPLIED >
      DTD示例:
       <! ATTLIST  售價 貨幣單位 CDATA #IMPLIED>
      XML示例:
       <售價>10.90</售價>
       
    ③,Required屬性值:必須提供該屬性,但可以沒有默認值。
      <! ATTLIST 元素名  屬性名  屬性類型  #REQUIRED >
      DTD示例:
       <! ATTLIST  售價 貨幣單位 CDATA  #REQUIRED>
      XML示例:
       <售價 貨幣單位 = "美元">10.90</售價> 
            
    ④,Fixed屬性值:使屬性具有固定值,不可以更改。
      <! ATTLIST 元素名  屬性名  屬性類型  #FIXED  "固定值">
      DTD示例:
       <! ATTLIST  售價 貨幣單位 CDATA #FIXED "人民幣">
      XML示例:
       <售價  貨幣單位 = "人民幣">10.90</售價>
    
    屬性類型: 
    ①,Enumerated屬性類型:使默認值成爲一組固定值中之一。
      <! ATTLIST 元素名  屬性名   (固定值A|固定值B|...)    默認固定值之一>
      DTD示例:
       <! ATTLIST  售價 貨幣單位   ("人民幣"|"美元"|"歐元")  "人民幣">
      XML示例:
       <售價  貨幣單位 = "歐元">10.90</售價> 
              
    ②,ID和IDREF屬性類型
     1,ID:用於搜索某個元素的特定實例,每個元素都可以具有ID類型的屬性
      <! ATTLIST 元素名  屬性名  ID  屬性值>
      DTD示例:
       <! ATTLIST  售價 支付方式 ID  #REQUIRED>
      XML示例:
       <售價  ID = "BOOK1">10.90</售價>
       <售價  ID = "BOOK2">10.90</售價>
       <售價  ID = "BOOK3">10.90</售價>        
     2,IDREF:指向一個元素,引用其他元素中的一個元素。
      <! ATTLIST 元素名  屬性名  IDREF  屬性值>
      DTD示例:
       <! ATTLIST  售價 貨幣單位 ID  #REQUIRED>
       <! ATTLIST  售價 貨幣單位 IDREF  #IMPLIED>
       <! ATTLIST  售價 貨幣單位  CDATA   #IMPLIED>
      XML示例:
       <售價  ID = "BOOK1"  貨幣單位 = "人民幣">10.90</售價> 
       <售價  ID = "BOOK2" IDREF = "BOOK1"></售價>    
    ③,IDREFS屬性類型
      指向多個元素ID,用空格分開。用於指向XML文檔中的相關元素列表。
      <! ATTLIST 元素名  屬性名  IDREFS  屬性值>
      
四,使用DTD
 
 1,內部DTD
  XML聲明後在XDOCTYPE聲明中編寫內部DTD。
  <! DOCTYPE 根元素名 [
   元素聲明
   。。。
  ]>
 2,外部DTD
  編寫DTD文件,擴展名爲DTD,在XML文檔DOCTYPE聲明中添加DTD引用,告訴解析器外部DTD信息,
  <! DOCTYPE 根元素名  SYSTEM  "DTD文件名.dtd">
 
 3,DTD中的內部實體和外部實體和

  參見:XML系列:XML文檔結構 中的實體;
  
 4,DTD中的參數實體
  先用內部DTD聲明,把參數實體設置爲元素名 ,在XML文件中引用 外部DTD驗證。
  
  DTD文件
   ...
  <! ENTITY %實體名  "字符數據">
  <! ELEMENT  元素名  ( %實體名)>
  <! ELEMENT   %實體名  (子元素)>
   ...
  
  XML文件
   ...
  <! DOCTYPE 根元素名  SYSTEM  “DTD文件名.dtd”[
   <! ENTITY  %實體名  "替換實體名的元素名">
  ]>
   ...
 
 例子:不同元素的XML共同關聯一個DTD文件 
  
  DTD文件
    ...
  <! ENTITY %element  "e">
  <! ELEMENT  root  ( %element)>
  <! ELEMENT   %element  (name,sex,。。。)>
   ...
 
  XML文件1
   ...
  <! DOCTYPE root  SYSTEM  “DTD文件名.dtd”[
   <! ENTITY  %element  "student">
  ]>
  <root>
   <student>
    <name>張三學生</name>
     ...
   <student>
  </root>
  
  XML文件2
   ...
  <! DOCTYPE root  SYSTEM  “DTD文件名.dtd”[
   <! ENTITY  %element  "teatcher">
  ]>
  <root>
   <teatcher>
    <name>王五老師</name>
     ...
   <teatcher>
  </root> 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章