生活随笔
收集整理的這篇文章主要介紹了
XML文档类型定义DTD
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
DTD概述
DTD用來(lái)定義XML文檔的結(jié)構(gòu),它包含一系列規(guī)則說明,以確保XML文檔的一致性和有效性
DTD定義了XML文檔可用的詞匯(元素和屬性的名稱)和結(jié)構(gòu):
元素名稱,包括根元素
元素的屬性及屬性的數(shù)據(jù)類型和取值方式
子元素的名稱、順序、出現(xiàn)次數(shù)
元素是否擁有子元素,是否能擁有文本內(nèi)容,等等
可以用DTD驗(yàn)證XML文檔
發(fā)現(xiàn)書寫錯(cuò)誤(命名錯(cuò)誤)
檢查結(jié)構(gòu)和順序
檢查是否使用了規(guī)定的規(guī)范文檔
DTD的引用
DTD可以是被XML引用的獨(dú)立的外部文檔,也可以嵌入到XML文檔中
DTD文檔是特殊格式的XML文檔 例如,DTD文檔student.dtd的內(nèi)容如下:
[html]?view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>?? <!ELEMENT?班級(jí)?(學(xué)生+)>?? <!ELEMENT?學(xué)生?(ID,?姓名,?年齡?,?住址?,?電話*)>?? <!ELEMENT?ID?(#PCDATA)>?? <!ELEMENT?姓名?(#PCDATA)>?? <!ELEMENT?年齡?(#PCDATA)>?? <!ELEMENT?住址?(#PCDATA)>?? <!ELEMENT?電話?(座機(jī)*,?手機(jī)?)>?? <!ELEMENT?座機(jī)?(#PCDATA)>?? <!ELEMENT?手機(jī)?(#PCDATA)>??
嵌入的DTD
[html]?view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>?? <!DOCTYPE?班級(jí)?[?? ????<!ELEMENT?班級(jí)?(學(xué)生+)>?? ????<!ELEMENT?學(xué)生?(ID,?姓名,?年齡?,?住址?,?電話*)>?? ????<!ELEMENT?ID?(#PCDATA)>?? ????<!ELEMENT?姓名?(#PCDATA)>?? ????<!ELEMENT?年齡?(#PCDATA)>?? ????<!ELEMENT?住址?(#PCDATA)>?? ????<!ELEMENT?電話?(座機(jī)*,?手機(jī)?)>?? ????<!ELEMENT?座機(jī)?(#PCDATA)>?? ????<!ELEMENT?手機(jī)?(#PCDATA)>?? ]>?? <班級(jí)>?? ????<學(xué)生>?? ????????<ID>001</ID>?? ????????<姓名>王剛</姓名>?? ????????<年齡>2</年齡>?? ????????<電話>?? ????????????<手機(jī)>234345456</手機(jī)>?? ????????</電話>?? ????</學(xué)生>?? </班級(jí)>??
外部DTD-SYSTEM
在XML文檔中聲明使用外部DTD文檔 <!DOCTYPE 根元素名稱 SYSTEM “DTD文檔URL”>
?例如,XML文檔student.xml的內(nèi)容如下:
[html]?view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>?? <!DOCTYPE?班級(jí)?SYSTEM?“student.dtd”>?? <班級(jí)>?? ????<學(xué)生>?? ????????<ID>001</ID>?? ????????<姓名>王剛</姓名>?? ????????<年齡>2</年齡>?? ????????<電話>?? ????????????<手機(jī)>234345456</手機(jī)>?? ????????</電話>?? ????</學(xué)生>?? </班級(jí)>??
外部DTD-PUBLIC
在XML文檔中聲明使用公共DTD文檔 <!DOCTYPE 根元素名稱 PUBLIC “公共標(biāo)識(shí)符” “URI” 公共標(biāo)識(shí)符的格式為:? 標(biāo)準(zhǔn)//作者//類型和版本//語(yǔ)言 例如,XML文檔student.xml的內(nèi)容如下:
[html]?view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>?? <!DOCTYPE?班級(jí)?PUBLIC?“-//WeiDP//Example?1.0//ZH-CN”?“student.dtd”>?? <班級(jí)>?? ????<學(xué)生>?? ????????<ID>001</ID>?? ????????<姓名>王剛</姓名>?? ????????<年齡>2</年齡>?? ????????<電話>?? ????????????<手機(jī)>234345456</手機(jī)>?? ????????</電話>?? ????</學(xué)生>?? </班級(jí)>??
元素Element
ANY:內(nèi)容中可包含子元素
格式:<!ELEMENT 元素名稱 ANY>
示例:<段落>使用<關(guān)鍵詞>XML</關(guān)鍵詞>技術(shù)</段落>
EMPTY:不能包含任何內(nèi)容
格式:<!ELEMENT 元素名稱 EMPTY>
示例:<paper color=“red”/>
#PCDATA:不能包含子元素
格式:<!ELEMENT 元素名稱 (#PCDATA)>
示例:<book author=“Black”>C Language</book>
子元素的順序和出現(xiàn)頻率
<!ELEMENT 元素名稱 (子元素名稱[修飾符][,…])>
其中,修飾符為:
省略:必須出現(xiàn),且只能出現(xiàn)1次
+:至少出現(xiàn)1次
?:最多出現(xiàn)1次
*:可以不出現(xiàn),也可以出現(xiàn)多次
示例:<!ELEMENT cpu (廠商,型號(hào)+,工藝?,價(jià)格*)>
子元素的選擇
<!ELEMENT 元素名稱 (子元素[|子元素]…]) >
示例: <!ELEMENT 電話 (座機(jī)|手機(jī))>
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?standalone="no"?>?? <!DOCTYPE?我的電腦?[?? ????<!ELEMENT?我的電腦?(CPU,?內(nèi)存+,?硬盤+)>?? ????<!ELEMENT?CPU?EMPTY>?? ????<!ELEMENT?內(nèi)存?(描述*)>?? ????<!ELEMENT?分區(qū)?(名稱,?操作系統(tǒng))>?? ????<!ELEMENT?名稱?(#PCDATA)>?? ????<!ELEMENT?操作系統(tǒng)?(#PCDATA)>?? ????<!ELEMENT?硬盤?(分區(qū)+,?描述*)>?? ????<!ELEMENT?描述?ANY>?? ]>?? <我的電腦>?? ????<CPU/>?? ????<內(nèi)存><描述>="512MB"</描述></內(nèi)存>?? ????<內(nèi)存/>?? ????<硬盤>??<分區(qū)>?? ????????????<名稱>系統(tǒng)盤</名稱>?? ????????????<操作系統(tǒng)>Windows?2003</操作系統(tǒng)>?? ????????</分區(qū)>?? ????????<描述>關(guān)于系統(tǒng)盤的任何描述信息</描述>?? ????</硬盤>?? </我的電腦>??
屬性列表ATTLIST
ATTLIST定義元素的屬性的名稱、類型和默認(rèn)值,可以限制出現(xiàn)次數(shù)但不能限制出現(xiàn)順序
語(yǔ)法:<!ATTLIST 元素名稱 ?屬性1名稱 屬性類型 屬性值聲明 ?屬性2名稱 屬性類型 屬性值聲明 ……>
屬性類型
CDATA:一般文本
ID:具有ID屬性值,不能重復(fù)(唯一性)
IDREF:對(duì)ID屬性值的引用
IDREFS:對(duì)ID屬性值列表的引用(用空白分割)
ENTITY:引用未解析的外部實(shí)體
ENTITIES:引用ENTITY列表(用空白分割)
NMTOKEN:包含一個(gè)有效的XML名稱
NMTOKENS:NMTOKEN列表
(屬性值[[|屬性值]…]):屬性為NMTOKEN類型,只能取列表中的值
NOTATION (屬性值[[|屬性值]…]):屬性為NOTATION(已定義的),取值任選其一
屬性值說明
#REQUIRED:該屬性必須出現(xiàn)
#IMPLIED:該屬性是可選的
“默認(rèn)值”:屬性是可選的;若不出現(xiàn),在驗(yàn)證文檔后,元素將隱含該屬性,取默認(rèn)值
#FIXED “固定值”:屬性是可選的;若出現(xiàn),屬性值必須取固定值;若不出現(xiàn),則驗(yàn)證后自動(dòng)隱含該固定值
例如:
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?>?? <!—該文件保存為computer.dtd-->?? <!ELEMENT?我的電腦?(CPU,?內(nèi)存+,?硬盤+)>?? <!ELEMENT?CPU?EMPTY>?? <!ATTLIST?CPU?? ????廠商?(AMD?|?Intel?|?Other)?“Intel"?? ????序列號(hào)?CDATA?#IMPLIED?? ????工作頻率?CDATA?#REQUIRED?? >?? <!ELEMENT?內(nèi)存?(描述*)>?? <!ATTLIST?內(nèi)存?? ????容量?CDATA?#REQUIRED?? >?? <!ELEMENT?分區(qū)?(名稱,?操作系統(tǒng))>?? <!ATTLIST?分區(qū)?? ????盤符?NMTOKEN?#REQUIRED?? >?? <!ELEMENT?名稱?(#PCDATA)>?? <!ELEMENT?操作系統(tǒng)?(#PCDATA)>?? <!ELEMENT?硬盤?(分區(qū)+,?描述*)>?? <!ATTLIST?硬盤?? ????容量?CDATA?#REQUIRED?? >?? <!ELEMENT?描述?ANY>??
xml
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?standalone="no"?>?? <!DOCTYPE?我的電腦?SYSTEM?"computer.dtd">?? ?? <我的電腦>?? ????<CPU?廠商="AMD"?工作頻率="1.5GHz"/>?? ????<內(nèi)存?容量="512MB">?? ????????<描述>Kingmax?DDR?4000</描述>?? ????</內(nèi)存>?? ????<內(nèi)存?容量="512MB"/>?? ????<硬盤?容量="80GB">?? ????????<分區(qū)?盤符="C">?? ????????????<名稱>系統(tǒng)盤</名稱>?? ????????????<操作系統(tǒng)>?? ????????????????<![CDATA[>?Windows?2003?<]]>?? ????????????</操作系統(tǒng)>?? ????????</分區(qū)>?? ????</硬盤>?? </我的電腦>??
示例二
[html]?view plaincopy
<?xml?version="1.0"?encoding="UTF-8"?>?? <!DOCTYPE?班級(jí)?[?? ????<!ELEMENT?班級(jí)?(學(xué)生+,?班長(zhǎng)?)>?? ????<!ELEMENT?班長(zhǎng)?EMPTY>?? ????<!ATTLIST?班長(zhǎng)?學(xué)號(hào)?IDREF?#REQUIRED>?? ????<!ELEMENT?學(xué)生?(姓名,?年齡?,?住址?,?電話*)>?? ????<!ATTLIST?學(xué)生?? ????????學(xué)號(hào)?ID?#REQUIRED?? ????????性別?(男?|?女)?"男"?? ????????系別?CDATA?"計(jì)算機(jī)"?? ????>?? ????<!ELEMENT?姓名?(#PCDATA)>?? ????<!ELEMENT?年齡?(#PCDATA)>?? ????<!ELEMENT?住址?(#PCDATA)>?? ????<!ELEMENT?電話?(座機(jī)*,?手機(jī)?)>?? ????<!ELEMENT?座機(jī)?(#PCDATA)>?? ????<!ELEMENT?手機(jī)?(#PCDATA)>?? ]>??
xml
[html]?view plaincopy
<班級(jí)>?? ????<學(xué)生?學(xué)號(hào)="s05601"?性別="女">?? ????????<姓名>王剛</姓名>?? ????????<年齡>2</年齡>?? ????????<電話>?? ????????????<手機(jī)>234345456</手機(jī)>?? ????????</電話>?? ????</學(xué)生>?? ????<學(xué)生?學(xué)號(hào)="S05046"?性別="男"?系別="材料">?? ????????<姓名>孫俊</姓名>?? ????????<住址>203房間</住址>?? ????</學(xué)生>?? ????<學(xué)生?學(xué)號(hào)="s05603">?? ????????<姓名>孫俊</姓名>?? ????????<住址>203房間</住址>?? ????????<電話>?? ????????????<座機(jī)>45655656?? ????????</座機(jī)>?? ????????????<座機(jī)>465675</座機(jī)>?? ????????</電話>?? ????</學(xué)生>?? ????<班長(zhǎng)?學(xué)號(hào)="s05601"/>?? </班級(jí)>??
注記notation
XML文檔可以包含非XML數(shù)據(jù)(不能由解析器直接處理),例如圖像、聲音等,需要告知解析器如何調(diào)用外部程序處理這些數(shù)據(jù),否則就會(huì)出錯(cuò)。
NOTATION將非XML數(shù)據(jù)描述為一種能夠被外部程序處理的形式
格式:<!NOTATION 名稱 SYSTEM “系統(tǒng)標(biāo)識(shí)符”>
例如:<!NOTATION jpg SYSTEM “image/jpeg”>
notation實(shí)例
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?>?? <!ELEMENT?相冊(cè)?(照片)+>?? <!ELEMENT?照片?(#PCDATA)>?? <!NOTATION?jpg?SYSTEM?"image/jpeg">?? <!NOTATION?gif?SYSTEM?"image/gif">?? <!NOTATION?png?SYSTEM?"image/png">?? <!ATTLIST?照片?? ????名稱?NMTOKEN?#REQUIRED?? ????文件類型?NOTATION?(jpg?|?gif?|?png)?#IMPLIED?? >??
實(shí)體ENTITY
邏輯上,一個(gè)XML文檔只有一個(gè)根元素,根元素包含所有子元素和內(nèi)容。但XML文檔中可以引用來(lái)自其他文檔(文件)中的數(shù)據(jù)(內(nèi)容),這就是實(shí)體。例如,可以將論文標(biāo)題定義為實(shí)體,就可以在文中多次引用,而不必重復(fù)輸入,也便于修改標(biāo)題。
實(shí)體存儲(chǔ)的內(nèi)容有形式規(guī)范的XML、其他形式的文本或二進(jìn)制數(shù)據(jù)。實(shí)體可以是文件、數(shù)據(jù)記錄或任何包含數(shù)據(jù)的項(xiàng)目。除了文檔實(shí)體外,多數(shù)實(shí)體都有名稱。
實(shí)體定義在DTD中,在與該DTD關(guān)聯(lián)的XML文檔中通過實(shí)體引用使用這些實(shí)體,XML解析器會(huì)在解析標(biāo)記時(shí),用實(shí)體的內(nèi)容替換實(shí)體引用。
普通實(shí)體
? 內(nèi)部普通實(shí)體
<!ENTITY 實(shí)體名稱? “實(shí)體內(nèi)容”>
例如,<!ENTITY UPC “中國(guó)石油大學(xué)”>
? 外部普通實(shí)體
<!ENTITY 實(shí)體名稱 SYSTEM “URI”>
例如,<!ENTITY UPC SYSTEM “/XML/upc.xml”>
<!ENTITY 實(shí)體名稱 PUBLIC FPI “URI”>
其中,FPI是經(jīng)認(rèn)可的全球唯一的公共標(biāo)識(shí)符,形如“前綴//使用者標(biāo)識(shí)//文本類//文本描述//語(yǔ)言”
例如,<!ENTITY hello PUBLIC “-//ISO9//me//Hello//EN” “/xml/hello.xml”>
book_intro.xml文檔
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?>?? <內(nèi)容簡(jiǎn)介>適合計(jì)算機(jī)專業(yè)本科學(xué)習(xí)</內(nèi)容簡(jiǎn)介>??
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?>?? <!DOCTYPE?圖書?[?? ????<!ENTITY?copyright?"版權(quán)所有,2007">?? ????<!ENTITY?intro?SYSTEM?"book_intro.xml">?? ????<!ELEMENT?圖書?(書名,?作者,?內(nèi)容簡(jiǎn)介)>?? ????<!ELEMENT?書名?(#PCDATA)>?? ????<!ELEMENT?作者?(#PCDATA)>?? ????<!ELEMENT?內(nèi)容簡(jiǎn)介?(#PCDATA)>?? ]>?? <圖書>?? ????<書名>計(jì)算概論(?right;)?? </書名>?? ????<作者>張三</作者>?? ????&intro;?? </圖書>??
未解析實(shí)體
外部未解析實(shí)體可以將非XML文檔數(shù)據(jù)引入XML文檔進(jìn)行處理
引入XMl文檔
<!ENTITY 名稱 SYSTEM “URI”>
URI對(duì)應(yīng)XML文檔
引入非XML文檔
<!ENTITY 名稱 SYSTEM “URI” NDATA 類型聲明>
類型聲明用于描述文檔類型
[html]?view plaincopy
<?xml?version="1.0"?encoding="GB2312"?>?? <!DOCTYPE?IMAGE?[?? ????<!ELEMENT?IMAGE?(PIC)>?? ????<!NOTATION?gif?SYSTEM?"image/gif">?? ????<!ENTITY?pic?SYSTEM?"office.gif"?NDATA?gif>?? ????<!ELEMENT?PIC?EMPTY>?? ????<!ATTLIST?PIC?src?ENTITY?#REQUIRED>?? ]>?? <IMAGE>?? ????<PIC?src="pic"/>??
總結(jié)
以上是生活随笔為你收集整理的XML文档类型定义DTD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。