DTD -- XML验证
DTD(文檔類型定義)的作用是定義 XML 文檔的合法構建模塊。
DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。
DTD簡介
內部的 DOCTYPE 聲明
假如 DTD 被包含在您的 XML 源文件中,它應當通過下面的語法包裝在一個 DOCTYPE 聲明中:
<?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>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </note>!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。
!ELstrongENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"
!ELstrongENT to (第四行)定義 to 元素為 "#PCDATA" 類型
!ELstrongENT from (第五行)定義 frome 元素為 "#PCDATA" 類型
!ELstrongENT heading (第六行)定義 heading 元素為 "#PCDATA" 類型
!ELstrongENT body (第七行)定義 body 元素為 "#PCDATA" 類型
?
外部文檔聲明
假如 DTD 位于 XML 源文件的外部,那么它應通過下面的語法被封裝在一個 DOCTYPE 定義中:
<!DOCTYPE root-element SYSTEM "filename">以下是 XML 文檔,這個XML文檔和上面的 XML 文檔相同,但是擁有一個外部的 DTD:?
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>這是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>?
為什么使用 DTD?
通過 DTD,您的每一個 XML 文件均可攜帶一個有關其自身格式的描述。
通過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換數據。
而您的應用程序也可使用某個標準的 DTD 來驗證從外部接收到的數據。
您還可以使用 DTD 來驗證您自身的數據。
?
DTD - XML 構建模塊
XML 文檔構建模塊
所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構建模塊構成:
Elements :元素
Attributes :屬性
Entities :實體
PCDATA :
意思是被解析的字符數據(parsed character data)。
可把字符數據想象為 XML 元素的開始標簽與結束標簽之間的文本。
PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
文本中的標簽會被當作標記來處理,而實體會被展開。
不過,被解析的字符數據不應當包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 實體來分別替換它們。
CDATA :
意思是字符數據(character data)。
CDATA 是不會被解析器解析的文本。在這些文本中的標簽不會被當作標記來對待,其中的實體也不會被展開。
?
DTD - 元素
在一個 DTD 中,元素通過元素聲明來進行聲明。
聲明一個元素
在 DTD 中,XML 元素通過元素聲明來進行聲明。元素聲明使用下面的語法:
<!ELEMENT element-name category> 或 <!ELEMENT element-name (element-content)>?
空元素
空元素通過類別關鍵詞EMPTY進行聲明:
<!ELEMENT element-name EMPTY>實例:<!ELEMENT br EMPTY>XML example:<br />?
只有 PCDATA 的元素
只有 PCDATA 的元素通過圓括號中的 #PCDATA 進行聲明:
<!ELEMENT element-name (#PCDATA)>實例:<!ELEMENT from (#PCDATA)>?
帶有任何內容的元素
通過類別關鍵詞 ANY 聲明的元素,可包含任何可解析數據的組合:
?
帶有子元素(序列)的元素
帶有一個或多個子元素的元素通過圓括號中的子元素名進行聲明:
?
當子元素按照由逗號分隔開的序列進行聲明時,這些子元素必須按照相同的順序出現在文檔中。在一個完整的聲明中,子元素也必須被聲明,同時子元素也可擁有子元素。"note" 元素的完整聲明是:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>?
聲明只出現一次的元素
<!ELEMENT element-name (child-name)>實例:<!ELEMENT note (message)>上面的例子聲明了:message 子元素必須出現一次,并且必須只在 "note" 元素中出現一次。
聲明最少出現一次的元素
上面的例子中的加號(+)聲明了:message 子元素必須在 "note" 元素內出現至少一次。
聲明出現零次或多次的元素
上面的例子中的星號(*)聲明了:子元素 message 可在 "note" 元素內出現零次或多次。
?
聲明出現零次或一次的元素
<!ELEMENT element-name (child-name?)>實例:<!ELEMENT note (message?)>上面的例子中的問號(?)聲明了:子元素 message 可在 "note" 元素內出現零次或一次。
?
聲明"非.../既..."類型的內容
實例:<!ELEMENT note (to,from,header,(message|body))>上面的例子聲明了:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
?
聲明混合型的內容
實例:<!ELEMENT note (#PCDATA|to|from|header|message)*>上面的例子聲明了:"note" 元素可包含出現零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
?
DTD - 屬性
?
DTD - 實體
?
轉載于:https://www.cnblogs.com/hf8051/p/4846432.html
總結
以上是生活随笔為你收集整理的DTD -- XML验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 Win11 发行预览版 22621
- 下一篇: 设计模式Adapter模式的五分钟