XML的約兩種約束——DTD、Schema
在XML技術裡,可以編寫一個文件來約束一個XML文件的書寫規範,這稱之為XML約束。
常用的約束技術XML DTD ;XML Schema。XML Schema 也是一種用於定義和描述 XML 文件結構與內容的模式語言,其出現是為了克服 DTD 的侷限性
XML Schema VS DTD:
XML Schema符合XML語法結構。
DOM、SAX等XML API很容易解析出XML Schema文件中的內容。
XML Schema對名稱空間支援得非常好。
XML Schema比XML DTD支援更多的資料型別,並支援使用者自定義新的資料型別。
XML Schema定義約束的能力非常強大,可以對XML例項文件作出細緻的語義限制。
XML Schema不能像DTD一樣定義實體,比DTD更復雜,但Xml Schema現在已是w3c組織的標準,它正逐步取代DTD。
DTD(Document Type Definition),全稱為文件型別定義。
XML檔案使用 DOCTYPE 宣告語句來指明它所遵循的DTD檔案,DOCTYPE宣告語句有兩種形式:
一、當引用的檔案在本地時,採用如下方式:
<!DOCTYPE 文件根結點 SYSTEM "DTD檔案的URL">
例如: <!DOCTYPE 書架 SYSTEM “book.dtd”>。在xml檔案中手寫一下。
二、當引用的檔案是一個公共的檔案時,採用如下方式:
<!DOCTYPE 文件根結點 PUBLIC "DTD名稱" "DTD檔案的URL">
DTD語法:元素定義、屬性定義、實體定義。
宣告一個XML元素——<!ELEMENT 元素名稱 元素型別>
元素型別可以是元素內容、或型別<!ELEMENT >
在元素內容中也可以使用+、*、?等符號表示元素出現的次數:
+: 一次或多次 (書+)
?: 0次或一次 (書?)
*: 0次或多次 (書*)
xml文件中的標籤屬性需通過ATTLIST為其設定屬性
語法格式:
<!ATTLIST 元素名
屬性名1 屬性值型別 設定說明
屬性名2 屬性值型別 設定說明
……
>
設定說明:
#REQUIRED:必須設定該屬性
#IMPLIED:可以設定也可以不設定
#FIXED:說明該屬性的取值固定為一個值,在 XML 檔案中不能為該屬性設定其它值。但需要為該屬性提供這個值
直接使用預設值:在 XML 中可以設定該值也可以不設定該屬性值。若沒設定則使用預設值。
常用屬性值型別
CDATA:表示屬性值為普通文字字串。
ENUMERATED
ID
ENTITY(實體)
實體定義:
實體用於為一段內容建立一個別名,以後在XML文件中就可以使用別名引用這段內容了。
在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。
實體可分為兩種型別:引用實體和引數實體。
引用實體主要在 XML 文件中被應用
語法格式:
<!ENTITY 實體名稱 “實體內容” >:直接轉變成實體內容
引用方式:
&實體名稱;
在XML Schema技術中有一個專業術語來描述這個過程,即把XML Schema文件宣告的元素繫結到一個名稱空間上,以後XML檔案就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文件中編寫的元素來自哪裡,被誰約束。
一個XML Schema文件通常稱之為模式文件(約束文件),遵循這個文件書寫的xml檔案稱之為例項文件。
和XML檔案一樣,一個XML Schema文件也必須有一個根結點,但這個根結點的名稱為Schema。
編寫了一個XML Schema約束文件後,通常需要把這個檔案中宣告的元素繫結到一個URI地址上,
在XML Schema技術中有一個專業術語來描述這個過程,即把XML Schema文件宣告的元素繫結到一個名稱空間上,
以後XML檔案就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文件中編寫的元素來自哪裡,被誰約束。在XML Schema中,每個約束模式文件都可以被賦以一個唯一的名稱空間,
名稱空間用一個唯一的URI(Uniform Resource Identifier,統一資源識別符號)表示。
在Xml檔案中書寫標籤時,可以通過名稱空間宣告(xmlns),來聲明當前編寫的標籤來自哪個Schema約束文件。為了在一個XML文件中宣告它所遵循的Schema檔案的具體位置,通常需要在Xml文件中的根結點中使用schemaLocation屬性來指定,例如:
<itcast:書架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
schemaLocation此屬性有兩個值。第一個值是需要使用的名稱空間。第二個值是供名稱空間使用的 XML schema 的位置,兩者之間用空格分隔。
注意,在使用schemaLocation屬性時,也需要指定該屬性來自哪裡。
基本格式:
xmlns="URI"