首頁(yè)技術(shù)文章正文

DTD語(yǔ)法詳細(xì)介紹【黑馬程序員】

更新時(shí)間:2020-12-29 來(lái)源:黑馬程序員 瀏覽量:

在編寫(xiě)XML文檔時(shí),需要掌握XML語(yǔ)法。同理,在編寫(xiě)DTD文檔時(shí),也需要遵循一定的語(yǔ)法。DTD的結(jié)構(gòu)一般由元素類(lèi)型定義、屬性定義、實(shí)體定義、記號(hào)(notation)定義等構(gòu)成,一個(gè)典型的文檔類(lèi)型定義會(huì)把將來(lái)要?jiǎng)?chuàng)建的XML文檔的元素結(jié)構(gòu)、屬性類(lèi)型、實(shí)體引用等預(yù)先進(jìn)行定義。接下來(lái),針對(duì)DTD結(jié)構(gòu)中所涉及到的語(yǔ)法進(jìn)行詳細(xì)講解。

一、元素定義

元素是XML文檔的基本組成部分,在DTD定義中,每一條<!ELEMENT…>語(yǔ)句用于定義一個(gè)元素,其基本的語(yǔ)法格式如下所示:

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

在上面元素的定義格式中,包含了“元素名稱(chēng)”和“元素內(nèi)容”。其中,“元素名稱(chēng)”是自定義的名稱(chēng),它用于定義被約束XML文檔中的元素,“元素內(nèi)容”是對(duì)元素包含內(nèi)容的聲明,包括數(shù)據(jù)類(lèi)型和符號(hào)二部分,它共有五種內(nèi)容形式,具體如下:

(1)#PCDATA:表示元素中嵌套的內(nèi)容是普通文本字符串,其中,關(guān)鍵字PCDATA是Parsed Character Data的簡(jiǎn)寫(xiě)。例如<!ELEMENT 書(shū)名 (#PCDATA)>表示書(shū)名所嵌套的內(nèi)容是字符串類(lèi)型。

(2)子元素:說(shuō)明元素包含的元素。通常用一對(duì)圓括號(hào)()將元素中要嵌套的一組子元素括起來(lái),例如,<!ELEMENT 書(shū) (書(shū)名,作者,售價(jià))>表示元素書(shū)中要嵌套書(shū)名、作者、售價(jià)等子元素。


(3)混合內(nèi)容:表示元素既可以包含字符數(shù)據(jù),也可以包含子元素?;旌蟽?nèi)容必須被定義零個(gè)或多個(gè),例如,<!ELEMENT 書(shū) (#PCDATA|書(shū)名)*>表示書(shū)中嵌套的子元素書(shū)名包含零個(gè)或多個(gè),并且書(shū)名是字符串文本格式。


(4)EMPTY:表示該元素既不包含字符數(shù)據(jù),也不包含子元素,是一個(gè)空元素。如果在文檔中元素本身已經(jīng)表明了明確的含義,就可以在DTD中用關(guān)鍵字EMPTY表明空元素。例如,<!ELEMENT br EMPTY>,

其中br是一個(gè)沒(méi)有內(nèi)容的空元素。

(5)ANY:表示該元素可以包含任何的字符數(shù)據(jù)和子元素。例如,<!ELEMENT 聯(lián)系人 ANY>表示聯(lián)系人可以包含任何形式的內(nèi)容。但在實(shí)際開(kāi)發(fā)中,應(yīng)該盡量避免使用ANY,因?yàn)槌烁赝?,其它使用ANY的元素都將失去DTD對(duì)XML文檔的約束效果。


需要注意的是,在定義元素時(shí),元素內(nèi)容中可以包含一些符號(hào),不同的符號(hào)具有不同的作用,接下來(lái),針對(duì)一些常見(jiàn)的符號(hào)進(jìn)行講解,具體如下:


● 問(wèn)號(hào)[?]:表示該對(duì)象可以出現(xiàn)0次或1次。


