- 什么是XML約束?
在xml技術里,可以編寫一個文檔來約束一個xml文檔的寫法,這稱之為xml約束
2. 為什么要使用xml約束?
參看提示欄
3. xml約束的作用?
- 約束xml的寫法
- 對xml進行校驗
4. 常見的xml約束技術
- xml? dtd
- xml? Schema
-------------------------------------------------------------------------
DTD 約束快速入門
- dtd ( document type definition ) ,全稱為文檔類型定義
- 示例
-
1 ------------------沒有給xml設置約束-------------------------------- 2 -------------------------------book.xml--------------------------- 3 4 <?xml version="1.0" encoding="utf-8"?> 5 <書架> 6 <書> 7 <書名>Java程序設計</書名> 8 <價格>¥59</價格> 9 <作者>風馬一族</作者> 10 </書> 11 <書> 12 <書名>C++程序設計</書名> 13 <價格>¥49</價格> 14 <作者>風馬一族</作者> 15 </書> 16 </書架> 17 18 ---------使用DTD技術,給xml設置約束,使xml內容出現錯誤的示例----- 19 -----------------------book.xml------------book.dtd----------------------- 20 <?xml version="1.0" encoding="utf-8"?> 21 <!DOCTYPE 書架 SYSTEM "book.dtd"> 22 <書架> 23 <書> 24 <書名>Java程序設計</書名> 25 <價格>¥59</價格> 26 <作者>風馬一族</作者> 27 </書> 28 <書> 29 <書名>C++程序設計</書名> 30 <價格>¥49</價格> 31 <作者>風馬一族</作者> 32 </書> 33 </書架> 34 35 <!ELEMENT 書架(書+)> 36 <!ELEMENT 書(書名,作者,售價)> 37 <!ELEMENT 書名(#PCDATA)> 38 <!ELEMENT 作者(#PCDATA)> 39 <!ELEMENT 售價(#PCDATA)> 40 41 42 ---------使用DTD技術,給xml設置約束,使xml內容按照約束寫法的示例----- 43 -----------------------book.xml------------book.dtd----------------------- 44 45 <?xml version="1.0" encoding="utf-8"?> 46 <!DOCTYPE 書架 SYSTEM "book.dtd"> 47 <書架> 48 <書> 49 <書名>Java程序設計</書名> 50 <作者>風馬一族</作者> 51 <售價>¥59</售價> 52 </書> 53 <書> 54 <書名>C++程序設計</書名> 55 <作者>風馬一族</作者> 56 <售價>¥59</售價> 57 </書> 58 </書架> 59 60 <!ELEMENT 書架 (書+)> 61 <!ELEMENT 書 (書名,作者,售價)> 62 <!ELEMENT 書名 (#PCDATA)> 63 <!ELEMENT 作者 (#PCDATA)> 64 <!ELEMENT 售價 (#PCDATA)>
-
-------------------------------------------------------------------------
?
1.編程校驗xml文檔正確性
- 1.默認的情況下IE瀏覽器內置的xml解析器的約束校驗器是被關閉了的。所以我們需要使用JavaScript手動創建解析器對象。打開約束校驗功能,對xml進行約束校驗。
? 2.創建xml文檔解析器對象
1.var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
3.開啟xml校驗
1.xmldoc.validateOnParse="true";
4.裝載xml文檔
1.xmldoc.load("book.xml");
5.獲取錯誤信息
1.xmldoc.parseError.reason;
2.xmldoc.parseError.line
------------------------------------
因為IE默認不打開DTD校驗器,因此可以使用兩種方式,解決這個問題,一是使用TDE、二是編寫一段JS


1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <title>無標題文檔</title> 5 </head> 6 7 <body> 8 行號: <div id="l"></div><br /> 9 原因: <div id="r"></div> 10 </body> 11 </html> 12 13 <script> 14 var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); //使用javaScript創建一個瀏覽器內置的xml解析器 15 xmldoc.validateOnParse=true;//將xml解析器的dtd校驗打開 16 xmldoc.load("book.xml"); 17 var line=xmldoc.parseError.line; 18 var reason=xmldoc.parseError.reason; 19 document.getElementById("l").innerHTML=line; 20 document.getElementById("r").innerHTML=reason; 21 </script>
?
------------------------------------
示例
------------book.xml-------------


1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE 書架 SYSTEM "book.dtd"> 3 <書架> 4 <書> 5 <書名>Java程序設計</書名> 6 <作者>風馬一族</作者> 7 <售價>¥59</售價> 8 </書> 9 <書> 10 <書名>C++程序設計</書名> 11 <作者>風馬一族</作者> 12 <售價>¥59</售價> 13 </書> df 14 </書架>
?
------------book.dtd-------------


