多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > XML文檔類型定義---DTD文檔

XML文檔類型定義---DTD文檔

來源:程序員人生   發布時間:2016-08-17 10:01:06 閱讀次數:3603次

DTD的作用

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元素

DTD中描寫的基本部件是元素和屬性,它們負責肯定XML文檔的邏輯結構。元素表示1個信息對象,而屬性表示這個對象的性質。所有元素中有且只有1個根元素,其他的元素都是它的子元素,除根元素外,每一個元素都被其他元素包括,1個元素可以有幾個不同類型的子元素。

  1. -元素的基本類型 元素的基本類型大致可分為兩種,1種稱為簡單型,另外一種稱為復合型。簡單型具有文本數據,便可析字符數據,該類型也稱為上下文中的“#PCADTA”;復合型可以包括其他元素和文本數據。

    • 簡單型
      “#PCDATA”(Parsed Character Data)表示標記的內容是可解析文本,所謂的可解析文本就是非標記文本。用“#PCDATA”規范了的元素不能再包括子元素。例如How do you do是不包括標記的文本,而How do you do就不是可解析的數據類型,由于其中包括有標記和。另外DTD文檔中不同元素定義的次序沒有前后關系,但文檔的語法對大小寫敏感。
      “#PCDATA”的聲明格式:
<!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)>
  1. 空元素的聲明
    在第3章中已介紹了空標記的使用方法,那末在DTD中如何對與其對應的空元素進行聲明呢?其聲明格式:
<ELEMENT Element_Name EMPTY>

例以下面的語句:

<ELEMENT hr EMPTY>
  1. 不限定元素內容的聲明
    ANY是DTD中使用很頻繁的1個關鍵字,特別是對文檔根元素的聲明。在定義1個DTD文檔時通常很難準確地肯定1個元素是不是具有子元素的情況,此時1般的做法是指定該元素的子元素為ANY型(表示可以是任意的元素),這樣在它當中可以包括任何數據、任何聲明的子元素及其數據和子元素的組合。
    ANY元素的聲明格式:
<!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>
  1. 元素出現次數的控制
    在DTD中定義1個元素的子元素不過是解決該元素可以包括甚么元素,各個子元素的出現次序和能夠出現的次數的問題。DTD可以在1定程度上控制出現的次數。太精確太復雜的控制是沒必要要的。如明確規定1個元素出現3次或4次,是容易使到的,使用上面介紹的子元素列表的設定方法便可實現,但如果重復出現的次數較多時,這類方法就顯得10分笨拙,這時候可用以下方法來對其進行控制。
    (1) 1個元素可能出現1次,也可能不出現。這時候可通過在元素名后面加上1個“?”來實現。
    (2) 1個元素可能不出現,也可能出現屢次。這時候可通過在元素名后面加上1個“*”來實現。
    (3) 1個元素可能出現1次,也可能出現屢次,但最少也要出現1次。這時候可通過在元素名后面加上1個“+”來實現。
  2. 元素組
    在聲明復合型元素的時候,可使用括號將其部份子元素組合在1起,成為1個元素組,該元素組在特性上與普通元素沒甚么區分,可以對其使用“?”、“*”、“+”等控制字符。
    【例4.7】 元素組的使用,代碼以下所示。
<?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>
  1. 混合型元素
    還有另外一種元素,其內容既可以為字符數據,也能夠為子元素,這類元素稱為混合型元素。混合型元素的聲明格式:
<!ELEMENT Element_Name(#PCDATA|Child_Element1|Child_Element2,…)>

混合型元素的存在破壞了文檔的層次結構化,不利于利用軟件對XML文檔的處理,在XML文檔開發進程中,它可以作為1個不成熟的DTD文檔,1步1步地在XML文檔中添加元素,邊添加邊測試其正確性,這時候可將還沒有處理的部份作為字符數據組織到1個混合型元素中,以便使文檔通過測試。但在文檔最后完成時,要通過添加新元素的方法來清除這類非結構化信息。

DTD屬性

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>
  1. ENTITY與ENTITIES型
    ENTITY類型的屬性提供了把外部2進制情勢的文件(如.jpeg、.mp3等)和外部不可解析實體鏈接到XML文檔的功能。因此其屬性值也必須為不可解析的鏈接外部實際數據的通用實體名。ENTITIES類型屬性的屬性值可由多個不可解析的外部實體名稱組成,各實體名稱之間使用空格隔開。
    【例4.11】 ENTITY與ENTITIES的使用,代碼以下所示。
<?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>

DTD中的實體

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;">
  1. 外部1般實體
    所謂外部1般實體就是在文檔實體之外定義的,要通過1個URL才能援用到的實體。外部1般實體為獨立的文件,可被多個文檔所援用。正由于每個完全的XML文檔都是1個合法的實體,所以XML通過對外部1般實體的援用,可以在1個XML文檔中嵌入另外一個XML文檔,或將多個文檔組合成1個文檔。其定義的語法格式以下:
<!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)>
  1. 外部參數實體
    外部參數實體是指在獨立的外部DTD文檔的外部定義和使用的實體,外部參數實體用于將多個獨立的DTD文檔組合成1個大的DTD文檔。定義外部參數實體的語法格式以下:
<!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)>

使用DTD

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>

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久黄网 | 最近中文字幕在线播放 | 在线精品日韩一区二区三区 | 亚洲午夜色 | 国产精品国产三级国产普通话对白 | 中国性猛交xxxx乱大交 | 国产美女网站视频 | 欧美16一17sex性hd | 亚洲精品一区二区三区四区五区 | 91视频综合| 亚洲国产欧洲精品路线久久 | 亚洲好逼 | 99成人免费视频 | 免费观看欧美性一级 | 欧美伦理三级在线播放影院 | 波多洁野衣一二区三区| 国产午夜毛片v一区二区三区 | 黑人xxxx videos hd| 久久国产视屏 | 日韩v欧美| 性xxxx欧美 | 91精品欧美一区二区综合在线 | 成人性色生活片免费看爆迷你毛片 | 最新亚洲人成网站在线影院 | 亚洲网站在线播放 | 亚洲免费看片 | 欧美在线观看一区 | 亚洲精品视频在线免费 | 九九精品免视看国产成人 | 亚洲精品乱无伦码 | freexx性日本 | 成人中文字幕在线 | 99成人精品 | 中文字幕天天躁夜夜狠狠综合 | 亚洲精品国产自在久久老牛 | 欧美18videosex初次 | 亚洲精品国产v片在线观看 亚洲精品国产啊女成拍色拍 | 国产精品久久久久久久hd | 欧美国产一区二区二区 | 在线观看中文字幕码2022 | 美国伊人网 |