●星號(hào)[*]:表示該對(duì)象可以出現(xiàn)0次或多次。


●加號(hào)[+]:表示該對(duì)象可以出現(xiàn)1次或多次。


● 豎線[|]:表示列出的對(duì)象中選擇1個(gè)。


●逗號(hào)[,]:表示對(duì)象必須按照指定的順序出現(xiàn)。


● 括號(hào)[()]:用于給元素進(jìn)行分組。


二、屬性定義

在DTD文檔中,定義元素的同時(shí),還可以為元素定義屬性。DTD屬性定義的基本語(yǔ)法格式如下所示:


<!ATTLIST 元素名
      屬性名1 屬性類(lèi)型 設(shè)置說(shuō)明
屬性名1 屬性類(lèi)型 設(shè)置說(shuō)明
......
>

在上面屬性定義的語(yǔ)法格式中,“元素名”是屬性所屬元素的名字,“屬性名”是屬性的名稱(chēng),“屬性類(lèi)型”則是用來(lái)指定該屬性是屬于哪種類(lèi)型,“設(shè)置說(shuō)明”用來(lái)說(shuō)明該屬性是否必須出現(xiàn)。關(guān)于“屬性類(lèi)型”和“設(shè)置說(shuō)明”的相關(guān)講解,具體如下:


1、設(shè)置說(shuō)明

定義元素的屬性時(shí),有四種設(shè)置說(shuō)明可以選擇,具體如下:


1)#REQUIRED

表示元素的該屬性是必須的,例如,當(dāng)定義聯(lián)系人信息的DTD時(shí),我們希望每一個(gè)聯(lián)系人都有一個(gè)聯(lián)系電話屬性,這時(shí),可以在屬性聲明時(shí),使用REQUIRED。


2)#IMPLIED

表示元素可以包含該屬性,也可以不包含該屬性。比如,當(dāng)定義一本書(shū)的信息時(shí),發(fā)現(xiàn)書(shū)的頁(yè)數(shù)屬性對(duì)讀者無(wú)關(guān)緊要,這時(shí),在屬性聲明時(shí),可以使用IMPLIED。


3)#FIXED

表示一個(gè)固定的屬性默認(rèn)值,在XML文檔中不能將該屬性設(shè)置為其它值。使用#FIXED關(guān)鍵字時(shí),還需要為該屬性提供一個(gè)默認(rèn)值。當(dāng)XML文檔中沒(méi)有定義該屬性時(shí),其值將被自動(dòng)設(shè)置為DTD中定義的默認(rèn)值。


4)默認(rèn)值

和FIXED一樣,如果元素不包含該屬性,該屬性將被自動(dòng)設(shè)置為DTD中定義的默認(rèn)值。不同的是,該屬性的值是可以改變的,如果XML文件中設(shè)置了該屬性,新的屬性值會(huì)覆蓋DTD中定義的默認(rèn)值。


2、屬性類(lèi)型

在DTD中定義元素的屬性時(shí),有十種屬性類(lèi)型可以選擇,具體如下:


1) CDATA

這是最常用的一種屬性類(lèi)型,表明屬性類(lèi)型是字符數(shù)據(jù),與元素內(nèi)容說(shuō)明中的#PCDATA相同。當(dāng)然,在屬性設(shè)置值中出現(xiàn)的特殊字符,也需要使用其轉(zhuǎn)義字符序列來(lái)表示,例如,用&amp;表示字符(&),用&lt;表示字符(<)等。


2) Enumerated(枚舉類(lèi)型)

在聲明屬性時(shí),可以限制屬性的取值只能從一個(gè)列表中選擇,這類(lèi)屬性屬于Enumerated(枚舉類(lèi)型)。需要注意的是,在DTD定義中并不會(huì)出現(xiàn)關(guān)鍵字Enumerated。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何定義Enumerated類(lèi)型的屬性,如例1所示。

例1 enum.xml

<?xml version="1.0" encoding="GB2312" standalone="yes">
<!DOCTYPE 購(gòu)物籃 [
    <!ELEMENT 購(gòu)物籃 ANY>
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品種(雞肉|牛肉|豬肉|魚(yú)肉) "雞肉">
]>
    <購(gòu)物籃>
        <肉 品種="魚(yú)肉"/>
        <肉 品種="牛肉"/>
        <肉/>
    </購(gòu)物籃>

在例1中,“品種”屬性的類(lèi)型是Enumerated,其值只能為 “雞肉”、“牛肉”“豬肉”和“魚(yú)肉”,而不能使用其它值?!捌贩N”屬性的默認(rèn)值是“雞肉”,所以,即使<購(gòu)物籃>元素中的第三個(gè)子元素沒(méi)有顯示定義“品種”這個(gè)屬性,但它實(shí)際也具有“品種”這個(gè)屬性,且屬性的取值為“雞肉”。


3)ID

一個(gè)ID類(lèi)型的屬性用于唯一標(biāo)識(shí)XML文檔中的一個(gè)元素。其屬性值必須遵守XML名稱(chēng)定義的規(guī)則。一個(gè)元素只能有一個(gè)ID類(lèi)型的屬性,而且ID類(lèi)型的屬性必須設(shè)置為#IMPLIED或#REQUIRED。因?yàn)镮D類(lèi)型屬性的每一個(gè)取值都是用來(lái)標(biāo)識(shí)一個(gè)特定的元素,所以,為ID類(lèi)型的屬性提供默認(rèn)值,特別是固定的默認(rèn)值是毫無(wú)意義的。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何定義一個(gè)ID類(lèi)型的屬性,如例2所示。


例2 id.xml


<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
<!DOCTYPE 聯(lián)系人列表[
    <!ELEMENT 聯(lián)系人列表 ANY>
    <!ELEMENT 聯(lián)系人 (姓名,EMAIL)>
    <!ELEMENT 姓名 (#PCDATA)>
    <!ELEMENT EMAIL (#PCDATA)>
    <!ATTLIST 聯(lián)系人 編號(hào) ID #REQUIRED>
]>
   <聯(lián)系人列表>
        <聯(lián)系人 編號(hào)="1">
              <姓名>張三</姓名>
              <EMAIL>zhang@itcast.cn</EMAIL>
        </聯(lián)系人>
        <聯(lián)系人 編號(hào)="2">
              <姓名>李四</姓名>
              <EMAIL>li@itcast.cn</EMAIL>
        </聯(lián)系人>
 </聯(lián)系人列表>

在例2中,將元素為<聯(lián)系人>的編號(hào)屬性設(shè)置為#REQUIRED,說(shuō)明每個(gè)聯(lián)系人都有一個(gè)編號(hào),同時(shí),屬性編號(hào)的類(lèi)型為ID,說(shuō)明編號(hào)是唯一的。如此一來(lái),通過(guò)編號(hào)就可以找到唯一對(duì)應(yīng)的聯(lián)系人了。


4)IDREF和IDREFS

例2中,雖然張三和李四兩個(gè)聯(lián)系人的ID編號(hào)是唯一的,但是這兩個(gè)ID類(lèi)型的屬性沒(méi)有發(fā)揮作用,這時(shí)可以使用IDREF類(lèi)型,使這兩個(gè)聯(lián)系人之間建立一種一對(duì)一的關(guān)系。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)IDREF類(lèi)型的使用,如例3所示。


例3 Idref.xml


