XML文件的約束:什麼叫約束呢?顧名思義,就是對xml文件的內容進行按照既定規則的限制。我們知道,因為xml文件的標簽是可以自定義的,而往往我們用xml文件都是為了表達一定的數據集合(即小型的資料庫),而眾所周知的,資料庫也是分類型的,如學生資料庫,就包含了一系列的諸如name,age,studen ...
XML文件的約束:什麼叫約束呢?顧名思義,就是對xml文件的內容進行按照既定規則的限制。我們知道,因為xml文件的標簽是可以自定義的,而往往我們用xml文件都是為了表達一定的數據集合(即小型的資料庫),而眾所周知的,資料庫也是分類型的,如學生資料庫,就包含了一系列的諸如name,age,studentid,grade等等元素,如果沒有約束,在這樣的學生資料庫中添加了諸如cat,foot等等與之毫不相干的元素,就破壞了我們利用xml文件作為規定數據傳輸的嚴謹性,所以W3C對xml提供了兩種約束來限定xml的元素內容:DTD約束和Schema約束。
一、DTD約束:
(1)dtd的元素約束
DTD(Document Type Definition),文檔類型定義,用來約束XML文檔。dtd是平面式文檔,dtd文件不是xml文檔,通常擴展名為“.dtd”。它是最早的xml約束;例如要求xml文檔的根元素必須是<students>,在<students>元素下可以包含0~n個<student>元素,每個<student>元素必須有一個number屬性,而且還要有三個子元素,分別為<name>、<age>、<sex>,這三個子元素的內容必須為文本內容,而不能是子元素。
格式展示:
<!ELEMENT students (student+)> <!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)>
DTD約束的格式如上所示,dtd對元素的約束分為兩種:一種是對簡單元素的約束;另一種是對複雜元素的約束;
簡單元素的約束格式:<!ELEMENT 簡單元素名 (#PCDATA)>
(#PCDATA)代表一種約束格式,意思是簡單元素的內容為文本,即字元串的形式
其他約束:EMPTY:代表元素內容為空,例如:<stu/>
ANY:代表元素內容可以為任意元素
複雜元素的約束格式:<!ELEMENT 複雜元素名 (子元素名)>
<!ELEMENT students (student+)>中,代表students的子元素是student元素,並且不止一個,該處的"+"是一個數量控制符
數量控制符:"+":代表該元素出現一次或者多次
"?":代表該元素出現0次或者1次
"*":代表該元素出現0次或者多次
<!ELEMENT student (name,age,sex)>中,代表student元素的子元素包含name,age,sex三個子元素,且三個子元素出現的順序必須是name-->age-->sex,否則就會出錯。故,此處","逗號代表子元素出現的順序。此處,除了","逗號,還可以有"|"單豎線,表示student的子元素中只能出現它們三個中的其中一個
所謂的複雜和簡單元素,即是否包含子元素。
(2)DTD文件在xml中如何引用
3種方式:
1):引入外部的dtd文件
<!DOCTYPE 根元素名稱 SYSTEM "dtd文件路徑">
2):在xml文件內容使用dtd約束
<!DOCTYPE 根元素名稱[ <!ELEMENT 元素名稱 (...)> < .......> ]>
3):使用外部的dtd文件(網路上的)
<!DOCTYPE 根元素名稱 PUBLIC "dtd文件名稱" "dtd文檔url">
(3)DTD的屬性約束
dtd約束除了可以對元素進行約束外,還可以對元素的屬性進行約束,如
<!ATTLIST sutdent id CDATA #REQUIRED sex (男|女) #IMPLIED school CDATA #FIXED "xx小學" >
屬性約束格式:
<!ATTLIST 元素名 屬性名1 屬性類型 設置說明 屬性名2 屬性類型 設置說明 ...>
ATTLIST代表Attribute List,即屬性集合
1):屬性的類型約束:
CDATA:屬性值為任意文本數據;
Enumerated:屬性值必須是枚舉列表中的一個;如第二行的(男|女),表示sex屬性必須是男或者女,不能為其他的值
ID:屬性值必須是唯一的,並且屬性值不能以數字開頭;一個元素最多只能有一個ID 屬性,ID屬性用來表示元素唯一性的唯一標識。ID屬性就相當與元素的身份證號,必須是唯一標識!
2):屬性的設置說明
#REQUIRED:表示屬性是必須的;
#IMPLIED:表示屬性是可選的,即這個屬性可以不給出;
#FIXED "xx":表示該屬性的值必須為xx
(4)DTD對實體的定義
所謂是實體,就是對一段內容或者一段代碼取一個名字,方便在其他地方引用
在xml文件中引用實體,用&實體名
格式:
<!ENTITY 實體名 "實體內容">
舉個列子:
<!ENTITY email "[email protected]"> <person> <name>張三</name> <!--此處的@email就相當於調用了"[email protected]"這個內容放到email標簽中 --> <email>&email</email> </person>
註:dtd對實體的定義最好定義在內部的dtd中,通過外部dtd定義的實體,在某些瀏覽器中不能相容