第3章 有效的XML文件-DTD_第1頁(yè)
第3章 有效的XML文件-DTD_第2頁(yè)
第3章 有效的XML文件-DTD_第3頁(yè)
第3章 有效的XML文件-DTD_第4頁(yè)
第3章 有效的XML文件-DTD_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1頁(yè)第3章有效的XML文件—DTD引言本章學(xué)習(xí)目標(biāo)本章大綱引言文檔類型定義(DocumentTypeDefinition,DTD)是有效的XML文檔的基礎(chǔ)。用戶可按照XML文檔語(yǔ)法規(guī)則隨意地創(chuàng)建自己的標(biāo)記,向其中添加元素和屬性等,但是如果每個(gè)人或每家公司都按照自己的意愿和愛好設(shè)計(jì)標(biāo)記、添加元素及屬性,那么對(duì)于同一問題設(shè)計(jì)出來的文檔之間就可能有很大的不同,不便于解析器解析其中的數(shù)據(jù),因此需要一套機(jī)制通過設(shè)置特定的規(guī)則來控制XML文檔結(jié)構(gòu)。這套機(jī)制就稱為文檔類型定義,簡(jiǎn)稱為DTD。本章大綱3.1DTD概述3.2DTD的基本結(jié)構(gòu)3.3DTD元素定義3.4DTD屬性說明3.5DTD實(shí)體聲明3.6DTD現(xiàn)狀和Schema的優(yōu)勢(shì)本章學(xué)習(xí)目標(biāo)● 理解DTD的基本概念● 掌握DTD元素類型及聲明語(yǔ)法● 掌握DTD屬性類型及聲明語(yǔ)法● 理解DTD實(shí)體類型及聲明語(yǔ)法● 了解DTD文件現(xiàn)狀DTD概述-1DTD(DocumentTypeDefinition)是一套關(guān)于標(biāo)記符的語(yǔ)法規(guī)則。它是XML1.0版規(guī)格的一部分,是XML文件的驗(yàn)證機(jī)制,屬于XML文件組成的一部分。DTD文件是一個(gè)ASCII文本文件,后綴名為.dtd。DTD概述-2DTD提供了一套檢驗(yàn)數(shù)據(jù)的語(yǔ)言,在DTD中詳細(xì)描述了每個(gè)元素可以包含的子元素、元素的出現(xiàn)順序、出現(xiàn)次數(shù)以及屬性的相關(guān)設(shè)置等信息。可以確保文檔內(nèi)部數(shù)據(jù)的正確性。文檔類型定義的作用就是給予文檔一種格式(type),使用戶知道所使用的XML文檔需包含哪些標(biāo)記(tag)、屬性(attribute)、實(shí)體(entities)。DTD定義了置標(biāo)語(yǔ)言、文檔結(jié)構(gòu)的語(yǔ)法和詞匯表,實(shí)際上是定義了一個(gè)語(yǔ)法分析器。DTD的分類外部DTD可以單獨(dú)形成文件,后綴名為.dtd,該文件可以被多個(gè)XML文檔共享和DTD調(diào)用。內(nèi)部DTD是在XML文檔中直接定義DTD,該DTD只能被當(dāng)前XML文檔使用。DTD的基本結(jié)構(gòu)-1

