XML約束之DTD


為什么要有XML約束?

雖然XML本身具有比HTML更加嚴(yán)格的語(yǔ)法審查,但是XML沒(méi)有,也不可能有針對(duì)每個(gè)用戶(hù)定義標(biāo)簽的內(nèi)容語(yǔ)法規(guī)定。

比如<age>-1</age> 這樣明顯的語(yǔ)法錯(cuò)誤.XML約束出現(xiàn)就為了解決這種問(wèn)題。

XML約束技術(shù)

  1. DTD約束.
  2. Schema約束.

|DTD|Schema|
|:-:|:-:|:-:|
|語(yǔ)法簡(jiǎn)單,功能簡(jiǎn)單|語(yǔ)法負(fù)責(zé),功能復(fù)雜|

DTD語(yǔ)法:

w3c的一個(gè)Demo:

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

外部DTD(本地導(dǎo)入)

假如 DTD 位于 XML 源文件的外部,那么它應(yīng)通過(guò)下面的語(yǔ)法被封裝在一個(gè) DOCTYPE 定義中:
<!DOCTYPE 根元素 SYSTEM "文件名">
一個(gè)例子:

note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

---
note.xml
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

外部DTD(公共導(dǎo)入)

<!DOCTYPE 根元素 PUBLIC "http://google.com/xxx.dtd">

約束標(biāo)簽

<!ELEMENT 元素名稱(chēng) 類(lèi)別> 或 <!ELEMENT 元素名稱(chēng) (元素內(nèi)容)>

(#PCDATA)

代表普通字符串,不能包含子標(biāo)簽

ANY

代表任何內(nèi)容

EMPTY

代表必須為空

(子元素名稱(chēng)1,子元素名稱(chēng)2,...)

<!ELEMENT note (to,from,heading,body)>
代表我的note標(biāo)簽下,一定按順序出現(xiàn)to標(biāo)簽,from標(biāo)簽,...
規(guī)定標(biāo)簽一定出現(xiàn)一次

(子元素名稱(chēng)1+)

<!ELEMENT note (to+,from,heading,body)>
代表to標(biāo)簽至少出現(xiàn)一次,可以多次

(子元素名稱(chēng)1*)

<!ELEMENT note (to,from*,heading,body)>
代表from標(biāo)簽出現(xiàn)0次或多次

(子元素名稱(chēng)1?)

<!ELEMENT note (to,from,heading?,body)>
代表heading標(biāo)簽0次或1次

約束屬性

屬性聲明使用下列語(yǔ)法:

<!ATTLIST 元素名稱(chēng) 屬性名稱(chēng) 屬性類(lèi)型 默認(rèn)值>

DTD 實(shí)例:

<!ATTLIST payment type CDATA "check">

默認(rèn)值參數(shù)可使用下列值:

值          屬性的默認(rèn)值
#REQUIRED     屬性值是必需的
#IMPLIED      屬性不是必需的
#FIXED value    屬性值是固定的

#REQUIRED

<!ATTLIST to ip CDATA #REQUIRED>

屬性類(lèi)型

CDATA :      表示普通字符串
(en1|en2|...)    枚舉,表示一定任選其中的一個(gè)值
ID         值為唯一的 id(不能數(shù)字開(kāi)頭)
---------------------------------------
IDREF         值為另外一個(gè)元素的 id
IDREFS        值為其他 id 的列表
NMTOKEN        值為合法的 XML 名稱(chēng)
NMTOKENS        值為合法的 XML 名稱(chēng)的列表
ENTITY        值是一個(gè)實(shí)體
ENTITIES         值是一個(gè)實(shí)體列表
NOTATION        此值是符號(hào)的名稱(chēng)
xml:          值是一個(gè)預(yù)定義的 XML 值

報(bào)紙文章 DTD

拷貝自:http://www.vervet.com/

<!DOCTYPE NEWSPAPER [ 

<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)> 

<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>

<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">

]>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. XML簡(jiǎn)介 以下內(nèi)容來(lái)自于http://www.w3school.com.cn/xml 基本知識(shí) XML 和...
    WebSSO閱讀 2,092評(píng)論 1 7
  • 大綱: XML解析 引入 重點(diǎn)DOM解析SAX解析DOM解析 VS SAX解析 xPath技術(shù) 引入 xPath作...
    vpt閱讀 571評(píng)論 0 2
  • 經(jīng)過(guò)兩天的奮戰(zhàn),終于把xml簡(jiǎn)略的過(guò)了一遍。 1.1XML介紹 xml是Extensible Markup lan...
    Ystrator閱讀 1,012評(píng)論 0 2
  • 成長(zhǎng) 面對(duì)一個(gè)可能戰(zhàn)勝你的對(duì)手,對(duì)你來(lái)說(shuō)是最有效的磨煉 年輕人最美麗的時(shí)候,是因?yàn)樗麄儞碛辛四贻p人缺乏的東西:雍容...
    武林大蝦閱讀 383評(píng)論 0 0
  • 一 這是距離小爹婚后兩個(gè)半月的一個(gè)下午。 我從樓上看著雨滴拍打著門(mén)口橘園的葉子,嗒嗒作響。 感嘆道,這雨真大啊。 ...
    貝加大人閱讀 2,305評(píng)論 0 0

友情鏈接更多精彩內(nèi)容