在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文件,但它的擴展名通常為.xsd。
一個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屬性時,也需要指定該屬性來自哪里。
原文:https://blog.csdn.net/ruanjian_10suo/article/details/8057495