內(nèi)部DTD文檔類型聲明以“<!DOCTYPE”開始,以“]>”結(jié)束,通常將開始和結(jié)束標(biāo)記放在不同的行。<!DOCTYPE根元素名稱[<!ELEMENT子元素名稱(#PCDATA)>]>內(nèi)部DTD舉例【例3-1】帶有內(nèi)部DTD的XML文檔<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPEbook[<!ELEMENTbook(name)><!ELEMENTname(#PCDATA)>]><book><name>《XML教程》</name></book>DTD的基本結(jié)構(gòu)-2外部DTD如果需要在XML文件中使用外部DTD,必須在XML文檔的文檔類型定義部分通過URL引用外部DTD,語(yǔ)法格式聲明如下:<!DOCTYPE

根元素名稱

SYSTEM"DTD-URL">或<!DOCTYPE根元素名稱PUBLIC“DTD-name”“DTD-URL”>外部DTD舉例-1【3-2】外部引用DTD先根據(jù)需求構(gòu)思XML文檔的格式,建立DTD文檔。<?xmlversion=”1.0”encoding=”GB2312”><!ELEMENTbook(name,publisher,company,author)><!ELEMENTname(#PCDATA)><!ELEMENTpublisher(#PCDATA)><!ELEMENTcompany(#PCDATA)><!ELEMENTauthor(#PCDATA)>將上述代碼保存到book.dtd文檔外部DTD舉例-2引用上述DTD文檔的XML文檔內(nèi)容如下:<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPE

bookSYSTEM“book.dtd”><book><name>《XML教程》</name><publisher>清華大學(xué)出版社</publisher><company>鄭州大學(xué)</company><author>慕橙</author></book>DTD基本結(jié)構(gòu)模板DTD的基本結(jié)構(gòu)包括XML聲明、元素聲明、屬性聲明、實(shí)體聲明等,DTD基本結(jié)構(gòu)模板如下所示:<!ELEMENT…> <!--定義一個(gè)XML元素--><!ELEMENT…>…<!ATTLIST…> <!--指定元素?fù)碛械膶傩?-><!ATTLIST…>…<!ENTITY…> <!--定義一個(gè)實(shí)體-->…<!NOTATION…> <!--定義一個(gè)符號(hào)-->...DTD元素定義元素是DTD的重要組成部分。在DTD中,元素是通過ELEMENT標(biāo)記聲明的,該標(biāo)記提供所有聲明元素的名稱和內(nèi)容規(guī)范。元素的名稱遵守XML對(duì)名稱的限制。<!ELEMENT元素名稱類別>或者<!ELEMENT元素名稱(元素內(nèi)容)>表示XML的標(biāo)記名指明XML中此元素應(yīng)該包含什么類型的數(shù)據(jù)指明XML中此元素應(yīng)該包含什么樣的內(nèi)容對(duì)子元素的規(guī)定如果一個(gè)元素有一個(gè)或多個(gè)子元素,需要將子元素定義在括號(hào)中。在DTD中,通過正則表達(dá)式規(guī)定子元素出現(xiàn)的順序和次數(shù)。語(yǔ)法分析器將這些正則表達(dá)式與XML文檔內(nèi)部的數(shù)據(jù)模式相匹配,以判別一個(gè)文檔是否是ValidatingXML。符號(hào)說明符號(hào)說明+必須出現(xiàn)一次以上?不出現(xiàn)或只出現(xiàn)一次*不出現(xiàn)或可出現(xiàn)多次無(wú)符號(hào)只出現(xiàn)一次子元素聲明舉例【例3-3】聲明子元素Authorlist元素?fù)碛凶釉豠uthor,且可能有一個(gè)或多個(gè):<!ELEMENTauthorlist(author+)>遵循上述DTD規(guī)定的XML文件應(yīng)該這樣定義:<authorlist><author>李四</author><author>張三</author></authorlist>空元素空元素表示在XML的標(biāo)記中沒有任何數(shù)據(jù),不能包含子元素和文本,但可以有屬性。語(yǔ)法格式如下:<!ELEMENT元素名EMPTY>【例3-4】聲明空元素<!ElEMENTbrEMPTY>在XML中,下面的元素就是合法的。<br/>Unrestricted元素Unrestricted元素表示在XML文檔中可以包含任何在DTD中定義的元素內(nèi)容。一般情況下,只把文檔的根元素定義為此類型,這樣設(shè)定后,元素出現(xiàn)的次數(shù)和順序不受限制。語(yǔ)法格式如下:<!ELEMENT元素名稱ANY>【例3-5】聲明Unrestricted元素<!ElEMENTanimalsANY>注意:過多地使用ANY會(huì)破壞文檔結(jié)構(gòu)的清晰性,所以在DTD中應(yīng)慎用ANY。簡(jiǎn)單元素簡(jiǎn)單元素使用關(guān)鍵字#PCDATA,此元素可以包含任何字符數(shù)據(jù),但不能包含子元素。語(yǔ)法格式如下:<!ELEMENT

元素名稱

(#PCDATA)>【例3-6】聲明簡(jiǎn)單元素<!ELEMENTbookname(#PCDATA)>上述bookname可以是空元素也可以包含數(shù)據(jù)內(nèi)容,但是一定不能包含子元素。如果在XML文檔中定義子元素,則是非法的,例如:<bookname><author>張三</author><name>XML教程</name></bookname>以上代碼會(huì)被驗(yàn)證出錯(cuò)?;旌显鼗旌显仡愋偷亩x為:<!ELEMENT元素名(#PCDATA|子元素1|子元素2|···|子元素n)*>【例3-7】聲明混合元素<!ELEMENTbook(#PCDATA|author|press)*>相應(yīng)XML文檔如下所示:<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPEbook[<!ELEMENTbook(#PCDATA|bookname|author|press)*><!ELEMENTbookname(#PCDATA)><!ELEMENTauthor(#PCDATA)><!ELEMENTpress(#PCDATA)>]><book><bookname>XML教程</bookname></book>DTD屬性說明屬性描述元素的額外信息,是對(duì)元素的修飾與補(bǔ)充。信息詳細(xì)的XML文檔都有一個(gè)特點(diǎn),即元素通過屬性來添加附加信息。元素的屬性聲明由ATTLIST關(guān)鍵字、元素名稱及屬性定義3部分構(gòu)成。<!ATTLIST元素名屬性名屬性類型屬性限定條件>一個(gè)聲明可以同時(shí)聲明元素的多個(gè)屬性,只需要使用空格分隔即可。屬性的默認(rèn)值名稱含義#REQUIRED必須賦值的屬性,在XML文檔中必須給出這個(gè)屬性的屬性值#IMPLIED屬性值可有可無(wú)的屬性,不要求在XML文檔中給該屬性賦值,而且也無(wú)需在DTD中為該屬性提供默認(rèn)值#FIXED固定取值的屬性。需要為一個(gè)特定的屬性提供一個(gè)特定的默認(rèn)值,并且不希望XML文檔中另給出元素值把此默認(rèn)值代替掉Defaultvalue事先定義了默認(rèn)值的屬性。需要在DTD中提供一個(gè)默認(rèn)值,在XML文檔中可以為該屬性提供新的屬性值,也可以不另外給出屬性值屬性的類型類型含義CDATA純文本,由可顯示字符組成的字符串Enumerated取值來自一組可接受的取值范圍,在()內(nèi)被指定ID以屬性值的方式為文檔中的某個(gè)元素定義唯一的標(biāo)識(shí),用以區(qū)分具有相同結(jié)構(gòu)、相同屬性的不同元素IDREF屬性值引用已定義的ID值,方法是把那個(gè)元素的Tn標(biāo)識(shí)值作為該屬性的取值ENTITY取值為一個(gè)已定義的實(shí)體ENTITYS該屬性包含多個(gè)外部實(shí)體,不同實(shí)體用空格隔開NMTOKEN表述屬性值只能由字母、數(shù)字、下劃線、句點(diǎn)(.)、冒號(hào)(:)、連字符(一)這些符號(hào)組成NMTOKENS表示屬性值可以由多個(gè)NMTOKEN組成,每個(gè)NMTOKEN之間用空格隔開CDATA類型一個(gè)CDATA類型的屬性可以包含除小于號(hào)“<”、大于號(hào)“>”,與符號(hào)“&”、雙引號(hào)“””和單引號(hào)“’”的任何字符,前提條件是它必須滿足規(guī)范格式的約束?!纠?-11】在DTD中定義CDATA類型的屬性<!ATTLISTbooksalesCDATA#REQURED>此定義說明book元素有一個(gè)sales是必需賦值的屬性,該屬性值是任何字符數(shù)據(jù),在本例中可用此屬性描述該圖書是否售出的狀態(tài)。如果需要使用小于號(hào)“<”、大于號(hào)“>”,與符號(hào)“&”、雙引號(hào)“””和單引號(hào)“’”這幾個(gè)特殊字符,就使用實(shí)體引用(<;,>;,&;,";和&apos;)替代特殊字符。ID類型ID屬性值是具有唯一性的值,如身份證號(hào)碼、學(xué)生學(xué)號(hào)都屬于此類。如果在整份XML文件中需要類似數(shù)據(jù)表的主索引,就可以將屬性設(shè)為ID屬性類型。如果XML文檔在元素屬性的聲明中定義了ID屬性,則這個(gè)元素必須在文檔中擁有一個(gè)唯一的標(biāo)識(shí)符,只有這樣的文檔才能通過DTD的檢驗(yàn)?!纠?-13】在DTD中定義ID類型的屬性<!ATTLISTstudentsidID#REQUIRED>上述的屬性聲明指出student元素的sid屬性為ID類型,該屬性的值可以唯一的標(biāo)識(shí)“sid”Enumerated類型Enumerated類型即是枚舉類型,枚舉聲明了屬性的備選值列表,屬性必須從該列表中選擇一個(gè)值作為屬性值。通過豎線“|”把備選值隔開?!纠?-14】在DTD中定義枚舉類型的屬性<!ATTLIST學(xué)生答題(正確|錯(cuò)誤)“正確”>本例中包含一個(gè)枚舉類型的屬性聲明,元素學(xué)生的屬性“答題”的屬性值可以取值“正確”或“錯(cuò)誤”,而且默認(rèn)取值為“正確”。IDREF和IDREFSIDREF類型是ID類型的引用類型,IDREFS類型是多個(gè)ID類型的引用。IDREF和IDREFS類型的屬性值必須指向帶有ID屬性的元素。對(duì)于IDREF類型的屬性,其屬性值必須和文檔中某些ID屬性相匹配。如果IDREF類型的屬性值是一個(gè)不存在的ID值時(shí),該XML文檔會(huì)被驗(yàn)證無(wú)效。【例3-15】在DTD中定義IDREF類型的屬性<?Xmlversion=”1.0”encoding=“GB2312”?><!ELEMENTBookOrder(Customer+,book+)><!ELEMENTCustomer(name*)><!ELEMENTname(#PCDATA)><!ELEMENTbook(publishing+)><!ELEMENTpublishing(#PCDATA)><!ATTLISTCustomeroidIDREF#REQUIRED><!ATTLISTbookbidID#REQUIRED>IDREF和IDREFS(續(xù))<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPEBookOrderSYSTEM“book.dtd”><BookOrder><Customeroid=”ISBN7-333-33333-3”><name>Tom</name></Customer><Customeroid=”ISBN7-333-33333-2”><name>Lucy</name></Customer><bookbid=”ISBN7-333-33333-3”><publishing>清華大學(xué)出版社</publishing></book><bookbid=”ISBN7-333-33333-2”><publishing>北京大學(xué)出版社</publishing></book></BookOrder>NMTOKEN和NMTOKENSNMTOKEN類型類似CDATA屬性類型,但NMTOKEN是一個(gè)比CDATA類型更寬松的類型,它只要求該屬性的屬性值是一個(gè)合法的XML表示即可。也就是說,NMTOKEN類型的屬性值也是字符串?dāng)?shù)據(jù),但NMTOKEN類型的屬性值中允許出現(xiàn)的字符要多。NMTOKEN類型的屬性值中不能包含空格字符,可以由字母、數(shù)字、下劃線、點(diǎn)號(hào)“.”或連字符“_”組成,可以使用數(shù)字、點(diǎn)號(hào)或連字符開頭?!纠?-16】在DTD中定義NMTOKEN類型的屬性<?xmlversion=”1.0”encoding=“GB2312”?><!ELEMENT書籍列表(計(jì)算機(jī)書籍*)><!ELEMENT計(jì)算機(jī)書籍(書名,作者,價(jià)格,簡(jiǎn)要介紹)><!ELEMENT書名(#PCDATA)><!ELEMENT作者(#PCDATA)><!ELEMENT價(jià)格(#PCDATA)><!ELEMENT簡(jiǎn)要介紹(#PCDATA)><!ATTLIST作者地址NMTOKEN#REQUIRED>NMTOKEN和NMTOKENS(續(xù))<?xmlversion=”1.0”encoding=”GB2312”><!DOCTYPE書籍列表SYSTEM“book.dtd”><書籍列表><計(jì)算機(jī)書籍><書名>XML教程</書名><作者地址=”鄭州”>李剛</作者><價(jià)格>63</價(jià)格><簡(jiǎn)要介紹>該書主要介紹了XML的各種相關(guān)知識(shí)。</簡(jiǎn)要介紹></計(jì)算機(jī)書籍></書籍列表>ENTITY和ENTITIESENTITY類型的屬性包含在DTD的其他位置聲明的未解析實(shí)體中,它能夠把外部二進(jìn)制數(shù)據(jù),即外部未解析的普通實(shí)體鏈接到XML文檔。ENTITY類型的屬性值是在DTD中聲明的未解析常規(guī)實(shí)體的名稱,它與外部數(shù)據(jù)相連?!纠?-17】在DTD中定義ENTITY類型的屬性<?Xmlversion=”1.0”encoding=”gb2312”><!DOCTYPEphotos[<!ELEMENTphotos(photo*)><!ELEMENTphotoEMPTY><!ATTLISTphotosourceENTITY#REQUIRED><!ENTITYsrcSYSTEM“img.gif”>]><photos><photosource=”src”/></photos>DTD實(shí)體聲明在XML文檔中,可以將經(jīng)常使用的XML文本區(qū)段定義成實(shí)體,這樣可以快速地將XML文本內(nèi)容插入到任何需要插入的地方。此外,也可以將外部文件定義成實(shí)體,然后將外部數(shù)據(jù)附加到XML文檔。實(shí)體的概念在XML中,實(shí)體一詞具有廣泛的含義,其基本意思是指與XML文檔相關(guān)的下列任何形式的存儲(chǔ)單元。有效的XML文檔本身。外部的DTD子集。定義成DTD中外部實(shí)體的外部文檔。在DTD中定義的,用引號(hào)括起來的字符。實(shí)體的分類實(shí)體可以通過3種方式進(jìn)行分類。(1)通用實(shí)體與參數(shù)實(shí)體通用實(shí)體可以在XML文檔中使用。參數(shù)實(shí)體只能用在DTD文件中,該實(shí)體包含了可以被安插在DTD中的XML文檔。(2)內(nèi)部實(shí)體和外部實(shí)體內(nèi)部實(shí)體是實(shí)體的內(nèi)容已經(jīng)包含在DTD文件中。外部實(shí)體的內(nèi)容是通過URI引用DTD以外的其他文件。(3)可解析實(shí)體與不可解析實(shí)體可解析實(shí)體就是可以被解析器解析的數(shù)據(jù)。不可解析實(shí)體就是解析器無(wú)法解析的數(shù)據(jù),通常指二進(jìn)制數(shù)據(jù)。XML文檔中不可引用不可解析實(shí)體。內(nèi)部通用實(shí)體-1內(nèi)部通用實(shí)體是在文檔實(shí)體內(nèi)部定義和使用的實(shí)體,其內(nèi)容通常是一段文本字符。這種實(shí)體要在DTD中通過DTD語(yǔ)句的定義,可以在XML文檔中使用,也可以在DTD中使用。其定義的語(yǔ)法格式如下:<!ENTITYentity_name“entity_value”>其中,<!ENTITY>為關(guān)鍵字,entity_name為實(shí)體名稱,entity_value為實(shí)體所代替的文本內(nèi)容。引用內(nèi)部通用實(shí)體以“&”開始,以“;”結(jié)束。例:&entity_name;內(nèi)部通用實(shí)體-2當(dāng)內(nèi)部通用實(shí)體在DTD中引用時(shí),需注意以下兩方面:(1)不能在元素及屬性的聲明中引用內(nèi)部通用實(shí)體,如下面的語(yǔ)句是非法的:<!ENTITYpcd(#PCDATA)><!ELEMENTtitle&pcd>(2)在語(yǔ)句中不能出現(xiàn)循環(huán),如下面的語(yǔ)句是非法的。<!ENTITYthepub“北大&pub;”><!ELEMENTpub“出版社&thepub:”>外部通用實(shí)體外部通用實(shí)體為獨(dú)立的文件,可被多個(gè)文檔所引用。正因?yàn)槊恳粋€(gè)完整的XML文檔都是一個(gè)合法的實(shí)體,所以XML通過對(duì)外部通用實(shí)體的引用,可以在一個(gè)XML文檔中嵌入另一個(gè)XML文檔,或者將多個(gè)文檔組合成一個(gè)文檔。其定義的語(yǔ)法格式如下:<!ENTITYentity_name“URL”>其中,URL為引用的外部實(shí)體的URL地址。引用外部通用實(shí)體也與引用內(nèi)部通用實(shí)體的方法一樣:&entity_name;參數(shù)實(shí)體與通用實(shí)體的區(qū)別(1)在引用形式上,通用實(shí)體的引用為“&entity_name;”,而參數(shù)實(shí)體的引用則為“%entity_name;”(2)在引用范圍上,通用實(shí)體可在XML文檔中引用,也可在DTD中引用,而參數(shù)實(shí)體只可在DTD中引用。內(nèi)部參數(shù)實(shí)體內(nèi)部參數(shù)實(shí)體是指在獨(dú)立的內(nèi)部DTD文檔的內(nèi)部定義和使用的實(shí)體,其內(nèi)容僅能為DTD而非XML文檔內(nèi)容的書寫文本。定義內(nèi)部參數(shù)實(shí)體的語(yǔ)法格式如下:<!ENTITY%entity_name“entity_value”>【例3-21】?jī)?nèi)部參數(shù)實(shí)體的定義及引用<!ENTITY%HeadingAlign“l(fā)eft|center|right”><!ELEMENTmessage(Content,Align)+><!ELEMENTContent(#PCDATA)><!ELEMENTAlign(%HeadingAlign;)>外部參數(shù)實(shí)體外部參數(shù)實(shí)體是指在獨(dú)立的外部DTD文檔的外部定義和使用的實(shí)體,外部參數(shù)實(shí)體用于將多個(gè)獨(dú)立的DTD文檔組合成一個(gè)大的DTD文檔。定義外部參數(shù)實(shí)體的語(yǔ)法格式如下:<!ENTITY%entity_name“URL”>DTD現(xiàn)狀DTD是驗(yàn)證XML文檔有效性的方法之一,其存在著一些不足。作為SGMLDTD的一個(gè)子集,XMLDTD與XML的格式完全不同。因此,XML文檔開發(fā)人員必須使用這套與XML本身不同的語(yǔ)法來驗(yàn)證X

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論