1 <!ELEMENT 書架 (書+)> 2 <!ELEMENT 書 (書名,作者,售價)> 3 <!ELEMENT 書名 (#PCDATA)> 4 <!ELEMENT 作者 (#PCDATA)> 5 <!ELEMENT 售價 (#PCDATA)>
?
?
------------check.html------------


1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <title>無標題文檔</title> 5 </head> 6 7 <body> 8 行號: <div id="l"></div><br /> 9 原因: <div id="r"></div> 10 </body> 11 </html> 12 13 <script> 14 var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); //使用javaScript創建一個瀏覽器內置的xml解析器 15 xmldoc.validateOnParse=true;//將xml解析器的dtd校驗打開 16 xmldoc.load("book.xml"); 17 var line=xmldoc.parseError.line; 18 var reason=xmldoc.parseError.reason; 19 document.getElementById("l").innerHTML=line; 20 document.getElementById("r").innerHTML=reason; 21 </script>
?
結果:
?
?
-----------------------------------------------------------------------------------
二、dtd語法
1,如何在xml中引入dtd
- 外部引入
- 可以將dtd的約束內容寫在外置的dtd文件中,這個文件后綴必須為.dtd而文件保存時必須用UTf-8來保存。
- 再在xml文件中使用<!DOCTYPE 根元素名稱 SYSTEM? 文件的位置>
- 如果寫的是SYSTEM表明當前引入的dtd在當前文件系統中,后面制定的文件位置是當前硬盤中的位置
- 再在xml文件中使用<!DOCTYPE 根元素名稱 PUBLIC? 文件的位置>
- 如果寫的是PUBLIC表明當前引入的dtd在網絡公共位置中,后面要指明dtd的名字和dtd所在網絡位置URL地址
- 示例:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- 內部引入
- 直接在xml中書寫dtd
- <!DOCTYPE 根元素名稱[dtd約束]>
- 外部引入
- dtd語法
- 元素
- ?<!ELEMENT 元素名稱? 元素約束>
- 元素約束:
- 存放類型:ANY/EMPTY
- 元素約束:
- 子元素的列表,將可以包含的子元素用小括號括起來
- 子元素之間可以使用逗號進行分割,表明子元素必須按照順序出現
- 子元素之間可以使用豎線進行分割,表明子元素出現其中之一
- #PCDATA 表明包含標簽體
- + 表示一次或多次
- *? 0次或多次
- ? 0次或一次
- 也可以使用小括號進行組的操作
- 屬性
- <!ATTLIST 元素名
- 屬性名???? 屬性類型?? 屬性約束
- 屬性名2 ?? 屬性類型?? 屬性約束
- .......................
- >
示例:
-
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE 書架[ 3 <!ELEMENT 書架 (書+)> 4 <!ELEMENT 書 (書名,作者,售價)> 5 <!ELEMENT 書名 (#PCDATA)> 6 <!ELEMENT 作者 (#PCDATA)> 7 <!ELEMENT 售價 (#PCDATA)> 8 9 ]> 10 <書架> 11 <書> 12 <書名>Java程序設計</書名> 13 <作者>風馬一族</作者> 14 <售價>¥59</售價> 15 </書> 16 <書> 17 18 <書名>C++程序設計</書名> 19 <作者>風馬一族</作者> 20 <售價>¥59</售價> 21 </書> 22 </書架>
-
- 屬性類型:? 屬性的可以是一組取值的列表,在xml文件中設置的屬性值
- CDATA : 表示屬性的值是一個普通字符串
- ENUMERATED:屬性的值是一個枚舉列表中的值
- ID: 表明屬性的值必須在整個文檔中都是唯一的,如果有重復的id則校驗不通過,ID屬性的值只能由字母,下劃線開始,不能使用數字,不能出現空白字符
- 屬性約束:
- #REQUIRED?? --- 表明當前屬性是一個必須存在的屬性,如果這樣的屬性不存在則在校驗時會報錯
- #IMPLIED --- 表明當前屬性是一個可選的屬性,可以有也可以沒有
- #FIXED '固定值'? --- 表明當前屬性具有一個固定值,這樣的屬性不需要進行賦值,自動就會取這個固定值為值,如果
- ’默認值‘? --- 表明當前屬性具有一個默認值,如果給了其他的值就用其他值,如果沒有給值則取這個默認值
- <!ATTLIST 元素名
- ENTITY(實體)
- <!ENTITY> 就是對一大段內容的引用,可以簡化代碼的復用
- 引用實體:
- 在xml中引用的實體叫做引用實體
- <!ENTITY % 實體名稱 “實體內容”>
- &實體名稱;
- 參數實體:
- 在dtd中引用的實體叫做參數實體
- <!ENTITY % 實體名稱 “實體內容”>
- &實體名稱;
- 元素
?