更新時間:2020-11-27 17:43:37 來源:動力節點 瀏覽1271次
事實上,約束在Java中是很常見的,但是我們很少去思考為什么需要用到約束呢?比如我們現在定義一個student.xml文件,我們想要在其中保存關于學生的信息,例如id,name,age,但是如果隨便寫入一個標簽例如<你好>,從語法的角度上雖然是符合規范的,但是這顯然與我們想要存儲的東西沒有任何關系,所以我們需要通過XML約束技術,約束XML中只能出現的元素。
XML約束技術分為兩大類,一種相對簡單的約束技術:DTD,一種相對復雜的約束技術:Schema。下面我們來大致說一下這兩種約束的思路。
一、DTD約束
1.dtd的引入方式
A:使用內部的dtd文件,即將約束規則定義在xml文檔中
<!DOCTYPE 根元素名稱 [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
B:引入外部的dtd文件
<!DOCTYPE 根元素名稱 SYSTEM "dtd路徑">
C:使用外部的dtd文件(網絡上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文檔的URL">
例如使用 struts2框架 使用配置文件 所使用 外部的dtd文件
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD
Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
2.使用dtd定義元素
<!ELEMENT 元素名 約束>
A:簡單元素(沒有子元素)
ELEMENT name (#PCDATA)>
(#PCDATA): 約束name是字符串類型
EMPTY : 元素為空(沒有內容)
- <sex></sex>
ANY:任意
B:復雜元素
<!-- 語法 -->
<!ELEMENT person (id,name,age,)>
子元素只能出現一次
<!ELEMENT 元素名稱 (子元素)>
<!-- 子元素出現次數 -->
* :一次多或多次
?:零次或一次
* :零次或多次
<!-- 子元素直接使用逗號隔開 -->
表示元素出現的順序
<!-- 子元素直接使用 | -->
表示元素只能出現其中的任意一個
3.使用dtd定義屬性
<!-- 語法 -->
<!ATTLIST 元素名稱
屬性名稱 屬性類型 屬性的約束
>
<!-- 屬性類型 --> CDATA: 字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
<!-- 枚舉 -->
表示只能在一定的范圍內出現值,但是只能每次出現其中的一個,紅綠燈效果
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
<!-- ID: 值只能是字母或者下劃線開頭 -->
<!ATTLIST name
ID3 ID #REQUIRED
>
<!-- 屬性的約束 -->
#REQUIRED:屬性必須存在
#IMPLIED:屬性可有可無
#FIXED: 表示一個固定值 #FIXED "AAA"
屬性的值必須是設置的這個固定值
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
直接值
不寫屬性,使用直接值
寫了屬性,使用設置那個值
<!ATTLIST school
ID5 CDATA "WWW"
>
二、Schema約束
schema 符合XML的語法,一個xml中可以有多個 schema ,多個 schema 使用名稱空間區分DTD里面有PCDATA類型,但是在 schema 里面可以支持更多的數據類型。XML Schema也是一種用于定義和描述XML文檔結構與內容的模式語言,其出現是為了克服DTD的局限性.
后綴名:xsd
引入:
填寫xml文檔的根元素
引入xsi前綴. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示xml文件是一個約束文件
引入xsd文件命名空間. xsi:schemaLocation="http://www.bwh.cn/xml student.xsd"
使用一個使用schema約束文件,直接通過這個地址引入約束文件
通常使用一個url地址防止重名
為每一個xsd約束聲明一個前綴,作為標識 xmlns="http://www.bwh.cn/xml"
1.看xml中有多少個元素
<element>
2.看簡單元素和復雜元素
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
3.被約束文件里面引入約束文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.bwh.cn/20151111"
xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-- 表示xml是一個被約束文件
xmlns="http://www.bwh.cn/20151111"
-- 是約束文檔里面 targetNamespace
xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd">
-- targetNamespace 空格 約束文檔的地址路徑
可以約束屬性
A: <sequence>:表示元素的出現的順序
B: <all>: 元素只能出現一次
C: <choice>:元素只能出現其中的一個
D: maxOccurs="unbounded": 表示元素的出現的次數
E: <any></any>:表示任意元素
寫在復雜元素里面
寫在?</complexType>之前
--
<attribute name="id1" type="int" use="required"></attribute>
- name: 屬性名稱
- type:屬性類型 int stirng
- use:屬性是否必須出現 required
XML約束本質上還是限制XML文檔中創建的元素及屬性,離不開它的字面意思。因為xml文檔是可以自定義元素的,這會讓使用xml文檔的應用程序無法知道xml文檔的真實結構,。通常應用程序都會要求xml文件的結構是固定的,以滿足自己的需求,這就說明,不同的應用程序要求自己的xml文檔必須符合一定的要求,也就是我們所說的XML約束。講的再多,不如實戰,本站的Java基礎教程里面有著許多的XML文檔,小伙伴看完了本文可以去小試牛刀。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習