更新時(shí)間:2023年02月01日10時(shí)22分 來源:傳智教育 瀏覽次數(shù):
DTD約束是早期出現(xiàn)的一種XML約束模式語言,根據(jù)它的語法創(chuàng)建的文件稱為DTD文件。在一個(gè)DTD文件中,可以包含元素的定義、元素之間關(guān)系的定義、元素屬性的定義以及實(shí)體和符號(hào)的定義。接下來通過一個(gè)案例來簡(jiǎn)單認(rèn)識(shí)一下DTD約束,如例1、例2所示。
例1 book.xml
<?xml version="1.0" encoding="gb2312"?> <書架> <書> <書名>Java就業(yè)培訓(xùn)教程</書名> <作者>張孝祥</作者> <售價(jià)>58.00元</售價(jià)> </書> <書> <書名>EJB3.0入門經(jīng)典</書名> <作者>黎活明</作者> <售價(jià)>39.00元</售價(jià)> </書> </書架>例2 book.dtd
<!ELEMENT 書架 (書+)> <!ELEMENT 書 (書名,作者,售價(jià))> <!ELEMENT 書名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售價(jià) (#PCDATA)>例2所示的book.dtd是一個(gè)簡(jiǎn)單的DTD約束文檔。在例1中,book.xml中定義的每個(gè)元素都是按照book.dtd文檔所規(guī)定的約束進(jìn)行編寫的。接下來針對(duì)例1-7所示的約束文檔進(jìn)行詳細(xì)地講解,具體如下:
●在第1行中,使用<!ELEMENT …>語句定義了一個(gè)元素,其中“書架”是元素的名稱,“(書+)”表示書架元素中有一個(gè)或者多個(gè)書元素,字符“+”用來表示它所修飾的成分必須出現(xiàn)一次或者多次。
●在第2行中,“書”是元素名稱,“(書名,作者,售價(jià))”表示元素書包含書名、作者、售價(jià)這三個(gè)子元素,并且這些子元素要按照順序依次出現(xiàn)。
● 在第3~5行中,“書名”、“作者”和“售價(jià)”都是元素名稱,“(#PCDATA)”表示元素中嵌套的內(nèi)容是普通的文本字符串。
對(duì)DTD文件有了大致了解后,如果想使用DTD文件約束XML文檔,必須在XML文檔中引入DTD文件。在XML文檔中引入外部DTD文件有兩種方式,具體如下:
(1)<!DOCTYPE 根元素名稱 SYSTEM "外部DTD文件的URI"> (2)<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱" "外部DTD文件的URI">
在上述兩種引入DTD文件的方式中,第一種方式用來引用本地的DTD文件,第二種方式用來引用公共的DTD文件,其中“外部DTD文件的URI”指的是DTD文件的存放位置,對(duì)于第一種方式,它可以是相對(duì)于xml文檔的相對(duì)路徑,也可以是一個(gè)絕對(duì)路徑,而對(duì)于第二種方式,它是Internet網(wǎng)上的一個(gè)絕對(duì)URL地址。
接下來對(duì)例1進(jìn)行修改,在XML文檔中引入本地的DTD文件book.dtd,如例3所示。
例3 book.xml
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE 書架 SYSTEM "book.dtd"> <書架> <書> <書名>Java就業(yè)培訓(xùn)教程</書名> <作者>張孝祥</作者> <售價(jià)>58.00元</售價(jià)> </書> <書> <書名>EJB3.0入門經(jīng)典</書名> <作者>黎活明</作者> <售價(jià)>39.00元</售價(jià)> </書> </書架>
在例3中,由于引入的是本地的DTD文件,因此,使用的是SYSTEM屬性的DOCTYPE聲明語句。另外,在XML文檔的聲明語句中,standalone屬性不能設(shè)置為“yes”。
如果希望引入一個(gè)公共的DTD文件,則需要在DOCTYPE聲明語句中使用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名稱,它用于說明DTD符合的標(biāo)準(zhǔn)、所有者的名稱以及對(duì)DTD描述的文件進(jìn)行說明,雖然DTD名稱看上去比較復(fù)雜,但這完全是由DTD文件發(fā)布者去考慮的事情,XML文件的編寫者只要把DTD文件發(fā)布者事先定義好的DTD標(biāo)識(shí)名稱進(jìn)行復(fù)制就可以了。
DTD對(duì)XML文檔的約束,除了外部引入方式實(shí)現(xiàn)外,還可以采用內(nèi)嵌的方式。在XML中直接嵌入DTD定義語句的完整語法格式如下所示:
<?xml version="1.0" encoding="gb2312" standalone="yes"?> <!DOCTYPE 根元素名 [ DTD定義語句 …… ]>
接下來對(duì)例3進(jìn)行修改,在book.xml文檔中直接嵌入book.dtd文件,修改后的代碼如例4所示。
例4 book.xml
<?xml version="1.0" encoding="gb2312" standalone="yes"?> <!DOCTYPE 書架 [ <!ELEMENT 書架 (書+)> <!ELEMENT 書 (書名,作者,售價(jià))> <!ELEMENT 書名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售價(jià) (#PCDATA)> ]> <書架> <書> <書名>Java就業(yè)培訓(xùn)教程</書名> <作者>張孝祥</作者> <售價(jià)>58.00元</售價(jià)> </書> <書> <書名>EJB3.0入門經(jīng)典</書名> <作者>黎活明</作者> <售價(jià)>39.00元</售價(jià)> </書> </書架>
例4實(shí)現(xiàn)了在XML文檔內(nèi)部直接嵌入DTD語句。需要注意的是,由于一個(gè)DTD文件可能會(huì)被多個(gè)XML文件引用,因此,為了避免在每個(gè)XML文檔都添加一段相同的DTD定義語句,通常都將其放在一個(gè)單獨(dú)的DTD文檔中定義,采用外部引用的方式對(duì)XML文檔進(jìn)行約束。這樣,不僅便于管理和維護(hù)DTD定義,還可以使多個(gè)XML文檔共享一個(gè)DTD文件。
北京校區(qū)