參考: 方立勳老師的講課視訊.
什麼是XML限制
•在XML技術裡,可以編寫一個文檔來限制一個XML文檔的書寫規範,這稱之為XML限制。
為什麼需要XML限制
常用的限制技術
•XML DTD
•XML Schema
DTD(Document Type Definition),全稱為文檔類型定義
編寫DTD限制的兩種方式:
lDTD限制即可以作為一個單獨的檔案編寫,也可以在XML檔案内編寫。
XML檔案使用 DOCTYPE 聲明語句來指明它所遵循的DTD檔案,DOCTYPE聲明語句有兩種形式:
•當引用的檔案在本地時,采用如下方式:
<!DOCTYPE 文檔根結點 SYSTEM "DTD檔案的URL">
例如: <!DOCTYPE 書架 SYSTEM “book.dtd”>。在xml檔案中手寫一下。
•當引用的檔案是一個公共的檔案時,采用如下方式:
<!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD檔案的URL">
例如:<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
DTD限制文法細節
元素定義
屬性定義
實體定義
元素定義:
在DTD文檔中使用ELEMENT聲明一個XML元素,文法格式如下所示:
<!ELEMENT 元素名稱 元素類型>
元素類型可以是元素内容、或類型
•如為元素内容:則需要使用()括起來,如
<!ELEMENT 書架 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
•如為元素類型,則直接書寫,DTD規範定義了如下幾種類型:
•EMPTY:用于定義空元素,例如<br/> <hr/>
•ANY:表示元素内容為任意類型。
元素内容中可以使用如下方式,描述内容的組成關系
•用逗号分隔,表示内容的出現順序必須與聲明時一緻。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
• 用|分隔,表示任選其一,即多個隻能出現一個
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
•元素内容使用空白符分隔,表示出現順序沒有要求:<!ELEMENT MYFILE (TITLE AUTHOR EMAIL)> *
l在元素内容中也可以使用+、*、?等符号表示元素出現的次數:
+: 一次或多次 (書+)
?: 0次或一次 (書?)
*: 0次或多次 (書*)
也可使用圓括号( )批量設定,例
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
屬性定義:
xml文檔中的标簽屬性需通過ATTLIST為其設定屬性
文法格式:
<!ATTLIST 元素名
屬性名1 屬性值類型 設定說明
屬性名2 屬性值類型 設定說明
……
>
屬性聲明舉例:
<!ATTLIST 商品
類别 CDATA #REQUIRED
顔色 CDATA #IMPLIED
>
對應XML檔案:
<商品 類别="服裝" 顔色="黃色">…</商品>
<商品 類别="服裝">…</商品>
設定說明:
•#REQUIRED:必須設定該屬性
•#IMPLIED:可以設定也可以不設定
•#FIXED:說明該屬性的取值固定為一個值,在 XML 檔案中不能為該屬性設定其它值。但需要為該屬性提供這個值
直接使用預設值:在 XML 中可以設定該值也可以不設定該屬性值。若沒設定則使用預設值。
舉例:
常用屬性值類型:
CDATA:表示屬性值為普通文本字元串。
ENUMERATED
ID
ENTITY(實體)
屬性值類型ENUMERATED :
屬性的類型可以是一組取值的清單,在 XML 檔案中設定的屬性值隻能是這個清單中的某個值(枚舉)
屬性值類型ID :
表示屬性的設定值為一個唯一值。ID 屬性的值隻能由字母,下劃線開始,不能出現空白字元
實體定義:
實體用于為一段内容建立一個别名,以後在XML文檔中就可以使用别名引用這段内容了。
在DTD定義中,一條<!ENTITY …>語句用于定義一個實體。
實體可分為兩種類型:引用實體和參數實體。
引用實體:
引用實體主要在 XML 文檔中被應用
文法格式:
•<!ENTITY 實體名稱 “實體内容” >:直接轉變成實體内容
引用方式:
&實體名稱;
參數實體:
參數實體被 DTD 檔案自身使用
<!ENTITY % 實體名稱 "實體内容" >
引用方式:
%實體名稱;
舉例1:
舉例2: