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