第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頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第3章章 xml數(shù)據(jù)的底層結(jié)構(gòu)數(shù)據(jù)的底層結(jié)構(gòu)3.1 有效的xml文件 3.2 如何檢查xml文件的有效性 3.3 xml文件與dtd的匹配 3.4 xml文檔類型定義文件dtd 符合xml語法規(guī)則的xml文件稱為規(guī)范的xml文件,也稱為良構(gòu)的xml文件。規(guī)范的xml文件再符合額外的一些約束,就稱為有效的xml文件。 3.1 有效的有效的xml文件(文件(1) 這些額外的約束就是dtd(document type definition,文檔類型定義)和xml schema。 例如,下面的文件就是一個有效的xml文件 :3.1 有效的有效的xml文件(文件(2) !doctype persion

2、s xiaowang male 25 文件中的每一個標記都在dtd中做了定義,而且滿足相應(yīng)的約束條件。 返回 瀏覽器只是檢查xml文件的規(guī)范性,并不能驗證xml文件是否遵守其對應(yīng)的約束文件中的約束條件。所以檢查文件的有效性還需要通過解析器來進行。本例通過dom解析器來檢驗xml文件的有效性。文件myhandler.java稱為事件處理器,用于檢驗xml文件的有效性并處理xml文件的錯誤信息,具體代碼如下: 3.2 如何檢查如何檢查xml文件的文件的有效性有效性 (1) import org.xml.sax.helpers.defaulthandler; import org.xml.sax.s

3、axparseexception; import org.xml.sax.saxexception; public class myhandler extends defaulthandler string em=null; public void error(saxparseexception e)throws saxexception em=e.getmessage(); /一般性錯誤,一般為有效性錯誤 system.out.println(一般錯誤+em); public void fataerror(saxparseexception e)throws saxexception em=

4、e.getmessage(); /嚴重錯誤,一般為規(guī)范性錯誤 system.out.println(致命錯誤+em); 3.2 如何檢查如何檢查xml文件的文件的有效性有效性 (2)/獲得解析工廠documentbuilderfactorydocumentbuilderfactory factory = documentbuilderfactorydocumentbuilderfactory.newinstance();/設(shè)置解析器支持有效性檢查factory.setvalidating(truetrue); /創(chuàng)建dom解析器documentbuilderdocumentbuilder bu

5、ilder = factory.newdocumentbuilder();/實例化事件處理器myhandlermyhandler handler = newnew myhandlermyhandler();/綁定處理器builder.seterrorhandler(handler); /解析并檢驗文件xml文件documentdocument document = builder.parse(newnew file(file); /如果返回的錯誤信息為空,說明是一個有效的xml文件,否則是無效的ifif(handler.em=nullnull)systemsystem.outout.print

6、lnprintln(文件+file+是有效的xml文件。);elseelsesystemsystem.outout.printlnprintln(文件+file+是無效的xml文件。); 文件xmlvalidate.java 負責(zé) 創(chuàng)建dom解析器,分析xml文件,主要代碼如下: 3.2 如何檢查如何檢查xml文件的文件的有效性有效性 (3)利用這個檢驗程序檢驗前面的xml文件,得到的結(jié)果如下圖所示: 如果去掉“”中的子標記“”,再進行有效性檢驗,得到的結(jié)果如下圖所示: 3.2 如何檢查如何檢查xml文件的文件的有效性有效性 (4) 如果利用了xml開發(fā)工具,會很方便的進行規(guī)范性及有效性的檢驗

7、。例如使用xml writwer 。 返回 dtddtd文件的保存文件的保存 dtd文件需使用文本編輯器文件需使用文本編輯器編寫編寫、保存保存。dtd文件的擴展名必須是文件的擴展名必須是“.dtd”,保存保存時所選擇的編碼必須和其關(guān)聯(lián)的時所選擇的編碼必須和其關(guān)聯(lián)的xml文件文件一致,比如,一致,比如,dtd所要約束的所要約束的xml文件的文件的編碼為編碼為utf-8,那么那么dtd文件也必須按著文件也必須按著utf-8編碼保存。編碼保存。 xml文件與dtd的匹配是指約束一個xml文件的dtd的來源,在xml文件中,通過文檔類型聲明來指定dtd的來源,按來源不同可分為內(nèi)部dtd和外部dtd。

8、3.3 xml文件與文件與dtd的匹配的匹配 (1)q 內(nèi)部dtd 包含在xml文件內(nèi)部的dtd稱為內(nèi)部dtd,在xml中內(nèi)部聲明dtd的格式為: !doctype persions xiaowang male 25 內(nèi)部dtd示例3.3 xml文件與文件與dtd的匹配的匹配 (2)q 外部dtd 在xml文件外部定義的dtd稱為外部dtd,在xml文件中聲明外部dtd的格式為: “system”表示使用的dtd文件是一個個人的非標準化的外部dtd,即沒有被大部分人或某一領(lǐng)域所認可。 “public”表示所使用的外部dtd文件是一個公用的標準化的dtd文件。 “正式公用標識符”用來表明dtd文

9、件的特征,其格式為: -iso認證/單位名稱/dtd說明/所用的語言 “dtd的uri”表示dtd文件所在的位置,必須是一個有效的資源。 3.3 xml文件與文件與dtd的匹配的匹配 (3) 聯(lián)合使用內(nèi)部dtd和外部dtd 如果想既不影響外部dtd的標準性,又添加自己的內(nèi)容,就可以聯(lián)合使用內(nèi)部dtd和外部dtd 。其格式為: 或 解析器在解析時,會把這兩個部分合并稱為一個dtd,所以,對于同一個標記,不能在兩個部分中同時定義,即使它們的約束條件相同。 返回3.4 xml文檔類型定義文件文檔類型定義文件dtd 3.4.1 dtd的元素 3.4.2 dtd的完整性 3.4.4 dtd與名稱空間 3

10、.4.3 dtd的屬性定義 3.4.5 dtd的實體 3.4.6 dtd中的參數(shù)實體 3.4.7 dtd中的注釋 返回dtd的元素(的元素(1 1) dtd中的元素(element)是用來約束標記的,用元素聲明來定義一個標記,元素聲明以“”結(jié)束,格式為: 例如 : 這段代碼定義了一個標記,名稱為name,它標記的內(nèi)容只能含有文本數(shù)據(jù)。注意:元素聲明中“”與“!”之間以及“!”與“element”之間不能有空 格。 dtd的元素(的元素(2 2) 如果想要定義一個標記含有哪些子標記以及子標記應(yīng)該以怎樣的順序出現(xiàn)或出現(xiàn)的次數(shù),這些內(nèi)容都要在“標記的約束”中定義。標記的約束可以以下3種情況: (1)

11、empty。(2)any。(3)描述該標記可包含的子標記及其出現(xiàn)次數(shù)等信息。 dtd的元素(的元素(3 3) 以上的3種情況可具體分為下列4種類型: (1)empty 關(guān)鍵字empty用于定義空標記,空標記不含有任何標記內(nèi)容。例 如,對于下面的一個空標記:在dtd中聲明該標記的語法是:dtd的元素(的元素(4 4) (2)any 使用關(guān)鍵字any就意味著該標記可以包含該dtd中定義的其他任何標記,多用于定義根標記。例如: 這段代碼定義了一個名稱為persions的標記,它的子標記可以是在該dtd文件中定義的其他任何標記。說明:在dtd中應(yīng)慎用any,因為,過多地使用any會破壞文檔結(jié) 構(gòu)清晰這

12、一原則。dtd的元素(的元素(5 5) (3)#pcdata 如果約束條件是#pcdata,說明該標記所標記的內(nèi)容可以是除標記以外的任何字符。例如: 這段代碼定義了名稱為name的標記,同時規(guī)定了標記所標記的內(nèi)容只能是文本數(shù)據(jù),不能含有子標記。 dtd的元素(的元素(6 6) (4)定義子標記 標記的內(nèi)容可以包含子標記,定義一個標記的子標記的語法格式為: 例如: 這段代碼定義了一個名稱為persion的標記,該標記含有3個子標記、和。定義子標記時子標記的出現(xiàn)順序決定了xml文件中子標記出現(xiàn)的順序,這個次序不能違背,否則,xml文件也不是一個有效的xml文件。 注意:子標記序列中不能有#pcda

13、ta。 dtd的元素(的元素(7 7) dtd中就引入了幾個特殊符號來說明子標記的出現(xiàn)情況情況。分別是“?”、“*”和“+”,用這些符號來指定標記出現(xiàn)的錯誤,具體含義分別是: (1)“?”:說明該標記可以出現(xiàn)0次或1次。 (2)“*”:說明該標記可以出現(xiàn)1次或多次,或者不出現(xiàn)。 (3)“+”:說明該標記至少要出現(xiàn)一次。 如果沒有符號標記,表示該標記必須出現(xiàn)且只能出現(xiàn)一次。dtd中還有一個字符“|”,用于可選的子標記。 返回dtd的完整性(的完整性(1 1) 一個完整的dtd,應(yīng)滿足下面兩個條件:(1)不能出現(xiàn)標記的嵌套 (2)必須確定每一個標記的約束條件 dtd的完整性(的完整性(2 2) (

14、1)不能出現(xiàn)標記的嵌套 標記的嵌套是指一個標記的子標記中又含有該標記的父標記,這種情況在dtd中是不允許出現(xiàn)的。例如: 這個dtd中的定義是錯誤的。 dtd的完整性(的完整性(3 3) (2)必須確定每一個標記的約束條件 對于xml文件中出現(xiàn)的每一個標記,在dtd中都應(yīng)該有它所標記內(nèi)容的約束。例如: !element persions (persios) 其中,只對“name”進行了約束,因此它是一個錯誤的dtd。不滿足上面任何一點的dtd都不是一個完整的dtd。 返回dtd的屬性定義(的屬性定義(1 1) 標記都可以含有屬性,是標記的附加信息。與標記的定義類似,屬性的定義也必須在dtd中聲明

15、。dtd中的屬性列表(attlist)是用來約束標記的屬性的,屬性的聲明以“”結(jié)束,中間是標記名稱及其可以含有的屬性列表,其語法格式為: dtd的屬性定義(的屬性定義(2 2) 例如: 也可以多次為一個標記定義屬性。例如: 注意:xml文件中為每個標記添加的屬性,都應(yīng)該在dtd中聲明。 即使是同名的屬性也要各自聲明。 dtd的屬性定義(的屬性定義(3 3) v 屬性的名稱 : 屬性名稱可以自由定義,命名方法和標記的命名方法相同,名稱可以由字母、數(shù)字、下劃線(“_”)、點(“.”)或連字符(“-”)組成,不能含有空格;名稱必須以字母或下劃線開頭。屬性名區(qū)分大小寫。 v 屬性類型 : 屬性的類型可

16、以有7種情況,cdata類型、枚舉類型、id屬性類型、idref/idrefs類型、nmtoken/nmtokens類型、entity/entitys類型和notation類型。 dtd的屬性定義(的屬性定義(4 4) 各種類型的說明見下表: 屬性類型含義描述cdata文本數(shù)據(jù)枚舉類型把屬性的可能取值一一列舉,如:(male|female)id屬性類型用于標識文檔中的標記,id屬性的值必須是一個合法的xml名稱且在文檔中是唯一的idref/idrefs類型idref類型用于引用同一文檔中另一個標記的id值,idref屬性值必須是文檔中某個標記的id屬性值。idrefs是idref的復(fù)數(shù)形式,其

17、值是若干個id屬性值,之間用空格分開nmtoken/nmtokens類型nmtoken類型屬性值必須是有效的xml名稱,不能含有空格。nmtokens是nmtoken的復(fù)數(shù)形式,可包含若干個有效xml名稱,可包含空格entity/entitys類型用于引用文檔中的不可解析的外部實體,其值必須是有效的xml名稱notation類型用于將屬性的值和dtd中的聲明關(guān)聯(lián)cdata類型例子 張飛 李逵 enumerated 類型例子 10010 中山路 20011 長江路 nmtoken類型例子 張三 李陶 id類型例子如果希望某個屬性的屬性值具有專用性,即不如果希望某個屬性的屬性值具有專用性,即不允許

18、其它類型相同的屬性再取這個屬性值,那允許其它類型相同的屬性再取這個屬性值,那么就可以將屬性的類型取為么就可以將屬性的類型取為id類型。類型。注意注意id類型的屬性值可以由字母、數(shù)字、下類型的屬性值可以由字母、數(shù)字、下劃線(劃線(“_”)、點()、點(“.”)或連字符()或連字符(“-”)組成,但必須以字母或下劃線開頭。組成,但必須以字母或下劃線開頭。 注意注意需要特別注意的是需要特別注意的是id類型屬性的類型屬性的“默默認值情況認值情況”只能是只能是“#required”和和“implied” 101 無軌電車 201 有軌電車 801 快車 631 普通 idref類型例子如果準備通過標記的

19、屬性值來判斷標記如果準備通過標記的屬性值來判斷標記之間的聯(lián)系之間的聯(lián)系,就可以在標記中使用就可以在標記中使用idref(identifier reference)類型的屬性。類型的屬性。idref類型屬性的屬性值只能取某個標類型屬性的屬性值只能取某個標記中記中id類型屬性的屬性值。類型屬性的屬性值。 張三 李四 趙五 孫六 dtd的屬性定義(的屬性定義(5 5) v 屬性默認值情況 屬性的默認值情況可以是:字符串、“#implied”、“#required”或“#fixed”和一個字符串。 返回1“默認值情況默認值情況”是字符串是字符串 如果某個屬性的如果某個屬性的“默認值情況默認值情況”是一

20、個字符串,是一個字符串, xml中對應(yīng)標記必須有該屬中對應(yīng)標記必須有該屬性,但標記可以不明顯地添加該屬性。性,但標記可以不明顯地添加該屬性。 2“默認值情況默認值情況”是是#implied 在在attlist定義的屬性約束列表中可以設(shè)置屬性的定義的屬性約束列表中可以設(shè)置屬性的“默認值情況默認值情況”是是#implied 此時該屬性就沒有默認值,而且相應(yīng)的標記里可以不附加該屬性。此時該屬性就沒有默認值,而且相應(yīng)的標記里可以不附加該屬性。!doctype cars沒有顯示地設(shè)置屬性。顯示地設(shè)置了屬性。3 3“默認值情況默認值情況”是是# #requiredrequired 在在attlistatt

21、list定義的屬性約束列表中可以設(shè)置屬性的定義的屬性約束列表中可以設(shè)置屬性的“默認值情況默認值情況”是是# #required required 。例:例:!attlist 此時該屬性沒有默認值,相應(yīng)的標記必須要添加該屬性并給出屬此時該屬性沒有默認值,相應(yīng)的標記必須要添加該屬性并給出屬性的值。性的值。4 4“默認值情況默認值情況”是是# #fixedfixed 在在attlistattlist定義的屬性約束列表中可以設(shè)置屬性的定義的屬性約束列表中可以設(shè)置屬性的“默認值情況默認值情況”是是# #fixed fixed 。例:例:!attlist cdata #fixed 110 此時該屬性默認值

22、就是關(guān)鍵字此時該屬性默認值就是關(guān)鍵字# # fixedfixed后面指定的那個字符串。后面指定的那個字符串。 dtd與名稱空間與名稱空間 名稱空間是用來區(qū)分相同名稱的標記,名稱空間在標記的開始標記中聲明,作用域是該標記所標記的內(nèi)容,除非該標記的子標記又聲明了名稱空間。名稱空間分為有前綴的名稱空間和無前綴的名稱空間。名稱空間也可以在dtd中聲明,w3c允許在dtd中用“attlist”聲明來約束標記的名稱空間。格式為: 例如: 注意:如果xml文件中的某個標記必須使用名稱空間,那么,在dtd中 定義該標記時,該標記也必須使用名稱空間的前綴。 返回!doctype message abclilin

23、male55dtd的實體(的實體(1 1) dtd中的實體分為普通實體和參數(shù)實體,普通實體簡稱為實體。普通實體指可以被xml文件在標記內(nèi)容中通過實體引用使用的實體。按實體內(nèi)容的位置分為內(nèi)部實體和外部實體。按可解析與不可解析分為可解析實體和不可解析實體。解析器在解析xml文件數(shù)據(jù)時,會將實體應(yīng)用部分替換為預(yù)定義實體的內(nèi)容。 q內(nèi)部實體與外部實體 內(nèi)部實體是指實體內(nèi)容包含在該dtd文件中的實體。外部實體指的是實體內(nèi)容是該dtd文件以外的其他文件的實體。 dtd的實體(的實體(2 2) q內(nèi)部實體與外部實體 內(nèi)部實體的聲明: dtd中定義內(nèi)部實體的格式如下: 例如: 外部實體的聲明 : dtd中定義

24、內(nèi)部實體的格式如下: 例如: dtd的實體(的實體(3 3) q內(nèi)部實體與外部實體 實體的引用:在xml文件中實體引用的格式為: &實體名稱; 例如: 圓周率的值是:π 解析器在解析時,就會將“π”替換為“3.14159” 。注意:實體引用時,“&”、“實體名稱”和“;”之間都不能有空格。 dtd的實體(的實體(4 4) q內(nèi)部實體與外部實體 實體的引用的例子:dtd中定義實體如下:文件05.txt的內(nèi)容:我是外部實體,來自05.txt。 dtd的實體(的實體(5 5) q內(nèi)部實體與外部實體 實體的引用的例子:xml文件代碼如下: &inen; &outen; 程序運行結(jié)果如圖所示: dtd的實體(的實體(6 6) q可解析實體與不可解析實體 可解析的實體是指實體的內(nèi)容是能被解析器解析的數(shù)據(jù)。例如: “3.14159” 、 “how are you?” 、 “a+b>c” 解析器會把它們解

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論