XML约束
相關閱讀
XML約束概述
一個XML文檔一旦有了約束,那么這個XML文檔就只能使用約束中創建的元素及屬性。如果約束沒有創建< a >元素,那么XML文檔就不能使用< a >元素!!!
什么是xml約束
因為xml文檔是可以自定義元素的,這會讓使用xml文檔的應用程序無法知道xml文檔的真實結構。通常應用程序都會要求xml文件的結構是固定的,以滿足自己的需求,這就說明,不同的應用程序要求自己的xml文檔必須符合一定的要求。
例如,當使用xml文檔作為某個Java swing應用程序的配置文件時,要求xml文檔結構如下:
<frame title="test xml" layout="java.awt.BorderLayout"><bgcolor><red>200</red><green>0</green><blue>0</blue></bgcolor><size><width>300</width><heigth>200</heigth></size><content><label><text>hello xml</text><label></content> </frame>當某個學生管理系統程序需要使用xml文檔作為數據庫時,要求xml文檔結構如下
<?xml version="1.0" encoding="utf-8" standalone="no"?> <students><student number="1001"><name>zhangSan</name><age>23</age><sex>male</sex></student><student number="1002"><name>liSi</name><age>32</age><sex>female</sex></student><student number="1003"><name>wangWu</name><age>55</age><sex>male</sex></student> </students>xml文檔約束是用另一個文件來約束xml文檔的結構,例如要求xml文檔的根元素必須是< students >,在< students >元素下可以包含0~n個< student >元素,每個< student >元素必須有一個number屬性,而且還要有三個子元素,分別為< name >、< age >、< sex >,這三個子元素的內容必須為文本內容,而不能是子元素
XML文檔約束的類型
xml文檔約束有兩種類型:dtd和schema
- dtd:dtd是平面式文檔,dtd文件不是xml文檔,通常擴展名為“.dtd”。它是最早的xml約束;
- schema:schema本身也是xml文檔,它比dtd要更加強大,通常擴展名為“.xsd”。它是新的xml文檔約束,用來替代dtd。
DTD是老的XML約束,Schema是新的,用Schema替換掉DTD
DTD
DTD(Document Type Definition),文檔類型定義,用來約束XML文檔。例如要求xml文檔的根元素必須是,在元素下可以包含0~n個元素,每個元素必須有一個number屬性,而且還要有三個子元素,分別為、、,這三個子元素的內容必須為文本內容,而不能是子元素。
1、DTD展示
<!ELEMENT students (student+)> <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)>解讀上面DTD:
- students元素中可以包含1~n個student元素;
- student元素中必須包含name、age、sex元素,而且順序也是固定的;
- name元素內容為文本,即字符串;
- age元素內容為文本;
- sex元素內容為文本。
2、在XML文檔中指定本地DTD
<?xml version="1.0" encoding="utf-8" standalone="no" ?> <!DOCTYPE students SYSTEM "students.dtd"> <students><student><name>zhangSan</name><age>23</age><sex>male</sex></student> </students> <!ELEMENT students (student+)> <!ELEMENT student (name, age, sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)>其中,表示指定dtd文件。
指定DTD的語法:
- 指定DTD的語法,以“”結束;
- students表示根元素;
- SYSTEM表示dtd文件在本地;
- “students.dtd”表示DTD文件路徑。
3、在XML文檔中指定內部DTD
<?xml version="1.0" encoding="utf-8" standalone="no" ?> <!DOCTYPE students [ <!ELEMENT students (student+)> <!ELEMENT student (name, age, sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> ]> <students><student><name>zhangSan</name><age>23</age><sex>male</sex></student> </students>4、在XML文檔中指定外部公共DTD
<?xml version="1.0" encoding="utf-8" standalone="no" ?> <!DOCTYPE students PUBLIC "-//qdmmy6//DTD ST 1.0//ZH" "http://www.qdmmy6.com/xml/dtds/st.dtd"> <students><student><name>zhangSan</name><age>23</age><sex>male</sex></student> </students>外部公共DTD是說,DTD由某個公司或權威組織發布,例如如下:
當然你需要知道要使用的DTD的名稱和網址。如果某個機構公布了DTD,那么一定也會公布DTD的名稱和網址。
上面例子中的公共DTD是不存在的。
DTD定義元素
1、定義元素的語法
使用ELEMENT聲明元素:<!ELEMENT 元素名 內容類型或內容>
例如:<!ELEMENT name (#PCDATA)>
表示name元素的內容為文本數據
2、元素類型
元素類型可以是ANY或EMPTY
<!ELEMENT stu ANY>:表示stu元素的內容可以是任意元素,也可以是文本數據,也可以是文本數據+子元素,反正就是任意。
<!ELEMENT stu EMPTY>:表示stu不能有任何內容,即空元素。例如:。
3、元素內容
元素內容可以是文本數據,也可以是子元素
<!ELEMENT stu (#PCDATA)>表示stu元素內容為文本,例如:<stu>hello</stu>
4、子元素出現次數
可以使用“?”、“*”、“+”來指定子元素的出現次數
<!ELEMENT stu (name?)>表示stu元素可以有0~1個name子元素,即name子元素可有可無。
<!ELEMENT stu(name*)>表示stu元素可以有0~n個name子元素;
<!ELEMENT stu(name+)>表示stu元素可以有1~n個name子元素。
5、多個子元素
<!ELEMENT stu (name,age,sex)>表示stu必須有三個子元素,分別是name、age、sex,并且子元素出現的順序也要與聲明的順序一致。
6、枚舉子元素
<!ELEMENT stu (name | age | sex)表示stu只有一個子元素,可以是name、age、sex中的任意一個。
7、復合聲明1
<!ELEMENT stu (name | age | sex)?>表示stu元素可以有0~1個(name | age | sex),而(name | age | sex)表示name、age、sex其中的一個。
<stu></stu> <stu><name/></stu> <stu><age/></stu> <stu><sex/></stu>8、復合聲明2
<!ELEMENT stu (name | age | sex)*>表示stu元素可以有0~n個(name | age | sex),而(name | age | sex)表示name、age、sex其中的一個。
<stu></stu> <stu><name/><name/></stu> <stu><name/><age/><age/></stu> <stu><name/><age/><name/><sex/><sex/></stu>9、復合聲明3
<!ELEMENT stu (name | age | sex)+>表示stu元素可以有1~n個(name | age | sex),而(name | age | sex)表示name、age、sex其中的一個。
<stu><age/></stu> <stu><name/><name/></stu> <stu><name/><age/><age/></stu> <stu><name/><age/><name/><sex/><sex/></stu>10、練習
<!DOCTYPE 課件 [ <!ELEMENT 章節 (簡介, (標題, (段落 | 圖片 | 表格 | 說明)+)+)> <!ELEMENT 簡介 (#PCDATA)> <!ELEMENT 標題 (#PCDATA)> <!ELEMENT 段落 (#PCDATA)> <!ELEMENT 圖片 (#PCDATA)> <!ELEMENT 表格 (#PCDATA)> <!ELEMENT 說明 (#PCDATA)> <!ELEMENT 課件 (章節+)>]>根據上面DTD寫xml文檔!!!
DTD屬性定義
1、屬性定義的格式
Attribute List
<!ATTLIST 元素名
屬性名1 屬性類型 設置說明
屬性名2 屬性類型 設置說明
…>
<!ATTLIST student number CDATA #REQUIRED>表示student元素的number為文本類型,這個屬性是必須的。
最常見的屬性類型:CDATA,表示文本類型;
最常見的設置說明1:#REQUIRED,表示屬性是必須的。
最常見的設置說明2:#IMPLIED,表示屬性是可選的。
2、屬性類型
- CDATA:屬性值為任意文本數據;
- Enumerated:屬性值必須是枚舉列表中的一個;
- ID:屬性值必須是唯一的,并且屬性值不能以數字開頭;
3、CDATA屬性類型
CDATA,即Character Data(字符數據)。表示屬性的類型為字符類型!
<!ATTLIST student number CDATA #REQUIRED>表示student元素的number屬性是字符數據類型,并且是必須屬性。
<student number=”czbk_1001”>
4、Enumerated屬性類型
Enumerated不是關鍵字,定義枚舉類型的屬性需要給出枚舉列表。當屬性值為枚舉類型時,那么這個屬性的取值必須是枚舉列表中的一個值。
<!ATTLIST student sex (male | female) #IMPLIED> 表示student的sex屬性取值必須是male或者是female。并且這個屬性是可選的。
5、ID屬性類型
一個元素最多只能有一個ID 屬性,ID屬性用來表示元素唯一性的唯一標識。ID屬性就相當與元素的身份證號,必須是唯一標識!
如果把student元素的number屬性設定為ID類型,那么每個student元素的number屬性值必須是唯一的,并且ID類型的屬性值不能以數字開頭。
注意:不能以數字開頭。
如果<a>元素有一個ID屬性a
如果<b>元素有一個ID屬性b
上面也是錯誤的,因為ID屬性的值是不可以相同的。
6、設置說明
- #REQUIRED:表示屬性是必須的;
- #IMPLIED:表示屬性是可選的,即這個屬性可以不給出;
總結
- 上一篇: Xml 格式数据的生成和解析
- 下一篇: Java基础:String类