溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是XML與DTD

發(fā)布時間:2020-07-16 11:35:25 來源:億速云 閱讀:130 作者:Leah 欄目:編程語言

什么是XML與DTD ?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

    文檔類型定義(DTD)可定義合法的XML文檔構(gòu)建模塊。它使用一系列合法的元素來定義文檔的結(jié)構(gòu)。

DTD 可被成行地聲明于 XML 文檔中,也可作為一個外部引用。

什么是XML與DTD

內(nèi)部的 DOCTYPE 聲明

假如 DTD 被包含在您的 XML 源文件中,它應(yīng)當(dāng)通過下面的語法包裝在一個 DOCTYPE 聲明中:

<!DOCTYPE 根元素 [元素聲明]>

帶有 DTD 的 XML 文檔實例

<?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 解釋如下:

!DOCTYPE note (第二行)定義此文檔是 note 類型的文檔。

!ELEMENT note (第三行)定義 note 元素有四個元素:"to、from、heading,、body"

!ELEMENT to (第四行)定義 to 元素為 "#PCDATA" 類型

!ELEMENT from (第五行)定義 frome 元素為 "#PCDATA" 類型

!ELEMENT heading (第六行)定義 heading 元素為 "#PCDATA" 類型

!ELEMENT body (第七行)定義 body 元素為 "#PCDATA" 類型

外部文檔聲明

假如 DTD 位于 XML 源文件的外部,那么它應(yīng)通過下面的語法被封裝在一個 DOCTYPE 定義中:

<!DOCTYPE 根元素 SYSTEM "文件名">

這個 XML 文檔和上面的 XML 文檔相同,但是擁有一個外部的 DTD: (并選擇“查看源代碼”命令。)

<?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 的 "note.dtd" 文件:

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

為什么使用 DTD?

通過 DTD,您的每一個 XML 文件均可攜帶一個有關(guān)其自身格式的描述。

通過 DTD,獨立的團(tuán)體可一致地使用某個標(biāo)準(zhǔn)的 DTD 來交換數(shù)據(jù)。

而您的應(yīng)用程序也可使用某個標(biāo)準(zhǔn)的 DTD 來驗證從外部接收到的數(shù)據(jù)。

您還可以使用 DTD 來驗證您自身的數(shù)據(jù)。

XML 文檔構(gòu)建模塊

所有的 XML 文檔(以及 HTML 文檔)均由以下簡單的構(gòu)建模塊構(gòu)成:

  • 元素

  • 屬性

  • 實體

  • PCDATA

  • CDATA

下面是每個構(gòu)建模塊的簡要描述。

元素

元素是 XML 以及 HTML 文檔的主要構(gòu)建模塊。

HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的??盏?HTML 元素的例子是 "hr"、"br" 以及 "img"。

實例:

<body>body text in between</body>
<message>some message in between</message>

屬性

屬性可提供有關(guān)元素的額外信息。

屬性總是被置于某元素的開始標(biāo)簽中。屬性總是以名稱/值的形式成對出現(xiàn)的。下面的 "img" 元素?fù)碛嘘P(guān)于源文件的額外信息:

<img src="computer.gif" />

元素的名稱是 "img"。屬性的名稱是 "src"。屬性的值是 "computer.gif"。由于元素本身為空,它被一個 " /" 關(guān)閉。

實體

實體是用來定義普通文本的變量。實體引用是對實體的引用。

大多數(shù)同學(xué)都了解這個 HTML 實體引用:"&nbsp;"。這個“無折行空格”實體在 HTML 中被用于在某個文檔中插入一個額外的空格。

當(dāng)文檔被 XML 解析器解析時,實體就會被展開。

下面的實體在 XML 中被預(yù)定義:

實體引用字符
&lt;<
&gt;>
&amp;&
&quot;"
&apos;'

PCDATA

PCDATA 的意思是被解析的字符數(shù)據(jù)(parsed character data)。

可把字符數(shù)據(jù)想象為 XML 元素的開始標(biāo)簽與結(jié)束標(biāo)簽之間的文本。

PCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標(biāo)記。

文本中的標(biāo)簽會被當(dāng)作標(biāo)記來處理,而實體會被展開。

不過,被解析的字符數(shù)據(jù)不應(yīng)當(dāng)包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 實體來分別替換它們。

在一個 DTD 中,元素通過元素聲明來進(jìn)行聲明。

聲明一個元素

在 DTD 中,XML 元素通過元素聲明來進(jìn)行聲明。元素聲明使用下面的語法:

<!ELEMENT 元素名稱 類別>

或者

<!ELEMENT 元素名稱 (元素內(nèi)容)>

空元素

空元素通過類別關(guān)鍵詞EMPTY進(jìn)行聲明:

<!ELEMENT 元素名稱 EMPTY>

例子:

<!ELEMENT br EMPTY>

XML例子:

<br />

只有 PCDATA 的元素

只有 PCDATA 的元素通過圓括號中的 #PCDATA 進(jìn)行聲明:

<!ELEMENT 元素名稱 (#PCDATA)>

例子:

<!ELEMENT from (#PCDATA)>

帶有任何內(nèi)容的元素

通過類別關(guān)鍵詞 ANY 聲明的元素,可包含任何可解析數(shù)據(jù)的組合:

<!ELEMENT 元素名稱 ANY>

例子:

<!ELEMENT note ANY>

帶有子元素(序列)的元素

帶有一個或多個子元素的元素通過圓括號中的子元素名進(jìn)行聲明:

<!ELEMENT 元素名稱 (子元素名稱 1)>

或者

<!ELEMENT 元素名稱 (子元素名稱 1,子元素名稱 2,.....)>

例子:

<!ELEMENT note (to,from,heading,body)>

當(dāng)子元素按照由逗號分隔開的序列進(jìn)行聲明時,這些子元素必須按照相同的順序出現(xiàn)在文檔中。在一個完整的聲明中,子元素也必須被聲明,同時子元素也可擁有子元素。"note" 元素的完整聲明是:

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

聲明只出現(xiàn)一次的元素

<!ELEMENT 元素名稱 (子元素名稱)>

例子:

<!ELEMENT note (message)>

上面的例子聲明了:message 子元素必須出現(xiàn)一次,并且必須只在 "note" 元素中出現(xiàn)一次。

聲明最少出現(xiàn)一次的元素

<!ELEMENT 元素名稱 (子元素名稱+)>

例子:

<!ELEMENT note (message+)>

上面的例子中的加號聲明了:message 子元素必須在 "note" 元素內(nèi)出現(xiàn)至少一次。

聲明出現(xiàn)零次或多次的元素

<!ELEMENT 元素名稱 (子元素名稱*)>

例子:

<!ELEMENT note (message*)>

上面的例子中的星號聲明了:子元素 message 可在 "note" 元素內(nèi)出現(xiàn)零次或多次。

聲明出現(xiàn)零次或一次的元素

<!ELEMENT 元素名稱 (子元素名稱?)>

例子:

<!ELEMENT note (message?)>

上面的例子中的問號聲明了:子元素 message 可在 "note" 元素內(nèi)出現(xiàn)零次或一次。

聲明“非.../既...”類型的內(nèi)容

例子:

<!ELEMENT note (to,from,header,(message|body))>

上面的例子聲明了:"note" 元素必須包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

聲明混合型的內(nèi)容

例子:

<!ELEMENT note (#PCDATA|to|from|header|message)*>

上面的例子聲明了:"note" 元素可包含出現(xiàn)零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

聲明屬性

屬性聲明擁使用下列語法:

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

DTD 實例:

<!ATTLIST payment type CDATA "check">

XML 實例:

<payment type="check" />

以下是屬性類型的選項:

類型描述
CDATA值為字符數(shù)據(jù) (character data)
(en1|en2|..)此值是枚舉列表中的一個值
ID值為唯一的 id
IDREF值為另外一個元素的 id
IDREFS值為其他 id 的列表
NMTOKEN值為合法的 XML 名稱
NMTOKENS值為合法的 XML 名稱的列表
ENTITY值是一個實體
ENTITIES值是一個實體列表
NOTATION此值是符號的名稱
xml:值是一個預(yù)定義的 XML 值

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

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

規(guī)定一個默認(rèn)的屬性值

DTD:

<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

合法的 XML:

<square width="100" />

在上面的例子中,"square" 被定義為帶有 CDATA 類型的 "width" 屬性的空元素。如果寬度沒有被設(shè)定,其默認(rèn)值為0 。

#IMPLIED

語法

<!ATTLIST 元素名稱 屬性名稱 屬性類型 #IMPLIED>

例子

DTD:

<!ATTLIST contact fax CDATA #IMPLIED>

合法的 XML:

<contact fax="555-667788" />

合法的 XML:

<contact />

假如您不希望強(qiáng)制作者包含屬性,并且您沒有默認(rèn)值選項的話,請使用關(guān)鍵詞 #IMPLIED。

#REQUIRED

語法

<!ATTLIST 元素名稱 屬性名稱 屬性類型 #REQUIRED>

例子

DTD:

<!ATTLIST person number CDATA #REQUIRED>

合法的 XML:

<person number="5677" />

非法的 XML:

<person />

假如您沒有默認(rèn)值選項,但是仍然希望強(qiáng)制作者提交屬性的話,請使用關(guān)鍵詞 #REQUIRED。

#FIXED

語法

<!ATTLIST 元素名稱 屬性名稱 屬性類型 #FIXED "value">

例子

DTD:

<!ATTLIST sender company CDATA #FIXED "Microsoft">

合法的 XML:

<sender company="Microsoft" />

非法的 XML:

<sender company="W3School" />

如果您希望屬性擁有固定的值,并不允許作者改變這個值,請使用 #FIXED 關(guān)鍵詞。如果作者使用了不同的值,XML 解析器會返回錯誤。

列舉屬性值

語法:

<!ATTLIST 元素名稱 屬性名稱 (en1|en2|..) 默認(rèn)值>

DTD 例子:

<!ATTLIST payment type (check|cash) "cash">

XML 例子:

<payment type="check" />

或者

<payment type="cash" />

如果您希望屬性值為一系列固定的合法值之一,請使用列舉屬性值。

實體是用于定義用于定義引用普通文本或特殊字符的快捷方式的變量。

實體引用是對實體的引用。

實體可在內(nèi)部或外部進(jìn)行聲明。

一個內(nèi)部實體聲明

語法:

<!ENTITY 實體名稱 "實體的值">

例子:

DTD 例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

注釋: 一個實體由三部分構(gòu)成: 一個和號 (&), 一個實體名稱, 以及一個分號 (;)。

一個外部實體聲明

語法:

<!ENTITY 實體名稱 SYSTEM "URI/URL">

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

通過 XML 解析器進(jìn)行驗證

當(dāng)您試圖打開某個 XML 文檔時,XML 解析器有可能會產(chǎn)生錯誤。通過訪問 parseError 對象,就可以取回引起錯誤的確切代碼、文本甚至所在的行。

注釋:load( ) 方法用于文件,而 loadXML( ) 方法用于字符串。

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")

document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)

關(guān)閉驗證

通過把 XML 解析器的 validateOnParse 設(shè)置為 "false",就可以關(guān)閉驗證。

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")

document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)

Try it Yourself

通用的 XML 驗證器

為了幫助您驗證 XML 文件,我們創(chuàng)建了此鏈接,這樣你就可以驗證任何 XML 文件了。

parseError 對象

電視節(jié)目表 DTD

<!DOCTYPE TVSCHEDULE [

<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)> 
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>

]>

報紙文章 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">

]>

產(chǎn)品目錄 DTD

拷貝自:http://www.php.cn/

<!DOCTYPE CATALOG [

<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">

<!ELEMENT CATALOG (PRODUCT+)>

<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">

<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>

<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte" 
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">

<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>

<!ELEMENT NOTES (#PCDATA)>

]>

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI