用DTD驗證XML

1.內部DTD
      
最簡單的使用DTD的方法是在XML文件的序言部分加入一個DTD描述,加入的位置是緊接在XML處理指示之後。一個包含DTDXML文件的結構爲:

   <?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 根元素名[
    元素描述
    ]
>
文件體.

一個完整的XML文件爲:2.  外部DTD
       
一個DTD既可以是內部的,包含在一個“形式良好的”XML文件中(standalone=yes”);也可以是外部的,作爲一個外部文件被引用(standalone=no”)。
       
外部DTD的好處是:它可以方便高效地被多個XML文件所共享。你只要寫一個DTD文件,就可以被多個XML文件所引用。事實上,當許多組織需要統一它們的數據交換格式時,它們就是通過外部DTD來完成的。這樣做不僅簡化了輸入工作,還保證當你需要對DTD做出改動時,不用一一去改每個引用了它的XML文件,只要改一個公用的DTD文件就足夠了.
       
爲了引用一個外部DTD,必須修改XML聲明和DOCTYPE聲明。XML聲明中必須說明這個文件不是自成一體的,即standalone屬性的屬性值不再是yes了。       DOCTYPE聲明中,應該加入SYSTEM屬性:  例如:上面的URL是一個絕對路徑,除此以外,它還可以是一個相對路徑,如:它說明這個DTD文件和引用它的XML文件在同一個目錄下。或者,這個DTD文件還可能在XML文件的父目錄的子目錄DTD下,表示爲:使用這種方法,你可以方便地把DTD文件從你的XML文件中分離出來,粘貼到另一個文件fclml.dtd中。這樣,你就得到一個DTD文件和一個有效的XML文件。

<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
        <!ELEMENT 聯繫人列表 (聯繫人)*
>
        
<!ELEMENT 聯繫人 (姓名,ID,公司,EMAIL,電話,地址)>
        
<!ELEMENT 地址 (街道,城市,省份)>
        