<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
<!DOCTYPE 聯(lián)系人列表[
    <!ELEMENT 聯(lián)系人列表 ANY>
    <!ELEMENT 聯(lián)系人 (姓名,EMAIL)>
    <!ELEMENT 姓名 (#PCDATA)>
    <!ELEMENT EMAIL (#PCDATA)>
    <!ATTLIST 聯(lián)系人
                編號(hào) ID #REQUIRED
               上司 IDREF #IMPLIED>
      ]>
      <聯(lián)系人列表>
         <聯(lián)系人 編號(hào)="1">
             <姓名>張三</姓名>
             <EMAIL>zhang@itcast.org</EMAIL>
         </聯(lián)系人>
         <聯(lián)系人 編號(hào)="2" 上司="1">
              <姓名>李四</姓名>
              <EMAIL>li@itcast.org</EMAIL>
         </聯(lián)系人>
     </聯(lián)系人列表>

在例3中,為元素<聯(lián)系人列表>的子元素<聯(lián)系人>增加了一個(gè)名稱(chēng)為上司的屬性,并且將該屬性的類(lèi)型設(shè)置為IDREF,IDREF類(lèi)型屬性的值必須為一個(gè)已經(jīng)存在的ID類(lèi)型的屬性值。在第二個(gè)<聯(lián)系人>元素中,將上司屬性設(shè)置為第一個(gè)聯(lián)系人的編號(hào)屬性值,如此一來(lái),就形成了兩個(gè)聯(lián)系人元素之間的對(duì)應(yīng)關(guān)系,即李四的上司為張三。


IDREF類(lèi)型可以使兩個(gè)元素之間建立一對(duì)一的關(guān)系,但是,如果兩個(gè)元素之間的關(guān)系是一對(duì)多,例如,一個(gè)學(xué)生去圖書(shū)館可以借多本書(shū)。這時(shí),需要使用IDREFS類(lèi)型來(lái)指定某個(gè)人借閱了哪些書(shū)。需要注意的是,IDREFS類(lèi)型的屬性可以引用多個(gè)ID類(lèi)型的屬性值,這些ID的屬性值需要用空格分隔。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)IDREFS的使用,如例4所示。


例4 Library.xml

 <?xml version=”1.0” encoding=”GB2312”?>
 <!DOCTYPE library[
     <!ELEMENT libarary (books,records)>
     <!ELEMENT books (book+)>
     <!ELEMENT book (title)>
     <!ELEMENT title (#PCDATA)>
     <!ELEMENT records (item+)>
     <!ELEMENT item (data,person)>
     <!ELEMENT data (#PCDATA)>
      <!ELEMENT person EMPTY>
      <!ATTLIST book bookid ID #REQUIRED>
      <!ATTLIST person name CDATA #REQUIRED>
      <!ATTLIST person borrowed IDREFS #REQUIRED>
  ]>
<library>
      <books>
          <book>
              <book bookid="b0101">
                 <title>Java就業(yè)培訓(xùn)教材</title>
              </book>
              <book bookid="b0102">
                 <title>Java Web開(kāi)發(fā)內(nèi)幕 </title>
              </book>
              <book bookid="b0103">
                 <title>Java開(kāi)發(fā)寶典</title>
              </book>
      </books>
<records>
        <item>
            <data>2013-03-13</data>
            <person name="張三" borrowed="b0101 b0103"/>
       </item>
        <item>
              <data>2013-05-23</data>
              <person name="李四" borrowed="b0101 b0102 b0103"/>
        </item>
    </records>
</library>


例4中,將元素<book>中屬性名為bookid的屬性設(shè)置為ID類(lèi)型,元素<person>中名為borrowed的屬性設(shè)置為IDREFS類(lèi)型。從Library.xml文檔中可以看出,張三借閱了《Java就業(yè)培訓(xùn)教材》和《Java開(kāi)發(fā)寶典》這兩本書(shū),而李四則借閱了《Java就業(yè)培訓(xùn)教材》、《Java Web開(kāi)發(fā)內(nèi)幕》和《Java開(kāi)發(fā)寶典》這三本書(shū)。


5)NMTOKEN和NMTOKENS


NMTOKEN是Name Token的簡(jiǎn)寫(xiě),它表示由一個(gè)或者多個(gè)字母、數(shù)字、句點(diǎn)(.)、連字號(hào)(-)或下劃線(_)所組成的一個(gè)名稱(chēng)。NMTOKENS關(guān)鍵字表示一種列表類(lèi)型。一個(gè)元素的NMOTOKENS類(lèi)型的屬性設(shè)置值可以是同一個(gè)XML文件中的另外多個(gè)NMTOKEN類(lèi)型的屬性的設(shè)置值,每個(gè)NMTOKEN屬性值之間用空格分隔。具體示例如下:

<!ELEMENT 用戶 EMPTY>
<!ATTLIST  用戶 姓名 NMTOKEN #REQUIRED>
<!ELEMENT 數(shù)據(jù) (#PCDATA)>
<!ATTLIST  數(shù)據(jù) 授權(quán)用戶 NMTOKENS #IMPLIED>

在上面的示例中,元素<用戶>的“姓名”屬性指定為NMTOKEN類(lèi)型,元素<數(shù)據(jù)>的“授權(quán)用戶”屬性指定為NMTOKENS,與這段DTD定義語(yǔ)句對(duì)應(yīng)的XML具體如下:

<用戶 姓名="張三">

<用戶 姓名="李四">

<數(shù)據(jù) 授權(quán)用戶="張三 李四">

     這里是一些授權(quán)訪問(wèn)的數(shù)據(jù)

</數(shù)據(jù)>


6)NOTATION

現(xiàn)實(shí)世界中存在很多無(wú)法或不易用XML格式組織的數(shù)據(jù),例如圖像、聲音、影像等等。對(duì)于這些數(shù)據(jù),XML應(yīng)用程序常常并不提供直接的應(yīng)用支持,但可以通過(guò)設(shè)置NOTATION類(lèi)型的屬性來(lái)讓一個(gè)外部應(yīng)用程序進(jìn)行處理。在DTD文件中,NOTATION定義語(yǔ)句分為兩種情況,具體如下:

第一種情況:<!NOTATION 符號(hào)名 SYSTEM "MIME類(lèi)型">
第二種情況:<!NOTATION 符號(hào)名 SYSTEM "URL路徑名">

在上述定義語(yǔ)句中,第一種情況指定數(shù)據(jù)的MIME類(lèi)型,第二種情況指定處理程序的URL路徑。當(dāng)使用NOTATION類(lèi)型作為屬性的類(lèi)型時(shí),首先要在DTD中使用<!NOTATION…>語(yǔ)句定義相應(yīng)的notation,接下來(lái)通過(guò)一個(gè)例來(lái)演示NOTATION屬性的使用,如例5所示。


例5 notation.xml

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 文件[
     <!NOTATION mp SYSTEM "movPlayer.exe">
     <!NOTATION gif SYSTEM "Image/gif">
     <!ELEMENT 文件ANY>
     <!ELEMENT 電影 EMPTY>
     <ELEMENT 電影 演示設(shè)備 NOTATION (mp|gif) #REQUIRED>
     <文件>
          <電影 演示設(shè)備=”mp”/>
     <文件>

在例5中,元素<電影>指定了兩種可選的演示設(shè)備,一種是movPlayer.exe,一種是用來(lái)繪制GIF圖像的應(yīng)用程序。


7)ENTITY和ENTITYS

ENTITY對(duì)應(yīng)的中文意思為實(shí)體(關(guān)于實(shí)體定義的細(xì)節(jié),將在后面進(jìn)行介紹)。當(dāng)某個(gè)屬性的類(lèi)型設(shè)置為ENTITY時(shí),表明其屬性值必須為在DTD中使用<!ENTITY …>語(yǔ)句定義的一個(gè)實(shí)體(entity)的引用。接下來(lái)看一段DTD定義的語(yǔ)句,具體如下:


<!ENTITY itcast  "傳智播客論壇交流,www.itcast.cn">
<!ELEMENT 電影 EMPTY>
<!ATTLIST 電影 來(lái)源 ENTITY #REQUIRED>

與這段DTD定義語(yǔ)句對(duì)應(yīng)的XML數(shù)據(jù)片斷如下:

<電影 來(lái)源="&itcast;" />

需要注意的是,只有引用實(shí)體才可以作為ENTITY類(lèi)型屬性的設(shè)置值,參數(shù)實(shí)體不能用作ENTITY類(lèi)型的屬性的設(shè)置值。關(guān)于參數(shù)實(shí)體和引用實(shí)體的相關(guān)講解,將在實(shí)體定義中進(jìn)行詳細(xì)講解。


ENTITYS關(guān)鍵字用于表示一種列表類(lèi)型,一個(gè)元素的ENTITYS類(lèi)型的屬性設(shè)置值可以是多個(gè)實(shí)體的引用,每個(gè)實(shí)體的引用之間用空格分隔,具體示例如下:

<!ENTITY banner SYSTEM "http://www.itcast.cn/images/topword.gif">
<!ENTITY logo SYSTEM "http://www.itcast.cn/images/logo.gif">
<!ATTLIST image src ENTITIES #REQUIRED>

根據(jù)上面的DTD語(yǔ)句,如果想通過(guò)src屬性引用兩幅圖像,則對(duì)應(yīng)的XML數(shù)據(jù)如下所示:

<img src="logo banner">


三、實(shí)體定義

有時(shí)候需要在多個(gè)文檔中調(diào)用同樣的內(nèi)容,比如公司名稱(chēng),版權(quán)聲明等,為了避免重復(fù)輸入這些內(nèi)容,可以通過(guò)<!ENTITY…>語(yǔ)句定義一個(gè)表示這些內(nèi)容的實(shí)體,然后在各個(gè)文檔中引用實(shí)體名替代它所表示的內(nèi)容。實(shí)體可分為兩種類(lèi)型,分別是引用實(shí)體和參數(shù)實(shí)體,接下來(lái),針對(duì)這兩種實(shí)體類(lèi)型進(jìn)行詳細(xì)地講解。

1)引用實(shí)體

引用實(shí)體的語(yǔ)法定義格式有兩種:

(1)<!ENTITY 實(shí)體名稱(chēng) "實(shí)體內(nèi)容">
(2)<!ENTITY 實(shí)體名稱(chēng) SYSTEM "外部XML文檔的URL">

引用實(shí)體用于解決XML文檔中內(nèi)容重復(fù)的問(wèn)題,其引用方式方法為:

&實(shí)體名稱(chēng);

了解了引用實(shí)體的語(yǔ)法格式及其在XML文檔中的引用方式,接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí),如例6和例7所示。


