XML文檔是1種元標記語言,即1種定義標記語言的語言。在XML中可以創建新的標記語言,這些新的標記語言(也叫標記集)要通過文檔類型定義(Document Type Definitions,DTD)來定義。DTD文檔是這些新的標記語言的法律性文檔。如果XML文檔的語法符,DTD的定義和規定,那末就稱為1個合法的XML文檔,否則就是非法的XML文檔。合法的XML文檔在實際利用中的地位很重要,由于只有合法的XML文檔才能被利用軟件有效地處理。
DTD定義了文檔的邏輯結構,規定了文檔中所使用的元素、實體、元素的屬性、元素與實體之間的關系。其作用主要表現在以下幾個方面。
(1) 使用DTD可以提供1種統1的格式。XML的可擴大性為文檔的作者提供了很高的靈活性,可有時候需要的是統1,要求某1類文檔具有相同的結構。
(2) 使用DTD可以保證數據交換和同享的順利進行。
(3) DTD使用戶能夠不依賴具體的數據就知道文檔的邏輯結構。在沒有XML文檔的時候,也能夠根據DTD為XML文檔編寫樣式單,編寫處理程序,這樣可以有效地提高工作效力。
(4) 使用DTD可以驗證數據的有效性。DTD對文檔的邏輯結構進行了束縛,這類束縛可以比較寬松,也能夠10分嚴格。可以根據DTD檢查數據,以驗證其是不是符合規定和要求,這可以保證數據的正確和有效。
DTD中描寫的基本部件是元素和屬性,它們負責肯定XML文檔的邏輯結構。元素表示1個信息對象,而屬性表示這個對象的性質。所有元素中有且只有1個根元素,其他的元素都是它的子元素,除根元素外,每一個元素都被其他元素包括,1個元素可以有幾個不同類型的子元素。
-元素的基本類型 元素的基本類型大致可分為兩種,1種稱為簡單型,另外一種稱為復合型。簡單型具有文本數據,便可析字符數據,該類型也稱為上下文中的“#PCADTA”;復合型可以包括其他元素和文本數據。
<!ELEMENT Element_Name (#PCDATA )>
“#PCDATA”的用法,代碼以下所示。
?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
2.-元素的聲明
1. 元素聲明的基本語法
元素的聲明格式:
<ELEMENT Element_Name Element_Defination>
其中,Element_Name為聲明的元素名稱,Element_Defination為元素內容格式的定義。
合法的元素聲明語句如:
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT publisher (#PCDATA)>
<ELEMENT Element_Name EMPTY>
例以下面的語句:
<ELEMENT hr EMPTY>
<!ELEMENT Element_Name ANY>
而在文檔剛開始定義時,其實不明確將來的利用領域中會有多少個元素,所以唯1的做法就是標記為ANY類型,表示可以包括任何元素和可解析數據。例如:
<!ELEMENT person ANY>
然后在文檔的實際開發進程中再逐漸完善該元素的子元素的具體定義,將ANY關鍵字替換掉。
【例4.3】 ANY的用法,代碼如源程序code4_3.xml所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ANY>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
文檔中能有多個ANY型的元素嗎?這是完全可以的,由于ANY型的元素不1定是根元素。
包括多個ANY型元素的XML文檔,代碼下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ANY>
<!ELEMENT title ANY>
<!ELEMENT author ANY>
<!ELEMENT publisher ANY>
<!ELEMENT price ANY>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
ANY型的元素在文檔中應盡可能少使用,由于這與XML文檔的數據結構性相背背。但多數情況之下在定義1個元素的所有子元素之前,總是首先以ANY代替,最后再以實際的子元素替換ANY關鍵字,定義出具體的DTD文檔。
4. 子元素列表的設定
在XML中有1種針對復合元素的最為嚴格的設定方法,稱為子元素列表的設定。這類方式下,元素都具有哪些子元素、每一個子元素出現的次數和位置都有明確的規定,在具體文檔實現時,必須嚴格履行。
子元素列表的設定語法以下:
<!ELEMENT Element_Name(Child_Element1, Child_Element2,…)>
其中“(Child_Element1, Child_Element2,…)”部份為Element_Name所具有的子元素列表。
【例4.5】 子元素列表的設定,代碼以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<pubdate>2004.6</pubdate>
<ISBN>7-04-014768⑻</ISBN>
</publish>
<price>19.7</price>
</bookinfo>
上面程序是1個不合法的文檔,緣由在于,標記<pubdate></pubdate>
和<ISBN></ISBN>
的使用順序與DTD中定義的順序不1致。在1個標記后面的子標記列表中,子標記出現的次序代表了將來XML文檔中的子標記出現次序,而且這類次序不能被背背。
5. 可選擇的子元素
有些時候,需要在兩個或多個互斥的元素中進行選擇。即多選1的情況,如1個人的性別可以是男或女,二者中只能有1種情況。DTD有專門的語法來處理這類情況,其語法格式以下:
<!ELEMENT Element_Name(Child_Element1|Child_Element2|……)>
其中,“(Child_Element1|Child_Element2|…)”部份為選擇性元素組合,具體使用時必須要在這個列表當選擇其1。
【例4.6】 選擇性元素列表的設定,代碼以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher|ISBN|pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
</publish>
<price>19.7</price>
</bookinfo>
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ((title,author,price)+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<price>19.7</price>
<title>3國演義</title>
<author>羅貫中</author>
<price>50.0</price>
</bookinfo>
在實際利用中,使用元素組可能不是最好的方案。這時候也能夠先將準備分組的元素定義為1個復合元素,再在原來的元素中援用剛定義的復合元素,這樣文檔的結構更清晰。
【例4.8】 較好的方案,代碼以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT maininfo (title, author, price)>
<!ELEMENT bookinfo (booknumb, maininfo+)>
<!ELEMENT booknumb (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<booknumb>2</booknumb>
<maininfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<price>19.7</price>
</maininfo>
<maininfo>
<title>3國演義</title>
<author>羅貫中</author>
<price>50.0</price>
</maininfo>
</bookinfo>
<!ELEMENT Element_Name(#PCDATA|Child_Element1|Child_Element2,…)>
混合型元素的存在破壞了文檔的層次結構化,不利于利用軟件對XML文檔的處理,在XML文檔開發進程中,它可以作為1個不成熟的DTD文檔,1步1步地在XML文檔中添加元素,邊添加邊測試其正確性,這時候可將還沒有處理的部份作為字符數據組織到1個混合型元素中,以便使文檔通過測試。但在文檔最后完成時,要通過添加新元素的方法來清除這類非結構化信息。
4.3.1 屬性的聲明
在DTD中,屬性的聲明格式:
<!ATTLIST Element_name Attribute_name TYPE Default_value>
其中,<!ATTLIST>
為屬性聲明的關鍵字,Element_name為元素名,Attribute_name為屬性名,TYPE是屬性類型,Default_value為沒有設定屬性值時的默許值。
【例4.9】 屬性的聲明,代碼以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ATTLIST bookinfo ISBN CDATA "7-04-014768⑻">
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo ISBN="7-04-014768⑻">
<title>計算機導論</title>
<author>丁躍潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
圖4.5 屬性的聲明
在聲明屬性時有以下需要注意的事項。
(1) 可以屢次為1個元素聲明其中所包括的屬性。如在XML文檔中有以下語句:
<bookinfo id="001" bookcategory="文藝" >
</bookinfo>
屬性聲明可以為
<!ATTLIST bookinfo id CDATA "001">
<!ATTLIST bookinfo bookcategory CDATA "文藝" >
<!ELEMENT bookinfo (#PCDATA)>
(2) 屬性的聲明在文檔中的次序沒有嚴格的要求,可位于與其相連的元素聲明之前或以后。如在XML文檔中有以下語句:
<bookinfo id="001" bookcategory="文藝" >
</bookinfo>
屬性聲明可以為
<!ATTLIST bookinfo bookcategory CDATA "文藝" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
(3) 所有元素的屬性,都要在各自所對應的標記中聲明。如在XML文檔中有以下語句:
<bookinfo id="001" bookcategory="文藝" >
</bookinfo>
<publish publisher="高等教育出版社" ISBN="7-04-014768⑻">
</publish>
屬性聲明可以為
<!ATTLIST bookinfo bookcategory CDATA "文藝" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
<!ATTLIST publish publisher CDATA "高等教育出版社" >
<!ATTLIST publish ISBN CDATA "7-04-014768⑻">
<!ELEMENT publish (#PCDATA)>
(4) 屬性有4種不同類型的默許值,可在屬性聲明中的Default_value部份指定。
① default:表示使用提供的默許值,default不是1個關鍵字,它代表1個預設的字符串。
<!ATTLIST bookinfo bookcategory("文藝"|"自然科學")"文藝" >
此例句表示當在XML文檔中省略了對bookinfo元素的bookcategory屬性值進行設定時,該屬性的默許值就是“文藝”。
② #REQUIRED:表示屬性值必須指定。
③ #IMPLIED:表示元素的這個屬性可用可不用。
④ #FIXED:表示元素的這個屬性值是1個固定值,且必須是指定的值。
4.3.2 屬性的類型
在屬性的聲明中TYPE部份為屬性的類型設定,DTD中屬性的類型有10種,下面將對這些數據類型進行逐1的介紹。
1. CDATA型
CDATA型表明屬性值為不包括“<”和“””的任意字符串,如果屬性值中需要包括“<”和“””,則可以使用特殊字符來代替。
2. Enumerated型
如果屬性值其實不是任意的字符串,而是在幾個可能的值中進行選擇,如書籍的“種別”屬性,其值可為“文藝”,也可為“自然科學”,而不可能為其他情況時,則可以將書籍的“種別”屬性設定為Enumerated型。
3. ID型
當元素的某個屬性值是不能重復時,如書籍的ISBN屬性、個人的“身份證號”屬性等,要定義這樣的屬性則需使用屬性的ID類型。在1個XML文檔中,所有元素的ID類型屬性的屬性值必須是唯1的,不可重復,另外,1個元素不能有超過1個ID類型的屬性。
4. IDREF與IDREFS型
IDREF為Identifier Reference的縮寫,IDREF與ID類型屬性的關系為子元素與父元素的關系,即IDREF類型屬性的值必須是其他元素的ID類型屬性的值,且該ID類型屬性的值必須在文檔的其他地方被設定過。IDREFS類型屬性的屬性值可有多個,每個都必須是在文檔其他地方被設定了的ID類型屬性的值,而這多個屬性值之間用空格隔開。
【例4.10】 IDREFS的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE school [
<!ELEMENT school (teacher, subject*)>
<!ELEMENT teacher (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ATTLIST teacher
teach IDREFS #IMPLIED
>
<!ATTLIST subject
number ID #REQUIRED
>
]>
<school>
<teacher teach="c0001 c0002 c0003">
丁瀟
</teacher>
<subject number="c0001">
PowerBuilder
</subject>
<subject number="c0002">
AutoCAD
</subject>
<subject number="c0003">
XML
</subject>
</school>
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username, password, picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED
>
<!ATTLIST customer
ID #REQUIRED
>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103">
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2"/>
</customer>
<customer ID="c0500208">
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4"/>
</customer>
</customers>
本例不是所有XML閱讀器都可以自動辨認的通用格式,僅僅某些閱讀器和利用程序可能采取的在文檔中嵌入非XML數據的方法而已。
6. NMTOKEN與NMTOKENS型
NMTOKEN類型的屬性限定屬性值是有效的XML名稱,這個屬性值可以由英文、數字、“.”、 “_”、“-”、“:”等組成,這里有幾點需要注意。
(1) 不能包括空格。
(2) 以上字符中除“:”之外,其他字符都可以作為開頭字符。
(3) “:”可以出現在中間,但由于它是命名域的關鍵字符,所以1般不提倡使用。
正由于NMTOKEN類型的屬性對字符的嚴格要求,使得它在1些經常使用編程語言中,都是合法的數據,這就為這些編程語言對XML文檔數據的操作打下了良好的基礎。
NMTOKENS類型的屬性具有與NMTOKEN屬性相近的情勢。這類類型的屬性可使以下情況合法——屬性由若干XML名稱組成,彼其間由空格隔開。通常可為使用NMTOKEN屬性相同的理由而使用NMTOKENS屬性,但僅僅在需要多個名字的時候。
7. NOTATION型
XML文檔中引入了外部不可解析的實體后,解析器沒法解析這些2進制文件,這時候,就能夠使用NOTATION類型的屬性為這些2進制文件指定與其對應的利用軟件以對其進行處理。
【例4.12】 NOTATION的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username,password,picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!NOTATION mspaint SYSTEM "C:\WINDOWS\system32\mspaint.exe">
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED>
<!ATTLIST picture procedure NOTATION #REQUIRED>
<!ATTLIST customer ID ID #REQUIRED>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103" >
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2" procedure="mspaint"/>
</customer>
<customer ID="c0500208" >
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4" procedure="mspaint"/>
</customer>
</customers>
4.4.1 實體的概念
實體是包括了文檔片斷的虛擬存儲單元,可用來存儲XML聲明、DTD、其他情勢的文本及2進制數據等。簡單來說就是1段代碼或數據的代稱,這個代稱即為實體的名字。當需要在文檔中援用某段代碼或數據時,可以援用與這段代碼或數據相對應的實體名稱來代替實體的具體內容。具有正確性檢查功能的XML處理器在提交文檔給終究利用程序之前或在顯示文檔之前,將先把所有不同的實體援用替換為與其對應的具體內容,從而構成1個結構完全的文檔。
4.4.2 實體的分類
依照實體的具體內容來分類,實體可分為可解析與不可解析兩類。可解析實體的具體內容為簡單的字符、數字、文本塊,而不可解析實體的具體內容則為圖片、聲音等2進制文件。
依照邏輯存儲來分類,實體可分為內部實體與外部實體兩類。內部實體的內容是在文檔內部設定的;而外部實體則是1個外部獨立的物理存儲對象,如某個外部文件。
依照使用的范圍來分類,實體可分為1般實體與參數實體兩類。1般實體都用來構成文檔的具體內容,可出現在XML文檔中,也可出現在DTD中;而參數實體只能出現在DTD中,不能出現在XML文檔中。
1. 內部1般實體
內部1般實體就是在文檔實體內部定義和使用的實體,其內容通常是1段文本字符。這類實體要在DTD中通過DTD語句的定義,可以在XML文檔中使用,也可在DTD中使用。其定義的語法格式以下:
<!ENTITY Eentity_name "Replacement" >
其中,<!ENTITY>
為關鍵字,Eentity_name為實體名稱,Replacement為實體所代替的文本內容。援用內部1般實體的方法以下:
&Eentity_name;
【例4.13】 內部1般實體的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title, author, publish, price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher, ISBN, pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY thepublisher "高等教育出版社">
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher> &thepublisher; </publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
其顯示結果與4.2節的圖4.2相同。
當內部1般實體在DTD中援用時,有以下幾方面需注意。
(1) 不能在元素及屬性的聲明中援用內部1般實體,以下面的語句即為非法的:
<!ENTITY pcd (#PCDATA)>
<!ELEMENT title &pcd;>
(2) 在語句中不能出現循環,以下面的語句即為非法的:
<!ENTITY thepub "北京大學&pub;">
<!ENTITY pub "出版社&thepub;">
<!ENTITY Eentity_name "URL" >
其中,URL為援用的外部實體的URL地址。援用外部1般實體也與援用內部1般實體的方法1樣:
&Eentity_name;
假設有1個XML文檔code4_14out.xml以下:
<?xml version="1.0" encoding="gb2312" ?>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
可以通過下面的例子把它作為外部實體來援用。
【例4.14】 外部1般實體的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY pub SYSTEM "code4_14out.xml">
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
&pub;
<price>19.7</price>
</bookinfo>
其顯示結果仍與4.2節的圖4.2相同。
在援用外部1般實體時,有以下幾方面需注意。
(1) 由于在1個文檔中需援用某些外部文件,所以該文檔聲明中的standalone屬性不再是默許值yes,而應當為no。
(2) 作為外部1般實體的文檔,若使用的是XML的默許字符集即UTF⑻或UNICODE,則可以在文檔頭部不進行XML聲明,否則,必須有XML聲明,且聲明時,1定要說明ecoding屬性。
3. 內部參數實體
內部參數實體是指在獨立的外部DTD文檔的內部定義和使用的實體,其內容為僅能為DTD而非XML文檔內容的書寫文本。這里提到參數實體與前面所講的1般實體是有區分的:
(1) 在援用情勢上,1般實體的援用為“&Eentity_name;”,而參數實體的援用則為“%Eentity_name;”
(2) 在援用范圍上,1般實體可在XML文檔中援用,也可在DTD中援用,而參數實體只可在DTD中援用。
定義內部參數實體的語法格式以下:
<!ENTITY % Eentity_name "Replacement" >
【例4.15】 內部參數實體的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY % pub "(publisher,ISBN,pubdate)">
<!ELEMENT publish %pub;>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY % Eentity_name "URL" >
【例4.16】 外部參數實體的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo SYSTEM "code4_16_1.dtd">
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
程序code4_16_1.dtd為
<?xml version="1.0" encoding="gb2312"?>
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY % pub SYSTEM "code4_16_2.dtd">
%pub;
<!ELEMENT price (#PCDATA)>
程序code4_16_2.dtd為
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
4.5.1 內部DTD
內部DTD的定義語句和XML文檔在同1個文檔中,且通常放置在XML文檔的頭部。在定義內部DTD時,定義內部DTD的語句要全部放置在文檔類型聲明中,其語法格式:
<!DOCTYPE Root_Element_Name [
…
]>
其中,為關鍵字,Root_Element_Name為根元素名,[…]部份則為內部DTD定義語句。如例4.1,即是1個包括內部DTD的XML文檔。
4.5.2 外部DTD
外部DTD就是有關文檔定義的語句都被獨立出來放在1個外部文件中,對其進行獨立的管理。跟據其內容的性質,可分為兩種,1種是私有文件,指未公然的、屬于某組織或個人私有的DTD文件;另外一種是公然文件,是指由國際標準組織如ISO等或可發布技術建議的組織如W3C等,為某1領域所制定的公然的標準DTD。
援用私有DTD文件的語法格式:
<!DOCTYPE Root_Element_name SYSTEM "URL">
其中,URL為外部DTD文件的相對路徑或絕對路徑,該語句必須置于XML文檔的頭部,且在XML文檔處理指令中要將standalone屬性值設定為no。如例4.14。
援用公然DTD文件的語法格式:
<!DOCTYPE Root_Element_name PUBLIC "Public_Dtd_name" " Public_Dtd_URL">
其中,PUBLIC為公然DTD文件的關鍵字。Public_Dtd_name為公然DTD文件的文件名,這個文件名由4個部份組成:第1部份為DTD的發布者,若是ISO發布,則第1部份為ISO;若是非ISO的標準組織發布,則為“+”;若是非標準組織發布,則為“-”。第2部份為所有者的名字。第3部份為表明這個DTD文件的主要內容或種別的扼要文本。第4部份為所使用的語言,該語言標志必須是ISO639所定義過的標準標志。這4部份之間用“//”隔開。Public_Dtd_URL為公然DTD文件的相對路徑或絕對路徑。
4.5.3 混合DTD
所謂混合DTD,即為內部DTD與外部DTD混合使用。在DTD使用的實際情況中, 很少使用完全標準的DTD,常常是公司先為所有的開發小組提供1分公共的DTD作為外部DTD,然后各個成員在實際的使用進程中再進行擴大定義,這時候的擴大定義常常是使用內部DTD來實現的。
【例4.17】 混合DTD的使用,代碼以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo SYSTEM "code4_16_2.dtd"[
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>計算機導論</title>
<author>丁躍潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>