<!ELEMENT 姓名 (#PCDATA)>
        
<!ELEMENT ID (#PCDATA)>
        
<!ELEMENT 公司 (#PCDATA)>
        
<!ELEMENT EMAIL (#PCDATA)>
        
<!ELEMENT 電話 (#PCDATA)>
        
<!ELEMENT 街道 (#PCDATA)>
        
<!ELEMENT 城市 (#PCDATA)>
        
<!ELEMENT 省份 (#PCDATA)>
    ]>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>

<聯繫人列表>
  
<聯繫人>
    
<姓名>張三</姓名>
    
<ID>001</ID>
    
<公司>A公司</公司>
    
<EMAIL>[email protected]</EMAIL>
    
<電話>(010)62345678</電話>
    
<地址>
      
<街道>五街1234號</街道>
      
<城市>北京市</城市>
      
<省份>北京</省份>
    
</地址>
  
</聯繫人>

  
<聯繫人>
    
<姓名>李四</姓名>
    
<ID>002</ID>
    
<公司>B公司</公司>
    
<EMAIL>[email protected]</EMAIL>
    
<電話>(021)87654321</電話>
    
<地址>
      
<街道>南京路9876號</街道>
      
<城市>上海市</城市>
      
<省份>上海</省份>
    
</地址>
  
</聯繫人>
</聯繫人列表>

 

<?xml version = "1.0" 
      encoding="GB2312" 
      standalone = "no"
?>

 

<!DOCTYPE 根元素名
SYSTEM "外部DTD文件的URL"
>

 

<!DOCTYPE 聯繫人列表
SYSTEM "http://www.mydomain.com/dtds/fclml.dtd
"
>

 

<!DOCTYPE 聯繫人列表
SYSTEM "fclml.dtd"
>

 

!DOCTYPE 聯繫人列表
SYSTEM "../dtds/fclml.dtd"
>

 

仍然回到前面那個包含客戶聯繫方式信息的XML文件,如果使用外部DTD,其形式應該變爲下面這個樣子。DTD文件fclml.dtdXML文件client.xml:3. 公用DTD
       
使用外部DTD時,要在DOCTYPE中使用關鍵字SYSTEM。實際上,SYSTEM不是引用外部DTD的唯一方法,這個關鍵字主要用於引用一個作者或組織所編寫的衆多XML文件中通用的DTD。還存在一種外部DTD,它是一個由權威機構制訂的,提供給特定行業或公衆使用的DTD。因此,另一個引用外部DTD的辦法是使用關鍵字PUBLIC,引用這一類公開給公衆使用的DTD
    
引用公共DTD的形式爲:

<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT 聯繫人列表 (聯繫人)*>
<!ELEMENT 聯繫人 (姓名,ID,公司,EMAIL,電話,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 電話 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>

 

<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 聯繫人列表
    SYSTEM "fclml.dtd"
>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>

<聯繫人列表>
<聯繫人>
<姓名>張三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>[email protected]</EMAIL>
<電話>(010)62345678</電話>
<地址>
<街道>五街1234號</街道>
<城市>北京市</城市>
<省份>北京</省份>
<ZIP>100001</ZIP>
</地址>
</聯繫人>

<聯繫人>
<姓名>李四</姓名>
<ID>002</ID>
<公司>B公司</公司>
<EMAIL>[email protected]</EMAIL>
<電話>(021)87654321</電話>
<地址>
<街道>南京路9876號</街道>
<城市>上海</城市>
<省份>上海</省份>
<ZIP>200002</ZIP>
</地址>
</聯繫人>
</聯繫人列表>

 

 

<!DOCTYPE 根元素 PUBLIC "DTD名稱" "外部DTD的URL">

4.元素的定義
一個DTD不僅要告訴語法分析器它所關聯的XML文件的根元素是什麼,而且還要告訴語法分析器文件的內容和結構,說清文件結構中的每一個細節。爲了定義這些細節,我們必須展開DTD中元素說明部分,使用元素類型聲明(ETD)來聲明所有有效的文件元素。ETD應該採用如下的結構:

<!ELEMENT 元素名 元素內容描述>

一個具體例子:

<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 聯繫人列表[
    <!ELEMENT 聯繫人列表 ANY
>
    
<!ELEMENT 聯繫人(姓名)>
    
<!ELEMENT 姓名(#PCDATA)>    
    ]>

<聯繫人列表>
    
<聯繫人>
        
<姓名>張三</姓名>
    
</聯繫人>
</聯繫人列表>

元素定義是由它們的元素內容模型(ECM)來描述的,也就是說,是由緊跟元素後面的括號中的內容來定義的。元字符的定義:

元 字 符含    義
+ 出現一次或多次
* 出現零次或多次
可選,不出現或出現一次
() 一組要共同匹配的表達式
| OR,或
AND,要求嚴格遵從順序要求
元素A
元素B
元素C
元素列表,無須遵從順序要求

 注意:在一個組中,只允許使用一種連接符(例如“,”或“|”)。因此,象下面這樣定義的DTD是不合法的:

<!ELEMENT 聯繫人(姓名,電話|EMAIL)>

要想使用多種連接符,只有通過創建子組的方式,使用:

<!ELEMENT 聯繫人(姓名,(電話|EMAIL))>


5.元素的屬性
 
在DTD中定義屬性時,我們使用下面的格式:
 

<!ATTLIST 元素名 (屬性名 屬性類型 缺省值)*>
  • 必須賦值的屬性
    關鍵字REQUIRED說明XML文件中必須爲這個屬性給出一個屬性值。例如,假設你想定義一個"頁面作者"元素,並把這個元素加入所有網站中的每一個頁面。之所以定義這個元素,是爲了頁面編輯者能夠提供他的聯繫信息,以便當發現頁面錯誤或無效鏈接時,可以及時地通知他。在這種情況下,每個頁面作者都有不同的個人信息,所以你無法事先知道應該用什麼作爲缺省值,但你又的確需要提供每個人的信息。這時候,你就可以把與聯繫信息相關的屬性定義爲必須的(REQUIRED),而且不用提供缺省值。
  • 屬性值可有可無的屬性
    當使用IMPLIED關鍵字時,文法解釋器不再強行要求你在XML文件中給該屬性賦值,而且也無須在DTD中爲該屬性提供缺省值。可以說,這是對屬性值有無的最低要求,現實中經常用到。
  • 固定取值的屬性
    還有一種特殊情況,你需要爲一個特定的屬性提供一個缺省值,並且不希望XML文件的編寫者把你的缺省值替代掉。這時候,就應該使用FIXED關鍵字,同時爲該屬性提供一個缺省值。
  • 定義缺省值的屬性
    如果不使用上面任何一種關鍵字的話,該種屬性就是屬於這種類型。對於這種屬性,你需要在DTD中爲它提供一個缺省值。而在XML文件中可以爲該屬性給出新的屬性值來覆蓋事先定義的缺省值,也可以不另外給出屬性值,後一種情況下它就默認爲採用DTD中給出的缺省值。

  視實際情況而選擇,給出一個實際的例子: 

<!ATTLIST 頁面作者 
        姓名 #CDATA #IMPLIED 
        年齡 #CDATA #IMPLIED 
        聯繫信息 #CDATA #REQUIRED 
        網站職務 #CDATA #FIXED "頁面作者" 
        個人愛好 #CDATA "上網"
>

       另外還有屬性的類型:

CDATA Enumerated ID IDREF IDREFS ENTITY ENTITIES NMTOKEN NMTOKENS NOTATION

參數實體專門用在DTD中。定義方式是:

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

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

引用方式爲: %實體名;
使用參數實體,可以方便元素和屬性的聲明。例如:

<!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 地址">
<!ELEMENT 個人聯繫信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客戶聯繫信息 (%TAG_NAMES; | 公司名)>
發佈了3 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章