例6 book.dtd

<!ENTITY itcast "傳智播客官網(wǎng),www.itcast.cn">
<!ELEMENT 書(shū)架 (書(shū)+)>
<!ELEMENT 書(shū) (書(shū)名,作者,售價(jià))>
<!ELEMENT 書(shū)名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
 <!ELEMENT 售價(jià) (#PCDATA)>


例7 book.xml

 <?xml version="1.0" encoding="GB2312"?>
 <!DOCTYPE 書(shū)架 SYSTEM "book.dtd">
 <書(shū)架>
    <書(shū)>
        <書(shū)名>Java就業(yè)培訓(xùn)教程</書(shū)名>
        <作者>&itcast;</作者>
        <售價(jià)>39.9</售價(jià)>
    </書(shū)>
    <書(shū)>
        <書(shū)名>EJB3.0入門(mén)經(jīng)典</書(shū)名>
        <作者>黎活明</作者>
        <售價(jià)>39.00元</售價(jià)>
    </書(shū)>
  </書(shū)架>

用IE9.0以下的瀏覽器打開(kāi)book.xml文件,瀏覽器顯示的結(jié)果如圖1所示。


1609225008024_01.jpg

圖1提示的錯(cuò)誤信息是“文本內(nèi)容中發(fā)現(xiàn)無(wú)效字符?!边@是因?yàn)閎ook.dtd文件使用的是本地字符集編碼,即GB2312編碼,而DTD文件應(yīng)該使用UTF-8或者Unicode編碼。需要注意的是,IE9以上版本的瀏覽器也不會(huì)提示錯(cuò)誤。


