2.xml約束技術----------dtd約束
1.xml的約束
(1)為什麽需要定義約束了
比如現在定義一個person的xml文件,只想要這個文件裏面保存人的信息,比如name age等,但是如果在xml文件中寫了一個元素<貓>,發現可以正常顯示,因為符合語法規範。但是貓肯定不是人的信息,xml的元素時自定義的,需要技術來規定xml中只能出現的元素,這個時候就需要約束了
xml的約束的技術:dtd約束 和 schema約束
2.dtd的編寫使用步驟(註意語法的格式,該打空格就打空格)
(1)創建一個文件,後綴名為.dtd
(2)在文件中寫入約束
a.看xml中有多少個元素,有幾個元素那麽就在dtd文件中寫幾個<!ELEMENT>(大寫)
b.判斷元素時簡單元素還是復雜元素
- 復雜元素:由子元素( 語法:<!ELEMENT 元素名字 (子元素1,子元素2...)> )
- 簡單元素:沒有子元素( 語法:<!ELEMENT 元素名字 (#PCDATA)> )
c.在xml文件中引入dtd文件
語法: <!DOCTYPE 根元素名稱 SYSTEM "dtd文件的路徑">
(3)註意
瀏覽器只負責檢驗xml的語法,不負責校驗約束(責校約束,我們需要以來工具,比如Eclipse MyEclipse)
實例一:按照dtd約束進行定義xml
dtd約束代碼如下:
<!ELEMENT persion (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>
xml文件代碼如下(按照dtd約束)
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE persion SYSTEM "Demo1.dtd"> <persion> <name>張三</name> <age>123</age> </persion>
瀏覽器顯示
實例二:不按照dtd約束定義xml元素
如果我們不按照dtd約束,那麽Eclipse會提示錯誤,但是在瀏覽器中運行卻可以顯示
但瀏覽器正常顯示
3.dtd的三種引入方式
(1)使用外部的dtd文件(例如上面的實例就是使用這個方式)
語法:<!DOCTYPE 根元素名字 SYSTEM "dtd路徑">
(2)在xml裏面使用dtd文件
語法:<!DOCTYPE 根元素名字 [
<!ELEMENT persion (name,age)>
<!ELEMENT name (#CPDATA)>
<!ELEMENT age (#PCDATA)>
]>
例如代碼如下:
<?xml version="1.0" encoding="gbk"?> <!DOCTYPE persion [ <!ELEMENT persion (name,age,profession)><!--這個可寫也可不寫(最好還是寫上)--> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT profession (student)> <!ELEMENT student (#PCDATA)> ]> <persion> <name>張三</name> <age>18</age> <profession> <student>學生</student> </profession> </persion>
(3)使用網絡上面的dtd文件(別人已經定義好了的)
語法:<!DOCTYPE 根元素 PUBLIC "dtd名字" "dtd文檔的URL">
框架struts2就會使用配置文件,並且使用的是網絡上面的dtd文件
4.使用dtd約束定義元素
(1)語法:<!ELEMENT 元素名 約束>
(2)簡單元素:沒有子元素的元素
<!ELEMENT name (#PCDATA)>
- (#PCDATA) :表示該元素可以包含字符串數據,但是不能包含子元素
- EMPTY:表示為空(就是沒有內容,例如<a></a>)
- ANY :表示可以包含任意類型數據
(2)復雜元素:
<!ELEMENT persion (name,age)> 表示子元素只能出現一次
<!ELEMENT persion (name+,age)> 表示name元素可以出現一次或則多次
符號的意義:
+ :表示一次或者多次(>=1)
?:表示零次或者一次(==0或則==1)
* :表示零次或者多次(>=0)
,:如果子元素直接用逗號分割,那麽表示子元素出現的順序
| :如果子元素用|分割,那麽之元素只能出現其中一個
下面是一個例子:
<?xml version="1.0" encoding="gbk"?> <!DOCTYPE persion [ <!ELEMENT persion (name+,age?,(profession*|aaa))><!--這個可寫也可不寫(最好還是寫上)--> <!ELEMENT name EMPTY> <!ELEMENT age ANY> <!ELEMENT profession (#PCDATA)> ]> <persion> <name></name> <name></name> <!-- <age>18</age>這個因為是可以定義0次也可以1次,所以註釋掉 --> <profession>學生1</profession> <profession>學生2</profession> <profession>學生3</profession> </persion>
6.使用dtd定義屬性約束(就如html中class,id等一樣)
(1)語法:<!ATTLIST 元素名字
屬性名字 屬性類型 屬性約束
>
(2)屬性的值的類型
a.CDATA:字符串
例如:<!ATTLIST name
ID1 CDATA #REQUIRED
>
b.枚舉:表示只能在一定範圍內出現的值,但是每次只能出現其中一個
例如:<!ATTLIST name
ID1 (AA|BB|CC) #REQUIRED
>
c.ID : 屬性的值只能是字符或者下劃線開頭
例如:<!ATTLIST name
ID1 ID #REQUIRED
>
(3)屬性約束
#REQUIRED : 屬性必須存在
#IMPLIED : 屬性可有可無
#FIXED : 表示一個固定值 #FIXED "AAA"(也就是屬性的值必須是AAA,不能是其他的值)
默認值:
例如:<!ATTLIST name
ID1 CDATA "WWW"
>
如果我們在xml頁面中給這個屬性沒有賦值,那麽默認就是WWW,如果賦值了,那麽就是自己賦的值
(4)實體
意義:我們在寫xml的時候,元素裏面的值可以引用這個實體(也就是先在dtd文件中定義,再到xml文件中使用)
語法:<!ENTITY TEXT "entity">----<!ENTITY 實體名 "實體值">
調用:在元素中寫 &TEXT;
註意:定義實體需要寫在內部的dtd裏面,如果寫在外部dtd裏面,某些瀏覽器獲取不到之個值
實例代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE persion [ <!--定義元素約束--> <!ELEMENT persion (name,age,profession,default,entity)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT profession (#PCDATA)> <!ELEMENT default (#PCDATA)> <!ELEMENT entity (#PCDATA)> <!--元素屬性約束--> <!--name的值只能是這幾個枚舉之中的一個,並且必須寫--> <!ATTLIST name ID1 (AA|BB|CC) #REQUIRED > <!--表示屬性的值只能是字符或者下劃線開頭,並且這個屬性可寫可不寫--> <!ATTLIST age ID2 ID #IMPLIED > <!--表示這個屬性的值只能是WWW--> <!ATTLIST profession ID3 CDATA #FIXED "WWW" > <!--表示這個屬性的值默認是default--> <!ATTLIST default ID4 CDATA "default" > <!--定義實體--> <!ENTITY TEXT "entity"> ]> <persion> <name ID1="AA"></name> <age ID2="_id"></age> <profession ID3="WWW"></profession> <default></default> <entity>&TEXT;</entity> </persion>
2.xml約束技術----------dtd約束