XML約束javascript
在XML技術中,能夠編寫一個文檔來約束一個xml文檔的書寫規範,這稱之爲XML約束
爲何須要XML約束?html
class.xml <stu><面積>?人怎麼會有面積元素?java
xml 文件標籤能夠隨便寫,dtd能夠對其有所要求按照合理的需求寫程序員
xml文件約束--dtd瀏覽器
document type definition 文檔類型定義
做用:工具
定義xml標籤約束,使開發者按照定義書寫,也能夠約束html文件測試
使用:
在項目中如須要一個xml文件,項目經理 可定義一個dtd文件,要求全部程序員按照此規範書寫xml文件ui
掌握要求:
可根據別人提供的dtd文件,寫出對應的xml文件即編碼
備註:dtd文件也必須使用utf-8編碼和文件保持一致
引入dtd
格式:url
<!DOCTYPE 根元素名 SYSTEM "dtd路徑"> 本地使用SYSTEM
備註:默認狀況下瀏覽器不檢測處理dtd約束,須要本身寫代碼測試或藉助工具
文件1
checkDTD.html
此只針對ie5 支持 別的瀏覽器不支持
<html>
<head>
<title>測試dtd</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<script language="javascript">
//建立一個xml解析器
var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
//開啓校驗功能
xmldoc.validateOnParse=true;
//指定對那個xml文件校驗
xmldoc.load("class.xml");
//若是錯誤,輸出錯誤信息
document.write("錯誤信息="+xmldoc.parseError.reason+"<br/>");
document.write("錯誤行號="+xmldoc.parseError.line);
</script>
</head>
</html>
class.xml文件
<?xml version="1.0" encoding="utf-8"?>
<!--必定保證文件的保存編碼方式爲utf-8-->
<!DOCTYPE class SYSTEM "class.dtd">
<class>
<student ><!--優秀學生-->
<name>杜傑</name>
<sex>boy</sex>
<age>28</age>
<MT>12312</MT>
</student>
</class>
xml.dtd文件
<!ELEMENT class (student+)>
<!ELEMENT student(name,age,des)> 學生標籤下可有 名字,年齡,介紹三個元素
<!ELEMENT name(#PCDATA)> 對名字進行說明
<!ELEMENT age(#PCDATA)>
<!ELEMENT des(#PCDATA)>
DTD文檔聲明和引用 等同於CSS
--內部DTD文檔
<!DOCTYPE 根元素 [定義內容]>
--外部DTD文檔
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑">
--內外部DTD文檔結合
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑"[定義內容]>
引用DTD約束
XML文件應用DOCTYPE 聲明語句來指明它所遵循的DTD文件,DOCTYPE聲明語句有兩種形式
@ 引用文件爲本地
<!DOCTYPE 文檔根節點 SYSTEM "dtd文件路徑">
@ 引用文件時一個公共的文件時
<!DOCTYPE 文檔根節點 PUBLIC "DTD名稱" "DTD文件url">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
DTD文件定義
<!ELEMENT NAME CONTENT>
<!ELEMENT des(#PCDATA)>
ELEMENT 關鍵字
NAME 元素名
CONTENT 元素類型(大寫)
CONTENT類型分析:
EMPTY 該元素不能包含子元素和文本,但能夠有屬性(空元素)
ANY 該元素能夠包含任何在DTD中定義的元素內容
#PCDATA 能夠包含任何字符數據,可是不能在其中包含子標籤 需用 ( ) 括起來
組合類型
<!ELEMENT 家庭 (人+,家電*)>
+ 元素 一到多個
* 元素 0到多個
? 元素 0到1次
| 元素 在列出的對象中選擇一個 man|women 至少出現一個
() 元素 分組
, 對象必須按指定的順序出現(name,age,sex) name,age,sex必須出現而且按定義順序出現
<!ELEMENT 家庭 (人+,家電)>
若是去掉* 則含義是定義時必須有家電
屬性定義
若是dtd文件沒有定義屬性 則在xml文件里加入屬性時會報錯
<!ATTLIST 元素名稱
屬性名稱 類型 屬性特色
屬性名稱 類型 屬性特色...
>
類型分析:
CDATA 屬性值能夠是任何字符(包括數字和中文)
ID 這個屬性的值必須是惟一的(對於同此類型的標籤),而且以字母開頭
IDREF/IDREFS id引用
IDREF 屬性值指向文檔中其它地方聲明的ID類型的值
IDREFS同 IRREF 但能夠具備由空格分開的多個引用
Enumerated 枚舉 在幾個值裏取值 性別
屬性特色
#REQUIRED 該屬性必須有
#IMPLIED 該屬性無關緊要
#FIXED value 該屬性的值必須爲此固定值
Defalut value 不給則取默認值
寫法: 就近原則 對元素指定屬性
<!ELEMENT class (student+)>
<!ATTLIST student
address CDATA #REQUIRED
>
<!ATTLIST person sex(boy|girl) #REQUIRED>
ENTITY/ENTITIES 實體定義
用於爲一段內容建立一個別名,之後再xml文檔中就可使用別名引用這段內容
在DTD定義中,一條<!ENTITY ...>語句用於定義一個實體
實體能夠分爲兩種類型
引用實體和參數實體
引用實體
1.在DTD中定義
<!ENTITY 實體名 內容>
<!ENTITY sto "我的介紹">
2.在xml引用 &實體名
&sto; 引用符號 & 和結束分號;必須有
參數實體
1.在DTD中定義參數實體
<!ENTITY % 實體名稱 "實體內容">
2.在DTD文件中本身使用
%實體名;
DTD案例:
電視節目表 DTD
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>根據DTD寫出相應的xml文檔