為什么要有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ù)
- DTD約束.
- 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
<!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">
]>