无废话XML--XML约束(DTD)
生活随笔
收集整理的這篇文章主要介紹了
无废话XML--XML约束(DTD)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 基本術語
? ? 二、良構(well-formed 規范的):符合W3C定義的XML文檔。
??
- 為什么XML需要驗證? ?
?對XML文件施加額外的約束,以便交流。舉個例子:要是我和你在交互一份數據,那么按照我的主管意識我可能會這樣子定義,按照你的主觀意識你可能會那樣子定義,那么我們之間要怎么交互數據呢?沒有一個提前規定號的約定來規范我們如何寫XML,那么就連這份XML的解析估計都是問題了吧,那還交互個毛線呀。
XML有2種約束:1,DTD ? ? 2,schema。- DTD驗證
1、 DTD聲明
? ? 1) DTD聲明可以在單獨的一個文件中
? ? 2) DTD聲明可以內嵌在XML文件中
? ? 3) DTD聲明可以一部分在單獨的文件中,另一部分內嵌在XML文件中
2、 引入外部DTD文件。DOCTYPE有2種情況:
1),當引用的文件在本地時:
? ?? <!DOCTYPE 根節點名稱?SYSTEM "dtd文件路徑">
2),當引用的文件是一個公共的文件時:實際中這種情況比較多見的。
<!DOCTYPE 根節點名稱 public "DTD名稱" "DTD文件的URL">
比如我們在寫一個JSP,前面都有這個文檔定義的。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
??1) 元素(ELEMENT) XML元素類型聲明
? ? ?聲明元素: <!ELEMENT elementName (contentModel)>
? ? ?元素的內容通過內容模式來描述。
? ? ?DTD 內容模式的種類有:
? ? ? ? ?EMPTY ? 元素不能包含任何數據,但可以有屬性(前提是必須聲明其屬性)。
? ? ? ? ? ? ? ? ?不能有子元素。不能有文本數據(包括空白,換行符)。
? ? ? ? ? ? ? ? ?DTD中定義: <!ELEMENT elementName EMPTY>
? ? ? ? ? ? ? ? ?XML中:<elementName/>(推薦) 或者:<elementName></elementName>
? ? ? ?(#PCDATA) 規定元素只包含已析的字符數據,而不包含任何類型的子元素的內容類型。
? ? ? ? ? ? ? ? ?DTD中定義: <!ELEMENT student (#PCDATA)>
? ? ? ? ? ? ? ? ?XML中合法內容: <student>watching TV</student>
? ? ? (Elements) 元素由內容模式部件指定。
? ? ? ? ? ? ? ? ?<!ELEMENT ?name ?(child particles) >?
? ? ? ? ? ? ? ? ?內容模式部件可以是下表列出的內容。
? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a,b)> ?子元素a、b必須出現,且按照列表的順序
? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a|b)> ?選擇;子元素a、b只能出現一個
? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a) ?> ?子元素a只能且必須出現一次
? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)+ > ?子元素a出現一次或多次
? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)* > ?子元素a出現任意次(包括零次、一次及多次)
? ? ? ? ? ? ? ? ? ? <!ELEMENT name (a)? > ?子元素a出現一次或不出現
? ? ? ? Mixed ? ?混合模式:子元素中既可有文本數據又可有下級子元素。
? ? ? ? ? ? ? ? ?<!ELEMENT rn (#PCDATA| an | en)*>“|”和“*”必須寫。
? ? ? ? ? ? ? ? ?上句表示在 rn 內,字符數據 或 en及an 可以出現任意多次,順序不限。
? ? ? ? ? ? ? ? ?優先寫(#PCDATA) ?如:(#PCDATA|name)* 正確 ? (name|#PCDATA)* 錯誤
? ? ? ? ?ANY ? ? 元素可以包含任何類型的數據。子元素(必須在DTD中有定義) 和 文本數據(包括空白)。
? ? ? ? ? ? ? ? ?DTD中定義: <!ELEMENT a ANY> <!ELEMENT b ANY>
? ? ? ? ? ? ? ? ?XML中合法內容: <a>somngthing</a> 或者 <a/> 或者 <a><b>oo</b></a>
? ?2) 屬性(ATTLIST) 特定元素類型可設置的屬性&屬性的允許值聲明
? ? ? ? <!ATTLIST elementName
? ? ? ? attributeName1 attributeType attributeDefault
? ? ? ? .......
? ? ? ? attributeNameN attributeType attributeDefault>
? ? ?屬性類型 (Attribute Type):
? ? ? ? CDATA該屬性只能包含字符數據(注意與CDATA段、PCDATA的區別)
? ? ? ? NMTOKEN ?是CDATA的子集,它的字符只能是字母,數字,句點,破折號,下劃線或冒號。
? ? ? ? NMTOKENS 類似NMTOKEN,但這個可以包含多個值,每個值之間用空格隔開。
? ? ? ? ID ? ? ? 該屬性的取值在同一文檔內是唯一的。一個元素只能有一個ID類型的屬性。
? ? ? ? IDREF ? ?類似指針,指向文檔中其他地方聲明的ID值。如果該屬性取值和指向的ID值不匹配,則返回錯誤。
? ? ? ? IDREFS ? 類似IDREF,但它可以具有由空格分隔開的多個引用。
? ? ? ? ENTITY ? 該屬性的值必須對應一個在文檔內部聲明的但還沒有分析過的實體。
? ? ? ? ENTITYS ?類似ENTITY,但它可以包含由空格分隔開的多個實體。
? ? ? ? NOTATION 該屬性的值必須引用在文檔中其他地方聲明的某個注釋的名稱。
? ? ? ? (enumerated) 類似枚舉的變量,該屬性必須匹配所列的值。各值用“|”分隔開。
? ? ? ? ? ? ? ? ?如: (春|夏|秋|冬) 實際內容文檔只能從中取一個。
? ? ?屬性特性 (Attribute Default) :
? ? ? ? #REQUIRED ? 必須有且只能有一個屬性。
? ? ? ? #IMPLIED ? ?可有可無。
? ? ? ? #FIXED ? ? ?在DTD中定義默認值,XML中可以不指定,指定則必須等于該默認值。
? ? ? ? attribute-value 如果不指定則用DTD定義的默認值,指定則用指定的值。
<![CDATA[############ 屬性(ATTLIST)的舉例 ############## ]]>
例一(#REQUIRED)
? ? DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at1 NMTOKENS #REQUIRED ?at2 CDATA #REQUIRED>
? ? XML中,正確: <el at1 = "10 20" ? at2="10" >something</el>
? ? XML中,錯誤: <el at="10">something</el> ?(沒有寫另一個#REQUIRED的屬性 at2 )
例二(#IMPLIED,#FIXED)
? ? DTD中: <!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA #FIXED "10" ?at2 CDATA #IMPLIED >
? ? XML中,正確: <el ? at2="20" >something</el> (at有默認值"10",at2 可寫可不寫)
? ? XML中,錯誤: <el at="11" >something</el>(at要么不寫,要寫只能寫成跟默認值相同的)
例三(attribute-value)
? ? DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at CDATA "10" at2 CDATA "20" >
? ? XML中,正確: <el at="11" >something</el>
例四(enumerated + attribute-value)
? ? DTD中:<!ELEMENT el (#PCDATA)> <!ATTLIST el at (10|20|30) "10">
? ? XML中,正確: <el at="20">something</el> ?(at要么不寫,默認值 10;要么在(10|20|30)中選一個寫)
<![CDATA[############ 屬性(ATTLIST)舉例 完畢 ############## ]]>
? 3) 實體(ENTITY) ? 可重用的內容聲明
? ? ?在DTD中定義 <!ENTITY 實體標志 "實體內容">
? ? ?在xml中引用自定義的實體,用 ?&實體標志; ?代表實體內容。
? ? ? 4) 符號(NOTATION) 不要解析的外部內容的格式聲明。
? ? ?
3、 內部實體:在xml文件里面寫(少用)。? ? 外部實體:另外在xml同一文件夾下建立一個dtd文件(提倡)
外部的:以下是XML:
? ? ? <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE root SYSTEM "goodsInfo.dtd"><!--用這句引用外部dtd--><root><goodsInfo><goodsName>goodsName</goodsName><goodsPrice>goodsPrice</goodsPrice></goodsInfo></root> ? ? ? 以下是名為"goodsInfo.dtd"文件:
? ? ? <!ELEMENT root (goodsInfo)><!ELEMENT goodsInfo (goodsName,goodsPrice)><!ELEMENT goodsName (#PCDATA)><!ELEMENT goodsPrice (#PCDATA)>
內部的:
? ? ? <?xml version="1.0"?><!DOCTYPE root [<!ELEMENT root(student)><!ELEMENT student (#PCDATA)><!ENTITY CCTV "中央電視臺">]> <!--把DTD文件寫在體內--><root><student>student watch &CCTV;<!--使用自定義實體 CCTV--></student></root>
轉載于:https://www.cnblogs.com/LinkinPark/p/5233115.html
總結
以上是生活随笔為你收集整理的无废话XML--XML约束(DTD)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DecExpress 帮助网站
- 下一篇: opendds协议服务器,OpenDDS