教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

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

更新時(shí)間:2021年06月07日17時(shí)19分 來(lái)源:傳智教育 瀏覽次數(shù):

DTD約束是早期出現(xiàn)的一種XML約束模式語(yǔ)言,根據(jù)它的語(yǔ)法創(chuàng)建的文件稱(chē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入門(mén)經(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)行編寫(xiě)的。接下來(lái)針對(duì)例1-7所示的約束文檔進(jìn)行詳細(xì)地講解,具體如下:

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

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

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

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

(1)<!DOCTYPE 根元素名稱(chēng) SYSTEM  "外部DTD文件的URI">
(2)<!DOCTYPE 根元素名稱(chēng) PUBLIC "DTD名稱(chēng)" "外部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入門(mén)經(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名稱(chēng),它用于說(shuō)明DTD符合的標(biāo)準(zhǔn)、所有者的名稱(chēng)以及對(duì)DTD描述的文件進(jìn)行說(shuō)明,雖然DTD名稱(chēng)看上去比較復(fù)雜,但這完全是由DTD文件發(fā)布者去考慮的事情,XML文件的編寫(xiě)者只要把DTD文件發(fā)布者事先定義好的DTD標(biāo)識(shí)名稱(chēng)進(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入門(mén)經(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文件。





猜你喜歡:

DTD語(yǔ)法詳細(xì)教程:DTD語(yǔ)法詳解

創(chuàng)建XML的第一步-文檔聲明【Java技術(shù)文章】

Schema約束是什么?XML Schema有什么特點(diǎn)?

XML是什么:可拓展標(biāo)記語(yǔ)言

傳智教育java 開(kāi)發(fā)培訓(xùn)

0 分享到:
和我們?cè)诰€交談!