xml約束 ---- DTD
什麼是XML約束: 在XML技術裏,可以編寫一個文檔來約束一個XML文檔的書寫規範,這稱之爲XML約束。
爲什麼需要XML約束?
常用的約束技術
XML DTD
XML Schema
DTD(Document TypeDefinition),全稱爲文檔類型定義。
文件清單:book.xml
<?xml version="1.0" ?>
<!DOCTYPE 書架 SYSTEM"book.dtd">
<書架>
<書>
<書名>Java就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>39.00元</售價>
</書>
<書>
<書名>JavaScript網頁開發</書名>
<作者>張孝祥</作者>
<售價>28.00元</售價>
</書>
</書架>
文件清單:book.dtd
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>
DTD約束即可以作爲一個單獨的文件編寫,也可以在XML文件內編寫。
<?xml version="1.0"encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 書架 [
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>
]>
<書架>
<書>
<書名>Java就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>39.00元</售價>
</書>
...
</書架>
XML文件使用 DOCTYPE 聲明語句來指明它所遵循的DTD文件,DOCTYPE聲明語句有兩種形式:
當引用的文件在本地時,採用如下方式:
<!DOCTYPE 文檔根結點 SYSTEM"DTD文件的URL">
例如: <!DOCTYPE 書架 SYSTEM“book.dtd”>。在xml文件中手寫一下。
當引用的文件是一個公共的文件時,採用如下方式:
<!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">
- 元素定義
- 屬性定義
- 實體定義
在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)>
xml文檔中的標籤屬性需通過ATTLIST爲其設置屬性
語法格式:
<!ATTLIST 元素名
屬性名1 屬性值類型 設置說明
屬性名2 屬性值類型 設置說明
……
>
屬性聲明舉例:
<!ATTLIST 商品
類別 CDATA #REQUIRED
顏色 CDATA #IMPLIED
>
對應XML文件:
<商品 類別="服裝" 顏色="黃色">…</商品>
<商品 類別="服裝">…</商品>
設置說明:
#REQUIRED:必須設置該屬性
#IMPLIED:可以設置也可以不設置
#FIXED:說明該屬性的取值固定爲一個值,在 XML 文件中不能爲該屬性設置其它值。但需要爲該屬性提供這個值
直接使用默認值:在 XML 中可以設置該值也可以不設置該屬性值。若沒設置則使用默認值。
舉例:
<!ATTLIST 頁面作者
姓名 CDATA #IMPLIED
年齡 CDATA #IMPLIED
聯繫信息 CDATA #REQUIRED
網站職務 CDATA #FIXED "頁面作者"
個人愛好 CDATA "上網"
>
CDATA:表示屬性值爲普通文本字符串。
- ENUMERATED
- ID
- ENTITY(實體)
屬性的類型可以是一組取值的列表,在 XML 文件中設置的屬性值只能是這個列表中的某個值(枚舉)
<?xml version = "1.0"encoding="GB2312" standalone="yes"?>
<!DOCTYPE 購物籃 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]>
<購物籃>
<肉 品種="魚肉"/>
<肉 品種="牛肉"/>
<肉/>
</購物籃>
表示屬性的設置值爲一個唯一值。
ID 屬性的值只能由字母,下劃線開始,不能出現空白字符
<?xml version = "1.0"encoding="GB2312" ?>
<!DOCTYPE 聯繫人列表[
<!ELEMENT 聯繫人列表 ANY>
<!ELEMENT 聯繫人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 聯繫人 編號 ID #REQUIRED>
]>
<聯繫人列表>
<聯繫人 編號="1">
<姓名>張三</姓名>
<EMAIL>[email protected]</EMAIL>
</聯繫人>
<聯繫人 編號="2">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
</聯繫人>
</聯繫人列表>
實體用於爲一段內容創建一個別名,以後在XML文檔中就可以使用別名引用這段內容了。
在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。實體可分爲兩種類型:引用實體和參數實體。
引用實體主要在 XML 文檔中被應用
語法格式:
<!ENTITY 實體名稱 “實體內容” >:直接轉變成實體內容
引用方式:
&實體名稱;
舉例:
<!ENTITY copyright “I am aprogrammer">
……
©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;>