第3章 XML數(shù)據(jù)的底層結(jié)構(gòu)_第1頁
第3章 XML數(shù)據(jù)的底層結(jié)構(gòu)_第2頁
第3章 XML數(shù)據(jù)的底層結(jié)構(gòu)_第3頁
第3章 XML數(shù)據(jù)的底層結(jié)構(gòu)_第4頁
第3章 XML數(shù)據(jù)的底層結(jié)構(gòu)_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章XML數(shù)據(jù)的底層結(jié)構(gòu)3.1有效的XML文件3.2如何檢查XML文件的有效性3.3XML文件與DTD的匹配3.4XML文檔類型定義文件DTD符合XML語法規(guī)則的XML文件稱為規(guī)范的XML文件,也稱為良構(gòu)的XML文件。規(guī)范的XML文件再符合額外的一些約束,就稱為有效的XML文件。3.1有效的XML文件(1)

這些額外的約束就是DTD(DocumentTypeDefinition,文檔類型定義)和XMLSchema。例如,下面的文件就是一個有效的XML文件:3.1有效的XML文件(2)

<?xmlversion="1.0"?><!DOCTYPEpersions[<!ELEMENTpersions(persion*)><!ELEMENTpersion(name,sex,age)><!ELEMENTname(#PCDATA)><!ELEMENTsex(#PCDATA)><!ELEMENTage(#PCDATA)>]><persions><persion><name>xiaowang</name><sex>male</sex><age>25</age></persion></persions>

文件中的每一個標(biāo)記都在DTD中做了定義,而且滿足相應(yīng)的約束條件。

返回瀏覽器只是檢查XML文件的規(guī)范性,并不能驗證XML文件是否遵守其對應(yīng)的約束文件中的約束條件。所以檢查文件的有效性還需要通過解析器來進(jìn)行。本例通過DOM解析器來檢驗XML文件的有效性。文件MyHandler.java稱為事件處理器,用于檢驗XML文件的有效性并處理XML文件的錯誤信息,具體代碼如下:

3.2如何檢查XML文件的

有效性(1)

importorg.xml.sax.helpers.DefaultHandler;importorg.xml.sax.SAXParseException;importorg.xml.sax.SAXException;public

class

MyHandler

extends

DefaultHandler{String

em=null;public

voiderror(SAXParseExceptione)throws

SAXException{

em=e.getMessage();//一般性錯誤,一般為有效性錯誤System.out.println("一般錯誤"+em);}public

void

fataError(SAXParseExceptione)throws

SAXException{

em=e.getMessage();//嚴(yán)重錯誤,一般為規(guī)范性錯誤System.out.println("致命錯誤"+em);}}

3.2如何檢查XML文件的

有效性(2)//獲得解析工廠DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();//設(shè)置解析器支持有效性檢查factory.setValidating(true);//創(chuàng)建DOM解析器DocumentBuilderbuilder=factory.newDocumentBuilder();//實例化事件處理器MyHandlerhandler=new

MyHandler();//綁定處理器builder.setErrorHandler(handler);//解析并檢驗文件XML文件Documentdocument=builder.parse(newFile(file));//如果返回的錯誤信息為空,說明是一個有效的XML文件,否則是無效的if(handler.em==null){System.out.println("文件"+file+"是有效的XML文件。");}else{System.out.println("文件"+file+"是無效的XML文件。");}文件XMLValidate.java負(fù)責(zé)創(chuàng)建DOM解析器,分析XML文件,主要代碼如下:

3.2如何檢查XML文件的

有效性(3)利用這個檢驗程序檢驗前面的XML文件,得到的結(jié)果如下圖所示:

如果去掉“<persion>”中的子標(biāo)記“<age>”,再進(jìn)行有效性檢驗,得到的結(jié)果如下圖所示:

3.2如何檢查XML文件的

有效性(4)如果利用了XML開發(fā)工具,會很方便的進(jìn)行規(guī)范性及有效性的檢驗。例如使用XMLWritwer。返回

XML文件與DTD的匹配是指約束一個XML文件的DTD的來源,在XML文件中,通過文檔類型聲明來指定DTD的來源,按來源不同可分為內(nèi)部DTD和外部DTD。3.3

XML文件與DTD的匹配

(1)內(nèi)部DTD包含在XML文件內(nèi)部的DTD稱為內(nèi)部DTD,在XML中內(nèi)部聲明DTD的格式為:<!DOCTYPE根標(biāo)記名稱[DTD內(nèi)容(標(biāo)記的定義及約束)]>

內(nèi)部DTD示例。3.3

XML文件與DTD的匹配

(2)外部DTD在XML文件外部定義的DTD稱為外部DTD,在XML文件中聲明外部DTD的格式為:

<!DOCTYPE根標(biāo)記名稱SYSTEM“DTD的URI”><!DOCTYPE根標(biāo)記名稱

PUBLIC“正式公用標(biāo)識符”“DTD的URI”>

“SYSTEM”表示使用的DTD文件是一個個人的非標(biāo)準(zhǔn)化的外部DTD,即沒有被大部分人或某一領(lǐng)域所認(rèn)可?!癙UBLIC”表示所使用的外部DTD文件是一個公用的標(biāo)準(zhǔn)化的DTD文件?!罢焦脴?biāo)識符”用來表明DTD文件的特征,其格式為:

-ISO認(rèn)證//單位名稱//DTD說明//所用的語言

“DTD的URI”表示DTD文件所在的位置,必須是一個有效的資源。

3.3

XML文件與DTD的匹配

(3)聯(lián)合使用內(nèi)部DTD和外部DTD如果想既不影響外部DTD的標(biāo)準(zhǔn)性,又添加自己的內(nèi)容,就可以聯(lián)合使用內(nèi)部DTD和外部DTD

。其格式為:

<!DOCTYPE根標(biāo)記名稱SYSTEM“DTD的URI”[

內(nèi)部DTD]>或<!DOCTYPE根標(biāo)記名稱PUBLIC“正式公用標(biāo)識符”“DTD的URI”[

內(nèi)部DTD]>解析器在解析時,會把這兩個部分合并稱為一個DTD,所以,對于同一個標(biāo)記,不能在兩個部分中同時定義,即使它們的約束條件相同。返回3.4XML文檔類型定義文件DTD

3.4.1DTD的元素

3.4.2DTD的完整性

3.4.4DTD與名稱空間

3.4.3DTD的屬性定義

3.4.5DTD的實體

3.4.6DTD中的參數(shù)實體

3.4.7DTD中的注釋

返回DTD的元素(1)

DTD中的元素(ELEMENT)是用來約束標(biāo)記的,用元素聲明來定義一個標(biāo)記,元素聲明以“<!ELEMENT”開始,用“>”結(jié)束,格式為:

<!ELEMENT標(biāo)記名稱

標(biāo)記的約束>

例如:

<!ELEMENTname(#PCDATA)>這段代碼定義了一個標(biāo)記,名稱為name,它標(biāo)記的內(nèi)容只能含有文本數(shù)據(jù)。注意:元素聲明中“<”與“!”之間以及“!”與“ELEMENT”之間不能有空格。

DTD的元素(2)

如果想要定義一個標(biāo)記含有哪些子標(biāo)記以及子標(biāo)記應(yīng)該以怎樣的順序出現(xiàn)或出現(xiàn)的次數(shù),這些內(nèi)容都要在“標(biāo)記的約束”中定義。標(biāo)記的約束可以以下3種情況:

(1)EMPTY。(2)ANY。(3)描述該標(biāo)記可包含的子標(biāo)記及其出現(xiàn)次數(shù)等信息。

DTD的元素(3)

以上的3種情況可具體分為下列4種類型:

(1)EMPTY關(guān)鍵字EMPTY用于定義空標(biāo)記,空標(biāo)記不含有任何標(biāo)記內(nèi)容。例如,對于下面的一個空標(biāo)記:<abc/>在DTD中聲明該標(biāo)記的語法是:<!ELEMENTabcEMPTY>DTD的元素(4)

(2)ANY

使用關(guān)鍵字ANY就意味著該標(biāo)記可以包含該DTD中定義的其他任何標(biāo)記,多用于定義根標(biāo)記。例如:<!ELEMENTpersionsANY>這段代碼定義了一個名稱為persions的標(biāo)記,它的子標(biāo)記可以是在該DTD文件中定義的其他任何標(biāo)記。說明:在DTD中應(yīng)慎用ANY,因為,過多地使用ANY會破壞文檔結(jié)構(gòu)清晰這一原則。DTD的元素(5)

(3)#PCDATA如果約束條件是#PCDATA,說明該標(biāo)記所標(biāo)記的內(nèi)容可以是除標(biāo)記以外的任何字符。例如:

<!ELEMENTname(#PCDATA)>這段代碼定義了名稱為name的標(biāo)記,同時規(guī)定了標(biāo)記<name>所標(biāo)記的內(nèi)容只能是文本數(shù)據(jù),不能含有子標(biāo)記。DTD的元素(6)

(4)定義子標(biāo)記

標(biāo)記的內(nèi)容可以包含子標(biāo)記,定義一個標(biāo)記的子標(biāo)記的語法格式為:

<!ELEMENT標(biāo)記名稱

(子標(biāo)記列表)>

例如:

<!ELEMENTpersion(name,sex,age)>

這段代碼定義了一個名稱為persion的標(biāo)記,該標(biāo)記含有3個子標(biāo)記<name>、<sex>和<age>。定義子標(biāo)記時子標(biāo)記的出現(xiàn)順序決定了XML文件中子標(biāo)記出現(xiàn)的順序,這個次序不能違背,否則,XML文件也不是一個有效的XML文件。

注意:子標(biāo)記序列中不能有#PCDATA。DTD的元素(7)

DTD中就引入了幾個特殊符號來說明子標(biāo)記的出現(xiàn)情況情況。分別是“?”、“*”和“+”,用這些符號來指定標(biāo)記出現(xiàn)的錯誤,具體含義分別是:

(1)“?”:說明該標(biāo)記可以出現(xiàn)0次或1次。(2)“*”:說明該標(biāo)記可以出現(xiàn)1次或多次,或者不出現(xiàn)。(3)“+”:說明該標(biāo)記至少要出現(xiàn)一次。如果沒有符號標(biāo)記,表示該標(biāo)記必須出現(xiàn)且只能出現(xiàn)一次。DTD中還有一個字符“|”,用于可選的子標(biāo)記。返回DTD的完整性(1)

一個完整的DTD,應(yīng)滿足下面兩個條件:(1)不能出現(xiàn)標(biāo)記的嵌套

(2)必須確定每一個標(biāo)記的約束條件

DTD的完整性(2)

(1)不能出現(xiàn)標(biāo)記的嵌套

標(biāo)記的嵌套是指一個標(biāo)記的子標(biāo)記中又含有該標(biāo)記的父標(biāo)記,這種情況在DTD中是不允許出現(xiàn)的。例如:

<!ELEMENTelem_a(elem_b,elem_c)><!ELEMENTelem_b(elem_a,elem_c)>這個DTD中的定義是錯誤的。DTD的完整性(3)

(2)必須確定每一個標(biāo)記的約束條件

對于XML文件中出現(xiàn)的每一個標(biāo)記,在DTD中都應(yīng)該有它所標(biāo)記內(nèi)容的約束。例如:

<!ELEMENTpersions(persios)<!ELEMENTpersion(name,sex,age)><!ELEMENTname(#PCDATA)>其中,只對“name”進(jìn)行了約束,因此它是一個錯誤的DTD。不滿足上面任何一點的DTD都不是一個完整的DTD。

返回DTD的屬性定義(1)

標(biāo)記都可以含有屬性,是標(biāo)記的附加信息。與標(biāo)記的定義類似,屬性的定義也必須在DTD中聲明。DTD中的屬性列表(ATTLIST)是用來約束標(biāo)記的屬性的,屬性的聲明以“<!ATTLIST”開始,用“>”結(jié)束,中間是標(biāo)記名稱及其可以含有的屬性列表,其語法格式為:

<!ATTLIST標(biāo)記名稱屬性名稱屬性類型屬性默認(rèn)值情況屬性名稱屬性類型屬性默認(rèn)值情況……>

DTD的屬性定義(2)

例如:

<!ATTLISTcar typeCDATA“A2” colorCDATA“red”

max-speedCDATA“120”>也可以多次為一個標(biāo)記定義屬性。例如:<!ATTLISTcartypeCDATA“A2”><!ATTLISTcarcolorCDATA“red”><!ATTLISTcarmax-speedCDATA“120”>注意:XML文件中為每個標(biāo)記添加的屬性,都應(yīng)該在DTD中聲明。即使是同名的屬性也要各自聲明。DTD的屬性定義(3)

屬性的名稱:屬性名稱可以自由定義,命名方法和標(biāo)記的命名方法相同,名稱可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,不能含有空格;名稱必須以字母或下劃線開頭。屬性名區(qū)分大小寫。

屬性類型:屬性的類型可以有7種情況,CDATA類型、枚舉類型、ID屬性類型、IDREF/IDREFS類型、NMTOKEN/NMTOKENS類型、ENTITY/ENTITYS類型和NOTATION類型。

DTD的屬性定義(4)

各種類型的說明見下表:

屬性類型含義描述CDATA文本數(shù)據(jù)枚舉類型把屬性的可能取值一一列舉,如:(male|female)ID屬性類型用于標(biāo)識文檔中的標(biāo)記,ID屬性的值必須是一個合法的XML名稱且在文檔中是唯一的IDREF/IDREFS類型IDREF類型用于引用同一文檔中另一個標(biāo)記的ID值,IDREF屬性值必須是文檔中某個標(biāo)記的ID屬性值。IDREFS是IDREF的復(fù)數(shù)形式,其值是若干個ID屬性值,之間用空格分開NMTOKEN/NMTOKENS類型NMTOKEN類型屬性值必須是有效的XML名稱,不能含有空格。NMTOKENS是NMTOKEN的復(fù)數(shù)形式,可包含若干個有效XML名稱,可包含空格ENTITY/ENTITYS類型用于引用文檔中的不可解析的外部實體,其值必須是有效的XML名稱NOTATION類型用于將屬性的值和DTD中的<!NOTATION>聲明關(guān)聯(lián)DTD的屬性定義(5)

屬性默認(rèn)值情況屬性的默認(rèn)值情況可以是:字符串、“#IMPLIED”、“#REQUIRED”或“#FIXED”和一個字符串,具體用法見下表:屬性類型含義描述字符串XML標(biāo)記必須含有該屬性,可以不明顯的添加,有默認(rèn)值#IMPLIEDXML標(biāo)記可以不含有該屬性,沒有默認(rèn)值#REQUIREDXML標(biāo)記必須含有該屬性,沒有默認(rèn)值,必須顯示地添加#FIXED和一個字符串XML標(biāo)記可以不含有該屬性,若添加了該屬性,其值是“#FIXED”后面的字符串,且不可改變。返回DTD與名稱空間

名稱空間是用來區(qū)分相同名稱的標(biāo)記,名稱空間在標(biāo)記的開始標(biāo)記中聲明,作用域是該標(biāo)記所標(biāo)記的內(nèi)容,除非該標(biāo)記的子標(biāo)記又聲明了名稱空間。名稱空間分為有前綴的名稱空間和無前綴的名稱空間。名稱空間也可以在DTD中聲明,W3C允許在DTD中用“ATTLIST”聲明來約束標(biāo)記的名稱空間。格式為:

<!ATTLIST標(biāo)記名稱

xmlns[:前綴]CDATA約束條件>

例如:

<!ATTLISTcarxmlnsCDATA#FIXED“jilin”><!ATTLISTbusxmlns:pCDATA#REQUIRED>注意:如果XML文件中的某個標(biāo)記必須使用名稱空間,那么,在DTD中定義該標(biāo)記時,該標(biāo)記也必須使用名稱空間的前綴。

返回DTD的實體(1)

DTD中的實體分為普通實體和參數(shù)實體,普通實體簡稱為實體。普通實體指可以被XML文件在標(biāo)記內(nèi)容中通過實體引用使用的實體。按實體內(nèi)容的位置分為內(nèi)部實體和外部實體。按可解析與不可解析分為可解析實體和不可解析實體。解析器在解析XML文件數(shù)據(jù)時,會將實體應(yīng)用部分替換為預(yù)定義實體的內(nèi)容。

內(nèi)部實體與外部實體

內(nèi)部實體是指實體內(nèi)容包含在該DTD文件中的實體。外部實體指的是實體內(nèi)容是該DTD文件以外的其他文件的實體。

DTD的實體(2)

內(nèi)部實體與外部實體

內(nèi)部實體的聲明:DTD中定義內(nèi)部實體的格式如下:<!ENTITY實體名字“實體內(nèi)容”>例如:

<!ENTITYPI“3.14159”>外部實體的聲明:DTD中定義內(nèi)部實體的格式如下:<!ENTITY實體名字SYSTEM“實體的URI”><!ENTITY實體名字

PUBLIC“實體的URI”>例如:

<!ENTITYNoteSYSTEM“a.txt”>DTD的實體(3)

內(nèi)部實體與外部實體

實體的引用:在XML文件中實體引用的格式為:

&實體名稱;例如:

圓周率的值是:&PI;解析器在解析時,就會將“&PI;”替換為“3.14159”。注意:實體引用時,“&”、“實體名稱”和“;”之間都不能有空格。

DTD的實體(4)

內(nèi)部實體與外部實體

實體的引用的例子:DTD中定義實體如下:<!ENTITYinen"我是內(nèi)部實體"><!ENTITYoutenSYSTEM"05.txt"><!ELEMENT實體引用(內(nèi)部實體,外部實體)><!ELEMENT內(nèi)部實體(#PCDATA)><!ELEMENT外部實體(#PCDATA)>文件05.txt的內(nèi)容:我是外部實體,來自05.txt。

DTD的實體(5)

內(nèi)部實體與外部實體

實體的引用的例子:XML文件代碼如下:<?xmlversion="1.0"encoding="gb2312"?>

<實體引用><內(nèi)部實體>&inen;</內(nèi)部實體><外部實體>&outen;</外部實體></實體引用>程序運行結(jié)果如圖所示:

DTD的實體(6)

可解析實體與不可解析實體可解析的實體是指實體的內(nèi)容是能被解析器解析的數(shù)據(jù)。例如:

“3.14159”、“Howareyou?”、“a+b>c”解析器會把它們解析為:“3.14159”、“Howareyou?”、“a+b>c”。所以,它們都稱為可解析的實體。不可解析的實體是指實體內(nèi)容包含解析器不能解析的數(shù)據(jù)的實體。不可解析的數(shù)據(jù)通常指二進(jìn)制數(shù)據(jù)、圖片文件等。返回DTD中的參數(shù)實體

(1)參數(shù)實體是指在DTD文件中定義,只能由DTD文件本身通過實體引用來使用的實體,和關(guān)聯(lián)的XML無關(guān)。通過參數(shù)實體的使用,可以大大減少編寫重復(fù)代碼所帶來的工作量。參數(shù)實體分為內(nèi)部參數(shù)實體和外部參數(shù)實體。DTD中內(nèi)部參數(shù)實體定義格式為:

<!ENTITY%參數(shù)實體名

“參數(shù)實體內(nèi)容”>

DTD中外部參數(shù)實體定義格式為:

<!ENTITY%參數(shù)實體名

SYSTE(PUBLIC)

“實體的URI”>

DTD中的參數(shù)實體(2)例如:

注意:“%”兩邊都要有空格,內(nèi)部參數(shù)實體的“參數(shù)實體內(nèi)容”為文本數(shù)據(jù),其中如果包含特殊字符(“<”、“>”、“&”、“’”和“””),要通過預(yù)定義實體引用來使用。外部參數(shù)實體的“實體的URI”

必須是有效資源。參數(shù)實體必須先定義后使用。<!ENTITY%persion

溫馨提示

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

最新文檔

評論

0/150

提交評論