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

什么是DTD約束?怎樣書(shū)寫和操作DTD文檔?

更新時(shí)間:2021-06-07 來(lái)源:黑馬程序員 瀏覽量:

DTD約束是早期出現(xiàn)的一種XML約束模式語(yǔ)言,根據(jù)它的語(yǔ)法創(chuàng)建的文件稱為DTD文件。在一個(gè)DTD文件中,可以包含元素的定義、元素之間關(guān)系的定義、元素屬性的定義以及實(shí)體和符號(hào)的定義。接下來(lái)通過(guò)一個(gè)案例來(lái)簡(jiǎn)單認(rèn)識(shí)一下DTD約束,如例1、例2所示。

例1 book.xml

     <?xml version="1.0" encoding="gb2312"?>
     <書(shū)架>
         <書(shū)>
             <書(shū)名>Java就業(yè)培訓(xùn)教程</書(shū)名>
             <作者>張孝祥</作者>
             <售價(jià)>58.00元</售價(jià)>
         </書(shū)>
         <書(shū)>
             <書(shū)名>EJB3.0入門經(jīng)典</書(shū)名>
             <作者>黎活明</作者>
             <售價(jià)>39.00元</售價(jià)>
         </書(shū)>
     </書(shū)架>
例2 book.dtd
     <!ELEMENT 書(shū)架 (書(shū)+)>
     <!ELEMENT 書(shū) (書(shū)名,作者,售價(jià))>
     <!ELEMENT 書(shū)名 (#PCDATA)>
     <!ELEMENT 作者 (#PCDATA)>
     <!ELEMENT 售價(jià) (#PCDATA)>
例2所示的book.dtd是一個(gè)簡(jiǎn)單的DTD約束文檔。在例1中,book.xml中定義的每個(gè)元素都是按照book.dtd文檔所規(guī)定的約束進(jìn)行編寫的。接下來(lái)針對(duì)例1-7所示的約束文檔進(jìn)行詳細(xì)地講解,具體如下:

●在第1行中,使用<!ELEMENT …>語(yǔ)句定義了一個(gè)元素,其中“書(shū)架”是元素的名稱,“(書(shū)+)”表示書(shū)架元素中有一個(gè)或者多個(gè)書(shū)元素,字符“+”用來(lái)表示它所修飾的成分必須出現(xiàn)一次或者多次。

●在第2行中,“書(shū)”是元素名稱,“(書(shū)名,作者,售價(jià))”表示元素書(shū)包含書(shū)名、作者、售價(jià)這三個(gè)子元素,并且這些子元素要按照順序依次出現(xiàn)。

● 在第3~5行中,“書(shū)名”、“作者”和“售價(jià)”都是元素名稱,“(#PCDATA)”表示元素中嵌套的內(nèi)容是普通的文本字符串。

對(duì)DTD文件有了大致了解后,如果想使用DTD文件約束XML文檔,必須在XML文檔中引入DTD文件。在XML文檔中引入外部DTD文件有兩種方式,具體如下:

(1)<!DOCTYPE 根元素名稱 SYSTEM  "外部DTD文件的URI">
(2)<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱" "外部DTD文件的URI">

在上述兩種引入DTD文件的方式中,第一種方式用來(lái)引用本地的DTD文件,第二種方式用來(lái)引用公共的DTD文件,其中“外部DTD文件的URI”指的是DTD文件的存放位置,對(duì)于第一種方式,它可以是相對(duì)于xml文檔的相對(duì)路徑,也可以是一個(gè)絕對(duì)路徑,而對(duì)于第二種方式,它是Internet網(wǎng)上的一個(gè)絕對(duì)URL地址。

接下來(lái)對(duì)例1進(jìn)行修改,在XML文檔中引入本地的DTD文件book.dtd,如例3所示。

例3 book.xml

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

在例3中,由于引入的是本地的DTD文件,因此,使用的是SYSTEM屬性的DOCTYPE聲明語(yǔ)句。另外,在XML文檔的聲明語(yǔ)句中,standalone屬性不能設(shè)置為“yes”。

如果希望引入一個(gè)公共的DTD文件,則需要在DOCTYPE聲明語(yǔ)句中使用PUBLIC屬性,具體示例如下:

<!DOCTYPE web-app PUBLIC 
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd">

其中"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"是DTD名稱,它用于說(shuō)明DTD符合的標(biāo)準(zhǔn)、所有者的名稱以及對(duì)DTD描述的文件進(jìn)行說(shuō)明,雖然DTD名稱看上去比較復(fù)雜,但這完全是由DTD文件發(fā)布者去考慮的事情,XML文件的編寫者只要把DTD文件發(fā)布者事先定義好的DTD標(biāo)識(shí)名稱進(jìn)行復(fù)制就可以了。

DTD對(duì)XML文檔的約束,除了外部引入方式實(shí)現(xiàn)外,還可以采用內(nèi)嵌的方式。在XML中直接嵌入DTD定義語(yǔ)句的完整語(yǔ)法格式如下所示:

<?xml version="1.0"  encoding="gb2312"  standalone="yes"?>
<!DOCTYPE 根元素名 [
    DTD定義語(yǔ)句
    ……
]>

接下來(lái)對(duì)例3進(jìn)行修改,在book.xml文檔中直接嵌入book.dtd文件,修改后的代碼如例4所示。

例4 book.xml

     <?xml version="1.0" encoding="gb2312" standalone="yes"?>
     <!DOCTYPE 書(shū)架 [
         <!ELEMENT 書(shū)架 (書(shū)+)>
         <!ELEMENT 書(shū) (書(shū)名,作者,售價(jià))>
         <!ELEMENT 書(shū)名 (#PCDATA)>
         <!ELEMENT 作者 (#PCDATA)>
         <!ELEMENT 售價(jià) (#PCDATA)>
     ]>
     <書(shū)架>
         <書(shū)>
             <書(shū)名>Java就業(yè)培訓(xùn)教程</書(shū)名>
             <作者>張孝祥</作者>
             <售價(jià)>58.00元</售價(jià)>
         </書(shū)>
         <書(shū)>
             <書(shū)名>EJB3.0入門經(jīng)典</書(shū)名>
             <作者>黎活明</作者>
             <售價(jià)>39.00元</售價(jià)>
         </書(shū)>
     </書(shū)架>

例4實(shí)現(xiàn)了在XML文檔內(nèi)部直接嵌入DTD語(yǔ)句。需要注意的是,由于一個(gè)DTD文件可能會(huì)被多個(gè)XML文件引用,因此,為了避免在每個(gè)XML文檔都添加一段相同的DTD定義語(yǔ)句,通常都將其放在一個(gè)單獨(dú)的DTD文檔中定義,采用外部引用的方式對(duì)XML文檔進(jìn)行約束。這樣,不僅便于管理和維護(hù)DTD定義,還可以使多個(gè)XML文檔共享一個(gè)DTD文件。





猜你喜歡:

什么是XML?怎樣使用XML解析樹(shù)狀結(jié)構(gòu)數(shù)據(jù)?

如何編輯XML的文檔聲明?

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

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

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