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