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

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

更新時間:2021-06-07 來源:黑馬程序員 瀏覽量:

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

例1 book.xml

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

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

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

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

對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網(wǎng)上的一個絕對URL地址。

接下來對例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)教程</書名>
             <作者>張孝祥</作者>
             <售價>58.00元</售價>
         </書>
         <書>
             <書名>EJB3.0入門經(jīng)典</書名>
             <作者>黎活明</作者>
             <售價>39.00元</售價>
         </書>
     </書架>

在例3中,由于引入的是本地的DTD文件,因此,使用的是SYSTEM屬性的DOCTYPE聲明語句。另外,在XML文檔的聲明語句中,standalone屬性不能設(shè)置為“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符合的標(biāo)準(zhǔn)、所有者的名稱以及對DTD描述的文件進(jìn)行說明,雖然DTD名稱看上去比較復(fù)雜,但這完全是由DTD文件發(fā)布者去考慮的事情,XML文件的編寫者只要把DTD文件發(fā)布者事先定義好的DTD標(biāo)識名稱進(jìn)行復(fù)制就可以了。

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

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

接下來對例3進(jìn)行修改,在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就業(yè)培訓(xùn)教程</書名>
             <作者>張孝祥</作者>
             <售價>58.00元</售價>
         </書>
         <書>
             <書名>EJB3.0入門經(jīng)典</書名>
             <作者>黎活明</作者>
             <售價>39.00元</售價>
         </書>
     </書架>

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





猜你喜歡:

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

如何編輯XML的文檔聲明?

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

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

分享到:
在線咨詢 我要報名
和我們在線交談!