xml的約束
爲什麼需要約束?比如現在定義一個person的xml文件,只想要這個文件裏面保存人的信息,比如name,age等,但是如果在xml文件中寫了一個標籤<貓>,發現可以正常顯示,因爲符合語法規範,但是貓肯定不是人的信息,xml的標籤是自定義的,需要技術來規定xml中只能出現的元素,這個時候需要約束。
Xml的約束的技術:dtd的約束 和 schema約束
dtd的快速入門
- 創建一個文件,後綴名爲 .dtd
步驟:
1) 看xml中有多少個元素,有幾個元素,在dtd文件中寫幾個<!ELEMENT
>,判斷元素是簡單元素還是複雜元素。
複雜元素:有子元素的元素
<!ELEMENT 元素名稱(子元素)>
簡單元素,沒有子元素
<!ELEMENT 元素名稱(#PCDATA)>
2) 需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名稱 SYSTEM “dtd文件的路徑”>
3) 打開xml文件使用瀏覽器打開的,瀏覽器只負責校驗xml的語法,不負責檢查約束。
如果想要校驗xml的約束,需要使用工具(myeclipse工具)
打開myeclipse工具,創建一個項目day5,在day5的src目錄下面創建一個xml文件和一個dtd文件,當xml中引入dtd文件之後,比如只能出現name age,多寫了一個a,會提示報錯。
dtd的三種引入方式
1) 引入外部的dtd文件
<!DOCTYPE 根元素名稱 SYSTEM “dtd文件的路徑”>
2) 使用內部的dtd文件
<!DOCTYPE 根元素名稱 [
<!ELEMENT person (name,age)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
3) 使用外部的dtd文件(網絡上的dtd文件)
<!DOCTYPE 根元素名稱 PUBLIC “DTD名稱” “DTD文檔的URL”
>
後面學到的框架struts2使用配置文件,使用的dtd文件。
使用dtd定義元素
語法:<!ELEMENT 元素名稱 約束
>
- 簡單元素:沒有子元素的元素
1) <!ELEMENT age (#PCDATA)
>
2) #PCDATA:約束name是字符串類型
3) EMPTY:元素爲空(沒有內容)
4) ANY:任意
- 複雜元素:
1) <!ELEMENT person (name,age)
>子元素只能出現一次
2) 表示子元素出現的次數:
+:表示一次或者多次
?:表示零次或者一次
*:表示零次或者多次
3) 子元素直接使用逗號進行隔開,表示元素出現的順序。
4) 子元素直接使用|隔開 表示元素只能出現其中的任意一個。
使用dtd定義屬性
<!ATTLIST 元素名稱 屬性類型 屬性的約束>
屬性類型:
- -CDATA:字符串
<!ATTLIST birthday ID1 CDATA #REQUIRED
>
- 枚舉:
表示只能在一定的範圍內出現值,但是隻能每次出現其中的一個
紅綠燈效果(aa|bb|cc)
<!AATLIST age ID2 (AA|BB|CC) #REQUIRED
>
- ID:
ID值只能是字母或者下劃線開頭
<!AALIST name ID3 ID #REQUIRED
>
屬性的約束:
- REQUIRED :屬性必須存在
- IMPLTED:屬性可有可無
- FIXED:表示一個固定值
- 直接值:不寫屬性,直接使用直接值,寫了屬性,直接使用設置的值
定義屬性實例:
<!ATTLIST 頁面作者
姓名 CDATA #IMPLIED
年齡 CDATA #IMPLIED
聯繫信息 CDATA #REQUIED
網站職務 CDATA #FIXED “頁面作者”
個人愛好 CDATA “上網”
>
實體的定義:
<!ENTITY TEST "HAHAHAHAH"
>
引用方式:&TEST;
代碼實例:
<?xml version="1.0" encoding="UTF-8"?>
<!--直接引入dtd方式-->
<!DOCTYPE person [
<!ELEMENT person (name+,age?,sex*,school,birth)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID1 CDATA #REQUIRED
>
<!ELEMENT age (#PCDATA)>
<!ATTLIST age
ID2 (18|19|20) #IMPLIED
>
<!ELEMENT sex EMPTY>
<!ATTLIST sex
ID3 ID #FIXED "nan"
>
<!ELEMENT school ANY>
<!ATTLIST school
ID3 ID "mmm"
>
<!ELEMENT birth (#PCDATA)>
<!ENTITY TEST "HAHAHAHAH">
]>
<person>
<name ID1="aaa">&TEST;</name>
<age ID2="18">18</age>
<sex ID3="nan"></sex>
<school>ddd</school>
<birth>2000</birth>
</person>
“`