接下來(lái)我們將book.dtd按照UTF-8編碼方式進(jìn)行重新保存,保存方式如圖2所示。


1609225020940_02.jpg

按照?qǐng)D2的方式完成編碼保存后,用IE瀏覽器重新打開(kāi)book.xml文件或者單擊圖1-10工具欄中的“刷新”按鈕,瀏覽器顯示的結(jié)果如圖3所示。


1609225035134_03.jpg

從圖1、3中可以看出,book.xml文件中的“&itcast;”被顯示成“傳智播客官網(wǎng),www.itcast.cn”。


2)參數(shù)實(shí)體

參數(shù)實(shí)體只能被DTD文件自身使用,它的語(yǔ)法格式為:

<!ENTITY % 實(shí)體名稱(chēng) "實(shí)體內(nèi)容">

需要注意的是,在聲明參數(shù)實(shí)體時(shí),ENTITY、%、實(shí)體名和“實(shí)體內(nèi)容”之間各有一個(gè)空格。


引用參數(shù)實(shí)體的方式是:

%實(shí)體名稱(chēng);

了解了參數(shù)實(shí)體的語(yǔ)法格式和引用方式,接下來(lái)通過(guò)一段示例代碼來(lái)演示參數(shù)實(shí)體的定義,具體如下:

