一、XML約束概述
1、什麼是XML約束?
- 在xml技術裏,可以編寫一個文檔來約束一個xml文檔的寫法,這稱之爲XML約束
2、XML約束的作用
- 約束xml文檔的寫法
- 對xml進行校驗
3、常見的XML約束技術
- XML DTD(Document Type Definition),全稱爲文檔類型定義
- XML Schema
二、DTD約束語法
1、元素定義
- 在DTD文檔中使用ELEMENT聲明一個XML元素,語法格式:<!ELEMENT 元素名稱 元素約束>
- 元素約束可以是元素內容、或存放類型
- 如爲元素內容:則需要使用()括起來,如:<!ELEMENT 書架 (書名,作者,售價)> <!ELEMENT 書名 (#PCDATA)>
- 如爲存放類型,則直接書寫,DTD規範定義瞭如下幾種類型:EMPTY:用於定義空元素,例如<br/> <hr/> ANY:表示元素內容爲任意類型。
- 元素內容中可以使用如下方式,描述內容的組成關係
- 用逗號分隔,表示內容的出現順序必須與聲明時一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)> 用|分隔,表示任選其一,即多個只能出現一個<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
- 在元素內容中也可以使用+、*、?等符號表示元素出現的次數:+: 一次或多次 (書+) ?: 0次或一次 (書?) *: 0次或多次 (書*)
- 也可使用圓括號( )批量設置,例<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
2、屬性定義
- dtd文檔中的標籤屬性需通過ATTLIST爲其設置屬性
-
語法格式: <!ATTLIST 元素名 屬性名1 屬性類型 屬性約束 屬性名2 屬性類型 屬性約束 …… > 屬性聲明舉例: <!ATTLIST 商品 類別 CDATA #REQUIRED 顏色 CDATA #IMPLIED > 對應XML文件: <商品 類別="服裝" 顏色="黃色">…</商品> <商品 類別="服裝">…</商品>
- 屬性約束:
- #REQUIRED:必須設置該屬性
- #IMPLIED:可以設置也可以不設置
- #FIXED:說明該屬性的取值固定爲一個值,在 XML 文件中不能爲該屬性設置其它值。使用該元素時無需爲其分配該屬性,XML處理器會自動爲給屬性增加固定值
- 直接使用默認值:在 XML 中可以設置該值也可以不設置該屬性值。若沒設置則使用默認值。
-
舉例: <!ATTLIST 頁面作者 姓名 CDATA #IMPLIED 年齡 CDATA #IMPLIED 聯繫信息 CDATA #REQUIRED 網站職務 CDATA #FIXED "頁面作者" 個人愛好 CDATA "上網" >
- 常用屬性類型
-
CDATA:表示屬性值爲普通文本字符串。 ENUMERATED 枚舉 ID唯一的id ENTITY(實體)
- 屬性值類型--ENUMERATED
- 屬性的類型可以是一組取值的列表,在 XML 文件中設置的屬性值只能是這個列表中的某個值(枚舉)
-
<?xml version = "1.0" encoding="GB2312" standalone="yes"?> <!DOCTYPE 購物籃 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉"> ]> <購物籃> <肉 品種="魚肉"/> <肉 品種="牛肉"/> <肉/> </購物籃>
- 屬性值類型-- ID,表示屬性的設置值爲一個唯一值,在整個xml中id不可重複
- ID 屬性的值只能由字母,下劃線開始,不能使用數字,不能出現空白字符
-
<?xml version = "1.0" encoding="gb2312" ?> <!DOCTYPE 聯繫人列表[ <!ELEMENT 聯繫人列表 ANY> <!ELEMENT 聯繫人 (姓名,EMAIL)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ATTLIST 聯繫人 編號 ID #REQUIRED> ]> <聯繫人列表> <聯繫人 編號="a1"> <姓名>張三</姓名> <EMAIL>[email protected]</EMAIL> </聯繫人> <聯繫人 編號="a2"> <姓名>李四</姓名> <EMAIL>[email protected]</EMAIL> </聯繫人> </聯繫人列表>
- 實體定義 ,實體用於爲一段內容創建一個別名,以後在XML文檔中就可以使用別名引用這段內容了
- 在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。
- 實體可分爲兩種類型:引用實體和參數實體
- 引用實體
- 引用實體主要在 XML 文檔中被應用
-
語法格式: <!ENTITY 實體名稱 “實體內容” >:直接轉變成實體內容 引用方式:&實體名稱; 舉例: <!ENTITY copyright “I am a programmer"> …… ©right;
- 參數實體
- 參數實體被 DTD 文件自身使用
-
語法格式: <!ENTITY % 實體名稱 "實體內容" > 引用方式:%實體名稱; 舉例1: <!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 地址"> <!ELEMENT 個人信息 (%TAG_NAMES; | 生日)> <!ELEMENT 客戶信息 (%TAG_NAMES; | 公司名)> 舉例2: <!ENTITY % common.attributes " id ID #IMPLIED account CDATA #REQUIRED " > ... <!ATTLIST purchaseOrder %common.attributes;> <!ATTLIST item %common.attributes;>
3、引入DTD約束的兩種方式
- DTD的約束可以定義在XML文件內部,如果DTD被定義在了XML內部則XML文檔聲明中standalone="yes"
- DTD的約束也可以定義在一個獨立的後綴爲.dtd的文件中再由xml文件引入,此時引入此dtd的xml文檔聲明中standalone="no"
- 注意:.dtd文件應使用UTF-8或Unicode編碼
-
在xml文件內編寫DTD <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE 書架 [ <!ELEMENT 書架 (書+)> <!ELEMENT 書 (書名,作者,售價)> <!ELEMENT 書名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售價 (#PCDATA)> ]> <書架> <書> <書名>Java就業培訓教程</書名> <作者>張孝祥</作者> <售價>39.00元</售價> </書> ... </書架>
- XML中引用DTD約束
- XML文件使用 DOCTYPE 聲明語句來指明它所遵循的DTD文件,DOCTYPE聲明語句有兩種形式:
-
當引用的文件在本地時,採用如下方式: <!DOCTYPE 文檔根結點 SYSTEM "DTD文件的URL"> 例如:<!DOCTYPE 書架 SYSTEM “book.dtd”> 當引用的文件是一個公共的文件時,採用如下方式: <!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">
4、編程校驗XML文檔正確性
- 默認的情況下IE瀏覽器內置的XML解析器的 約束校驗器是被關閉了的。所以我們需要使用JavaScript手動創建解析器對象,打開約束校驗功能,對XML進行約束校驗。
-
創建xml文檔解析器對象 var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); 開啓xml校驗 xmldoc.validateOnParse = "true"; 裝載xml文檔 xmldoc.load("book.xml"); 獲取錯誤信息 xmldoc.parseError.reason; xmldoc.parseError.line