XML的兩種約束技術:dtd和schema

一、dtd約束技術

1.1 如何在xml中引入dtd

1、外部引入
可以將dtd的約束內容寫在外置的dtd文件中,這個文件後綴必須爲.dtd而文件保存時必須用utf-8編碼保存,再在xml文件中使用。
1) 如果寫的是SYSTEM表明當前引入的dtd在當前文件系統中,後面制定的文件位置是當前硬盤中的位置

    <!DOCTYPE 根元素名稱  SYSTEM 文件的位置>

2) 如果寫的是PUBLIC表明當前引入的dtd在網絡公共位置中,後面要指明dtd的名字和dtd所在網絡位置URL地址

<!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD文件的URL">

2、內部引入
直接在xml中書寫dtd

     <!DOCTYPE 根元素名稱[
        dtd約束....
      ]>

1.2 dtd語法

1、元素

     <!ELEMENT 元素名稱 元素約束>

元素約束:
存放類型:ANY/EMPTY
1)子元素的列表,將可以包含的子元素用小括號括起來
2)子元素之間可以使用逗號進行分割,表明子元素必須按照順序出現
3)子元素之間可以使用豎線進行分割,表面子元素出現其中之一

    #PCDATA 表明包含標籤體
    + 表示一次或多次
    * 0次或多次
    ? 0次或一次

也可以使用小括號進行組的操作

2、屬性

    <!ATTLIST 元素名 
            屬性名 屬性類型 屬性約束
            屬性名2 屬性類型  屬性約束
            ......
    >

屬性類型:

CDATA:表示屬性的值是一個普通字符串
ENUMERATED : 屬性的值是一個枚舉列表中的值
ID: 表明屬性的值必須在整個文檔中都是唯一的,如果有重複的id則校驗不通過,ID 屬性的值只能由字母,下劃線開始,不能使用數字,不能出現空白字符

屬性約束:

    #REQUIRED  ---  表明當前屬性是一個必須存在的屬性,如果這樣的屬性不存在則在校驗時會報錯
    #IMPLIED --- 表明當前屬性是一個可選的屬性,可以有也可以沒有
    #FIXED '固定值' --- 表明當前屬性具有一個固定值,這樣的屬性不需要進行賦值,自動就會取這個固定值爲值.如果這樣的屬性指定了一個不是固定值的值則校驗報錯
    '默認值'  ---  表明當前屬性具有一個默認值,如果給了其他的值就用其他值,如果沒有給值則取這個默認值

3、ENTITY(實體)
<!ENTITY >,就是對一大段內容的引用,可以簡化代碼的複用

引用實體:在xml中引用的實體叫做引用實體

    <!ENTITY 實體名稱 “實體內容” >
            &實體名稱;

參數實體:在dtd中引用的實體叫做參數實體

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

二、schema約束技術

2.1 schema與dtd的不同

XML Schema 也是一種用於定義和描述 XML 文檔結構與內容的模式語言,其出現是爲了克服 DTD 的侷限性。

Schema與 DTD的比較:
1. XML Schema符合XML語法結構。DOM、SAX等XML API很容易解析出XML Schema文檔中的內容。
2. XML Schema對名稱空間支持得非常好。
3. XML Schema比XML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。
4. XML Schema定義約束的能力非常強大,可以對XML實例文檔作出細緻的語義限制。
5. XML Schema不能像DTD一樣定義實體,比DTD更復雜,但Xml Schema現在已是w3c組織的標準,它正逐步取代DTD。

XML Schema 文件自身就是一個XML文件,但它的擴展名通常爲.xsd。一個XML Schema文檔通常稱之爲模式文檔(約束文檔),遵循這個文檔書寫的xml文件稱之爲實例文檔。和XML文件一樣,一個XML Schema文檔也必須有一個根結點,但這個根結點的名稱爲Schema。編寫了一個XML Schema約束文檔後,通常需要把這個文件中聲明的元素綁定到一個URI地址上,在XML Schema技術中有一個專業術語來描述這個過程,即把XML Schema文檔聲明的元素綁定到一個名稱空間上,以後XML文件就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文檔中編寫的元素來自哪裏,被誰約束。

2.2 schema中的名稱空間

在XML Schema中,每個約束模式文檔都可以被賦以一個唯一的名稱空間,名稱空間用一個唯一的URI(Uniform Resource Identifier,統一資源標識符)表示。 在Xml文件中書寫標籤時,可以通過名稱空間聲明(xmlns),來聲明當前編寫的標籤來自哪個Schema約束文檔。如:

    <itcast:書架 xmlns:itcast=“http://www.itcast.cn”>
        <itcast:書>……</itcast:書>
    </itcast:書架>

此處使用itcast來指向聲明的名稱,以便於後面對名稱空間的引用。注意:名稱空間的名字語法容易讓人混淆,儘管以 http:// 開始,那個 URL 並不指向一個包含模式定義的文件。事實上,這個 URL:http://www.itcast.cn根本沒有指向任何文件,只是一個分配的名字。

XML中使用名稱空間引入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屬性時,也需要指定該屬性來自哪裏。

2.3 schema的語法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章