<!ENTITY % TAG_NAME "姓名|EMAIL|電話|地址">
<!ELEMENT 個(gè)人信息 (%TAG_NAME; |生日)>
<!ELEMENT 客戶信息 (%TAG_NAME; |公司名)>


在上面的示例中,DTD中定義了兩個(gè)元素,分別是“個(gè)人信息”和“客戶信息”,這兩個(gè)元素的定義中都包含了“姓名| EMAIL|電話|地址”這一相同的部分,因此,可以將相同的部分定義為一個(gè)TAG_NAMES的參數(shù)實(shí)體,然后將“個(gè)人信息”和“客戶信息”這兩個(gè)元素的定義規(guī)則中的“姓名 | EMAIL | 電話 | 地址”部分替換成對(duì)TAG_NAMES這個(gè)參數(shù)實(shí)體的引用即可。


參數(shù)實(shí)體不僅可以簡(jiǎn)化元素中定義的相同內(nèi)容,還可以簡(jiǎn)化屬性的定義,具體示例如下:

<!ENTITY % common.attributes
    'id ID #IMPLIED
    account CDATA #REQUIRED'    
>
<!ELEMENT purchaseOrder (item+, manufacturer)>
<!ELEMENT item (price, quantity)>
<!ELEMENT manufacturer (#PCDATA)>
<!ATTLIST purchaseOrder %common.attributes;>
<!ATTLIST item %common.attributes;>
<!ATTLIST manufacturer %common.attributes;>


在上面的示例中,由于多個(gè)元素都具有id和account這兩個(gè)屬性的相同定義,因此,可以將這兩個(gè)屬性的文本內(nèi)容定義為一個(gè)名稱(chēng)為common.attributes的參數(shù)實(shí)體。當(dāng)定義元素的屬性時(shí),通過(guò)引用common.attributes 這個(gè)參數(shù)實(shí)體,將該參數(shù)實(shí)體轉(zhuǎn)換為id和account 這兩個(gè)屬性所定義的文本內(nèi)容了。


值得一提的是,當(dāng)DTD的元素和屬性定義中要出現(xiàn)大量相同內(nèi)容時(shí),參數(shù)實(shí)體是一種非常不錯(cuò)的選擇。因?yàn)槿绻枰薷腄TD中相同的部分,只需要在參數(shù)實(shí)體的定義中修改即可。



猜你喜歡:

JDK安裝教程:Jdk怎么安裝?

Dubbo相關(guān)面試題附答案

什么是Master選舉?ZooKeeper在集群Master選舉中應(yīng)用

黑馬程序員java培訓(xùn)課程

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!