版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第七章DOM接口技術(shù)主要內(nèi)容Ø DOM概述Ø DOM規(guī)范主要接口Ø JAXP、DOM和解析器Ø JAXP讀取XML文檔信息Ø JAXP編輯XML文檔Ø JAXP生成XML文檔難點Ø JAXP操作XML文檔現(xiàn)在,應(yīng)該開始研究XML文檔的結(jié)構(gòu),以及如何利用它描述層次化信息。下面,我們將說明如何通過程序訪問XML文檔。其中一種方法是通過文檔對象模型(Document Object Model,DOM)。在本章中,我們將介紹文檔對象模型,并借助幾個程序?qū)嵗忉屗墓δ堋?.1 什么是文檔對象模型文檔對象模型一詞在Web瀏覽器領(lǐng)域并不
2、陌生。窗口、文檔和歷史等對象都被認為是瀏覽器對象模型的一部分。然而,任何做過Web開發(fā)的人都知道各種瀏覽器實現(xiàn)這些對象的方式不盡相同。對于如何通過Web訪問和操作文檔結(jié)構(gòu)這個問題,為了創(chuàng)建更加標準化的方法, W3C提出了目前的W3C DOM規(guī)范。W3C DOM是一種獨立于語言和平臺的定義,即:它定義了構(gòu)成DOM的不同對象的定義,卻沒有提供特定的實現(xiàn),實際上,它能夠用任何編程語言實現(xiàn)。例如,為了通過DOM訪問傳統(tǒng)的數(shù)據(jù)存儲,可以將DOM實現(xiàn)為傳統(tǒng)數(shù)據(jù)訪問功能之外的一層包裝。利用DOM中的對象,開發(fā)人員可以對文檔進行讀取、搜索、修改、添加和刪除等操作。DOM為文檔導(dǎo)航以及操作HTML和XML文檔的
3、內(nèi)容和結(jié)構(gòu)提供了標準函數(shù)。7.1.1 XML文檔結(jié)構(gòu)剛剛接觸XML的開發(fā)人員常常會認為XML的主要目的是為文件中的信息片段命名,使之易于被其他人理解。結(jié)果,這些新手開發(fā)的文檔簡直如同“標記湯”無序的數(shù)據(jù)元素列表與有意義的標記名稱組合在一起,但是它與普通的文件一樣都將信息置于同一層。<?xml version=”1.0”?><訂單><客戶>陳紅</客戶><地址>大學(xué)路100號<地址><城市>南寧</城市><產(chǎn)品>芒果</產(chǎn)品><數(shù)量>30</數(shù)量><
4、;產(chǎn)品>荔枝</產(chǎn)品><數(shù)量>130</數(shù)量><產(chǎn)品>木瓜</產(chǎn)品><數(shù)量>60</數(shù)量></訂單> 許多開發(fā)人員都忽略了XML能夠顯示元素之間的關(guān)系這一特性特別是表示兩個元素的父子關(guān)系。如果將上述文件改寫為以下形式,將產(chǎn)生更好的效果:<?xml version=”1.0”?><訂單><客戶><姓名>陳紅</姓名><地址>大學(xué)路100號</地址><城市>南寧</城市></客戶>
5、;<ITEM><產(chǎn)品>芒果</產(chǎn)品><數(shù)量>30</數(shù)量></ITEM><ITEM><產(chǎn)品>荔枝</產(chǎn)品> <數(shù)量>130</數(shù)量></ITEM><ITEM><產(chǎn)品>木瓜</產(chǎn)品><數(shù)量>60</數(shù)量></ITEM></訂單>此文檔在瀏覽器中的顯示形式如圖7.1所示。圖7.1 XML文檔在IE瀏覽器中顯示效果 在這種形式的文檔中,發(fā)票元素顯然包括四個子元素。它還簡化了文
6、檔的搜索如果我們要尋找木瓜的所有訂單,可以查詢“產(chǎn)品”子元素為“木瓜”的ITEM元素而不必依次查看每個“產(chǎn)品”元素。 以上文檔結(jié)構(gòu)可以用圖7.2中的節(jié)點樹表示,它顯示了所有元素以及它們之間的相互關(guān)系。如果要給文本文件中的發(fā)票增加項目,必須讀取文件直至發(fā)票的最后一個項目的末尾,插入新的項目文本,然后繼續(xù)處理文檔的后續(xù)部分。正如你所料,這種技術(shù)很快會變得非常棘手,特別是當節(jié)點樹變得越來越深時。然而,如果你能夠根據(jù)樹結(jié)構(gòu)以節(jié)點形式對文檔進行操作,添加項目就輕而易舉了只需創(chuàng)建新的ITEM節(jié)點,并將它作為“訂單”節(jié)點的子節(jié)點。訂單客戶ITEMITEMITEM圖 7.2 文檔分層結(jié)構(gòu)圖 這就是DOM的工作
7、原理。 當你使用DOM對XML文本文件進行操作時,它首先要解析文件,將文件分解為獨立的元素、屬性和注釋等。然后,它以節(jié)點樹的形式(在內(nèi)存中)創(chuàng)建XML文件的表示。此后,開發(fā)人員可以通過節(jié)點樹訪問文檔的內(nèi)容,并根據(jù)需要修改文檔。 事實上, DOM執(zhí)行了更進一步的操作,它將文檔中的每個項目看作節(jié)點元素、屬性、注釋、處理指令,甚至構(gòu)成屬性的文本。因此,對于我們上面的例子, DOM實際上會將文檔表示為圖7.3所示的形式。元素:訂單元素:客戶元素:ITEM元素:ITEM元素:ITEM文檔元素:姓名元素:地址元素:城市元素:產(chǎn)品元素:數(shù)量元素:產(chǎn)品元素:數(shù)量元素:產(chǎn)品元素:數(shù)量文本:陳紅文本:大學(xué)路文本:
8、南寧文本:芒果文本:30文本:荔枝文本:130文本:木瓜文本:60<?xml version=”1.0”?>圖7.3 DOM節(jié)點樹圖 圖中文檔為根節(jié)點,是訪問整棵樹的入口,其子節(jié)點可以是根元素、處理指令、注釋等類型的節(jié)點。本圖中根元素為“訂單”,處理指令為<?xml version=”1.0”?>,注釋本例沒有。一般地講,元素類型的節(jié)點可以有的子節(jié)點類型為元素類型和文本類型。本例中根節(jié)點的子節(jié)點為4個元素類型,客戶和3個ITEM。客戶節(jié)點又有三個元素型子節(jié)點“姓名”、“地址”和“城市”。每個ITEM節(jié)點包含兩個元素“產(chǎn)品”和“數(shù)量”。圖中最后一行中的節(jié)點類型為文本型的節(jié)
9、點是分析時需要特別注意的地方,因為稍不注意就可能認為姓名的值為陳紅而不是將之作為兩個不同類型的節(jié)點。在DOM節(jié)點樹分析中還有一點需特別注意,有些元素含有屬性,屬性類型的節(jié)點也出現(xiàn)在DOM樹中,它只能和元素類型的節(jié)點相關(guān)聯(lián),而且不是作為元素類型的子節(jié)點出現(xiàn)的,以和子元素相區(qū)別。5.1.2 DOM規(guī)范 與其他Internet標準一樣, DOM規(guī)范也是由W3C維護的。W3C提出了兩個DOM文檔Level 1和Level 2文檔。1. DOM Level 1 Level 1文檔包含兩個主要部分。第一部分,文檔對象模型(核心) Level 1定義了用于訪問任何結(jié)構(gòu)化文檔的接口,以及用于訪問XML文檔的特
10、殊擴展。文檔的第二部分描述了DOM針對HTML的擴展,它超出了本書的討論范圍。 DOM規(guī)范通過定義數(shù)據(jù)類型DOM String描述了DOM如何操作字符串。該數(shù)據(jù)類型定義為雙字節(jié)字符集,采用UTF-16編碼機制進行編碼。對于特定的實現(xiàn),接口通常被綁定到也采用UTF-16編碼的系統(tǒng)數(shù)據(jù)類型,例如: Java的String類型。2. DOM Level 2 Level 2規(guī)范不僅包含上述所有對象,而且新增了以下特征: 支持命名空間正如我們將在第7章中看到的,命名空間用于區(qū)分XML中具有相同名稱的離散數(shù)據(jù)元素。它們通常提供返回原始的XML結(jié)構(gòu)文件的鏈接,該文件包含某種格式的元素信息。DOM Level
11、 2將提供查詢和修改文檔命名空間的機制。 樣式表DOM Level 2包含樣式表的對象模型,以及用于查詢和操作特定文檔的樣式表的方法。 過濾DOM Level 2新增了用于過濾XML文檔內(nèi)容的方法。 事件模型DOM Level 2計劃提供XML的事件模型。 范圍(Range)DOM Level 2包含用于操作大塊文本的函數(shù),它有助于在XML中處理傳統(tǒng)的文檔。3. 理解IDL和綁定 W3C將DOM定位為獨立于平臺的,即: W3C指定了特定系統(tǒng)的實現(xiàn)需要提供哪些方法和屬性,但沒有詳細說明如何獲得這些實現(xiàn)。為此, W3C選擇通過以下幾種方式表達與DOM的接口:通過OMG IDL(它是CORBA 2.
12、2規(guī)范的一部分),而CORBA是分布式計算中廣泛使用的中間件,獨立于軟件和硬件平臺。現(xiàn)在DOM已經(jīng)得到廣泛的支持,比如VBScript、JavaScript、VB、ASP、php和Java等。本書以Java技術(shù)為例介紹。7.2 DOM對象 XML DOM 把 XML 文檔視為一種樹結(jié)構(gòu)。這種樹結(jié)構(gòu)被稱為節(jié)點樹??赏ㄟ^這棵樹訪問所有節(jié)點??梢孕薷幕騽h除它們的內(nèi)容,也可以創(chuàng)建新的元素。W3C DOM僅僅提供了DOM類庫的接口定義,而沒有提供特定的實現(xiàn)。編寫通過DOM訪問XML文件的軟件時,必須使用特定的DOM實現(xiàn)。實現(xiàn)是某種形式的類庫,它設(shè)計為運行在特定的硬件和軟件平臺上,并訪問特定的數(shù)據(jù)存儲。下
13、面對DOM的基本接口做一個簡單的介紹。7.2.1 DOM基本接口 在DOM接口規(guī)范中有許多接口,其中最基本的接口為Document, Node, NameNodeMap, NodeList。在這四個基本接口中Node接口是其它大多數(shù)接口的父接口,Document、Element、Attribute、Text、Comment等接口都繼承自Node接口。Document接口是對文檔進行操作的入口,對應(yīng)于DOM樹的根節(jié)點。NodeList接口是節(jié)點的集合,它包含某個節(jié)點的所有子節(jié)點。NameNodeMap接口也是節(jié)點的集合,通過該接口可以建立節(jié)點名和節(jié)點之間的一一映射關(guān)系,從而利用節(jié)點名可以直接訪問
14、特定節(jié)點,常用于某元素節(jié)點的所有屬性的操作。下面對這四個接口分別做一些介紹。1.Document接口Document接口代表了整個XML/HTML文檔,因此,它是整棵文檔樹的根,提供了對文檔中的數(shù)據(jù)進行訪問和操作的入口。由于元素、文本節(jié)點、注釋、處理指令等都不能脫離文檔的上下文關(guān)系而獨立存在,所以在Document接口提供了創(chuàng)建其他節(jié)點對象的方法,通過該方法創(chuàng)建的節(jié)點對象都有一個ownerDocument屬性,用來表明當前節(jié)點是由誰所創(chuàng)建的以及節(jié)點同Document之間的聯(lián)系。 Document節(jié)點是DOM樹中的根節(jié)點,也即對XML文檔進行操作的入口節(jié)點。通過Docuemt節(jié)點,可以訪問到文檔
15、中的其他節(jié)點,如處理指令、注釋、文檔類型以及XML文檔的根元素節(jié)點等等。另外,在一棵DOM樹中,Document節(jié)點可以包含多個處理指令、多個注釋作為其子節(jié)點,而文檔類型節(jié)點和XML文檔根元素節(jié)點都是唯一的。2.Node接口Node接口在整個DOM樹中具有舉足輕重的地位,DOM對象模型接口中有很大一部分接口是從Node接口繼承過來的,例如,Element、Attr、CDATASection等接口,都是從Node繼承過來的。在DOM樹中,Node接口代表了樹中的一個節(jié)點。Node接口提供了訪問DOM樹中元素內(nèi)容與信息的途徑,并給出了對DOM樹中的元素進行遍歷的支持。3.NodeList接口Nod
16、eList接口提供了對節(jié)點集合的抽象定義,它并不包含如何實現(xiàn)這個節(jié)點集的定義。NodeList用于表示有順序關(guān)系的一組節(jié)點,比如某個節(jié)點的子節(jié)點序列。另外,它還出現(xiàn)在一些方法的返回值中,例如GetNodeByName。在DOM對象模型中,NodeList的對象是"live"的,換句話說,對文檔的改變,會直接反映到相關(guān)的NodeList對象中。例如,如果通過DOM獲得一個NodeList對象,該對象中包含了某個Element節(jié)點的所有子節(jié)點的集合,那么,當再通過DOM對Element節(jié)點進行操作(添加、刪除、改動節(jié)點中的子節(jié)點)時,這些改變將會自動地反映到NodeList對象
17、中,而不需DOM對象模型應(yīng)用程序再做其他額外的操作。NodeList中的每個item都可以通過一個索引來訪問,該索引值從0開始。4.NamedNodeMap接口實現(xiàn)了NamedNodeMap接口的對象中包含了可以通過名字來訪問的一組節(jié)點的集合。不過注意,NamedNodeMap并不是從NodeList繼承過來的,它所包含的節(jié)點集中的節(jié)點是無序的。盡管這些節(jié)點也可以通過索引來進行訪問,但這只是提供了枚舉NamedNodeMap中所包含節(jié)點的一種簡單方法,并不表明在DOM對象模型規(guī)范中為NamedNodeMap中的節(jié)點規(guī)定了一種排列順序。NamedNodeMap表示的是一組節(jié)點和其唯一名字的一一對
18、應(yīng)關(guān)系,這個接口主要用在屬性節(jié)點的表示上。與NodeList相同,在DOM中,NamedNodeMap對象也是"live"的。除上面的四個基本接口,常用的接口還有Element接口、Text接口、CDATASection接口、Attr接口等。 其中Element接口繼承自Node接口,表示XML或HTML文檔中的一個元素。元素可能與有與之相關(guān)的屬性,由于Element繼承Node,所以可以使用Node接口屬性attributes來獲得元素所有屬性的集合。Element接口上有通過名稱獲得Attr對象或?qū)傩缘姆椒?。在XML中,應(yīng)該獲得Attr對象來檢查表示屬性值的可能相當復(fù)雜
19、的子樹。 Text接口繼承CharacterData,并且表示Element或Attr的文本內(nèi)容。如果元素的內(nèi)容中沒有標記,則文本包含在實現(xiàn)Text接口的單個對象中,此接口是該元素的唯一的孩子。如果有標記,則將它解析為信息項(元素、注釋等)和組成該元素的子元素列表的Text節(jié)點。7.3 Java處理XML概述 XML文件是一個數(shù)據(jù)載體,也是程序之間進行溝通的方式,在程序設(shè)計中占有著重要地位。對文件的操作可以歸結(jié)為對XML文件的讀入、處理和保存等三個基本技術(shù)。處理XML文件,需要一個XML解析器,解析器的作用在于為應(yīng)用程序提供現(xiàn)成的讀寫、維護XML數(shù)據(jù)文件的途徑。如果沒有XML解析器,程序員只能
20、將XML文件當作文本來處理,需要做很多底層程序設(shè)計工作,例如,從文件查找標記、識別標記名稱等。由于XML解析器的存在,才將程序員從繁復(fù)的底層工作中解放出來,進而將精力集中到數(shù)據(jù)使用的算法上,而不是數(shù)據(jù)讀寫的細節(jié)。圖7.4演示了XML解析器在程序開發(fā)中的作用。XML文件XML解析器應(yīng)用程序 圖7.4 解析器和應(yīng)用程序關(guān)系示意圖 解析器在XML數(shù)據(jù)操作中起著重要作用,在XML規(guī)范發(fā)布之初,很多機構(gòu)和個人都發(fā)布了自己的XML解析器。不同的解析器往往具有不同的操作接口,為了規(guī)范XML解析器的操作接口,W3C提出了DOM操作規(guī)范。此外還有一些接口,雖然不是W3C提出,但由于使用的人員眾多,從而形成事實標
21、準,SAX就是其中一種。目前,SAX也是被W3C認可的標準。還有一些解析器,雖然沒有形成統(tǒng)一標準,但由于使用群體十分眾多,并且一直在一些領(lǐng)域使用,所以長時間存在。JDOM和DOM4J就是這種類型的軟件模塊。總體上,接口代表操作方法,DOM SAX只是規(guī)范接口的標準,而不是一種軟件,它們和解析器間的關(guān)系,如圖7.5所示(其中,小圓圈代表接口,它是XML分析器向外界提供服務(wù)的標準)。XML文件XML解析器應(yīng)用程序 圖7.5 解析器和標準接口之間的關(guān)系7.3.1 Java處理XML文件的接口對XML文件進行維護和操作的接口,目前存在兩類標準:DOM和SAX。前者將XML文件當作整體來處理;后者將XM
22、L文件當作數(shù)據(jù)流來處理。除此之外,還有一些非標準的XML接口,例如,jDOM、DOM4j等。這些接口和標準的DOM不兼容,但由于其易用性,在Java開發(fā)中有著十分廣泛的應(yīng)用。1、 DOM標準DOM是一種操作XML數(shù)據(jù)文件最廣泛的標準,獨立于特定語言和平臺。DOM只是用來規(guī)范軟件的,而不是一種具體軟件。目前,很多XML解析器都實現(xiàn)DOM接口標準。DOM標準最基本的思想是將整個XML數(shù)據(jù)文件加載入內(nèi)存,并在內(nèi)存中解析成一棵樹形對象,程序通過DOM接口可以自由操作該樹對象。因而,基于DOM的處理器對內(nèi)存要求比較高,但其速度相對較快。2、 SAX標準SAX標準是由一家公司推出的操作XML數(shù)據(jù)文件的方法
23、,目前已經(jīng)成為一個標準。該接口以流的方式操作XML數(shù)據(jù)文件,由于是讀一部分數(shù)據(jù),再處理一部分數(shù)據(jù),所以對系統(tǒng)的內(nèi)存要求不高。該接口通常是基于事件的,其將XML數(shù)據(jù)文件中不同的內(nèi)容歸類為不同對象。當SAX處理器分析到不同的對象時,就產(chǎn)生不同的事件,進而調(diào)用不同的事件處理器。3、 JAXP規(guī)范JAXP是Sun公司提出的一種Java操作XML數(shù)據(jù)文件的標準,目前被很多Java XML解析器支持。JAXP的作用是在Java應(yīng)用程序和具體解析器之間提供一個統(tǒng)一編程接口,從而提高Java應(yīng)用程序的可移植性。JAXP本身不是解析器,也不能替代標準的DOM和SAX接口,但其規(guī)范了Java應(yīng)用程序獲取DOM或S
24、AX接口的方式,規(guī)范了Java應(yīng)用程序加載XML解析器的方式。圖7.6展示了JAXP和DOM SAX以及XML解析器之間的關(guān)系。DOM/SAXXML文件XML解析器1應(yīng)用程序XML解析器2XML解析器3 JAXP 圖7.6 JAXP和解析器以及DOM和SAX關(guān)系示意圖 JAXP本身只是一個接口框架,它的正確使用需要有XML解析器JDK1.5之后,采用Xerces為默認的解析器,提供了JAXP的默認實現(xiàn)。但這種設(shè)置可以通過修改系統(tǒng)屬性而改變。7.3.2 Java常用的解析器XML解析器的作用在于為應(yīng)用程序提供操作XML數(shù)據(jù)的調(diào)用服務(wù)。目前市場上流通許多XML解析器,其中以Apache開發(fā)組織維護
25、的開源XML解析器應(yīng)用面最廣。下面對各種解析器的特點作簡單介紹。1、 Crimson解析器Crimson解析器是比較有名的解析器,目前由Apache開發(fā)組織維護,最新版本為Crimson1.1。Crimson項目起源于Sun公司的ProjectX項目。后來該項目由Apache開發(fā)組織,Crimson就是在該項目基礎(chǔ)上發(fā)展起來的。目前,Crimson已經(jīng)停止開發(fā)新版本,最新版本Crimson1.1是2001年、2002年左右的產(chǎn)品。Crimson1.1支持XML規(guī)范1.0、JAXP接口、SAX2.0、SAX2.0 Extensions 1.0、DOM Level 2等規(guī)范。JDK1.4的XML默
26、認實現(xiàn)采用的就是Crimson,但是新版的JDK中,這種情況已經(jīng)發(fā)生了變化,原因在于Crimson不是一種性能很好的XML解析器。2、 Xerces解析器Xerces是一個和Crimson歷史同樣悠久的XML解析器,目前由Apache開發(fā)組織的Xerces項目組維護。該項目起源于IBM給Apache開發(fā)組織的XML4J項目。目前,最新版 本是Xerces-J2.11.0。從JDK1.5以后,Xerces就成了JDK的XML默認實現(xiàn)。 Xerces-J2.11.0支持XML規(guī)范1.0、1.1;DOM levels 1, 2, 3; SAX 1 , 2, Namespaces, and W3C X
27、ML Schema。它是一個無論從效率,還是從界面友好性都是十分成功的XML解析器。3、 Xalan解析器Xalan嚴格意義上不是一個XML解析器,而是XSLT轉(zhuǎn)換器。目前由由Apache開發(fā)組織負責維護。以前Xalan是作為Apache開發(fā)組織XML項目組中的一個子項目而存在,現(xiàn)在為了突出其在XSLT和XPATH方面的重要性,已經(jīng)分出XML項目組,成為一個獨立的項目組,其最新版本為Xalan-J2.7.1。Xalan-Java實現(xiàn)了JAXP1.3的轉(zhuǎn)換接口,同時實現(xiàn)了JAXP1.3的XPATH。Xalan-Java建立在SAX2.0和DOM Level 3之上。通常需要綁定一個XML解析器使
28、用。4、 JDOM解析器JDOM嚴格意義上不是一個獨立的解析器,而是在JAXP和Xerces基礎(chǔ)上開發(fā)的一個非標準的操作XML數(shù)據(jù)文件的XML模塊。JDOM提供了以DOM思想操作XML數(shù)據(jù)文件的方式,但和標準的DOM并不兼容。盡管如此,由于其開發(fā)接口簡單等原因,在Java開發(fā)領(lǐng)域有著廣泛的用戶群體。7.3.3 使用JAXP操作XML數(shù)據(jù)XML標準接口規(guī)定了應(yīng)用程序通過XML解析器操作XML數(shù)據(jù)的方式,但并沒有規(guī)定Java應(yīng)用程序或取解析器對象的方式。多數(shù)XML解析器在遵守XML標準的同時,提供了各式各樣的解析器對象的獲取和調(diào)用方式,影響了Java程序在該方面的可移植性。JAXP的存在就是為了在
29、該方面形成統(tǒng)一,規(guī)定了Java應(yīng)用程序獲得解析器對象的行為,其作用是將Java應(yīng)用程序和具體的XML解析器隔離開,圖7.7演示了JAXP在XML分析器與應(yīng)用程序之間的關(guān)系。XML文件XML解析器應(yīng)用程序 JAXP 圖7.7 JAXP在應(yīng)用程序操作解析器過程中的作用當應(yīng)用程序請求XML解析器時,JAXP會根據(jù)JRE LIB目錄下的配置文件內(nèi)容選擇相應(yīng)的解析器,并構(gòu)造相應(yīng)對象返回給Java應(yīng)用程序。JAXP中比較核心的類有如下幾個:(1) DocumentBuilder(2) DocumentBuilderFactory(3) SAXParser(4) SAXParserFactory本章只介紹利
30、用JAXP進行DOM接口的操作,SAX接口下一章介紹。7.4 利用DOM讀取XML文檔信息7.4.1 XML文檔遍歷首先,創(chuàng)建一個XML文檔,打開記事本輸入下面的代碼,如例7-1所示。例7-1<?xml version="1.0" ?><圖書信息><圖書 isbn="7-111-10288-6"><書名>C#技術(shù)內(nèi)幕</書名><作者>Joseph Mayo</作者><售價>59.00</售價></圖書><圖書 isbn="
31、;7-5084-1152-8/TP.456"><書名>JAVA 2網(wǎng)絡(luò)協(xié)議內(nèi)幕</書名><作者>AI Williams</作者><售價>48.00</售價></圖書><圖書 isbn="7-121-02807-7"><書名>Eclipse完全手冊</書名><作者>周競濤</作者><售價>55.00</售價></圖書><圖書信息>將文件保存,文件名example1.xml
32、。其次,創(chuàng)建Java文件,打開記事本,在里面輸入下面代碼,如下列7-2所示。例7-2import org.w3c.dom.*;import javax.xml.parsers.*;import java.io.*;public class traveler public static void main(String args) try DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Documen
33、t document=builder.parse(new File("example1.xml"); Element root=document.getDocumentElement(); String rooName=root.getNodeName(); System.out.println("XML文件根結(jié)點的名稱為:"+rooName); NodeList nodelist=document.getElementsByTagName("圖書"); int size=nodelist.getLength(); for(int i
34、=0;i<size;i+) Node node=nodelist.item(i); String name=node.getNodeName(); String content=node.getTextContent(); System.out.println(name); System.out.println(""+content); catch(Exception e) System.out.println(e); 將該文件保存,文件名為traveler.java。編譯后執(zhí)行該文件,結(jié)果顯示如圖7.8所示。圖7.8 遍歷XML文檔結(jié)果圖在此例中,首先引入Java文
35、件在運行的時候所需要加載的三個包:W3C DOM定義的規(guī)范的接口、獲取XML文檔對象的包、Java讀取文件的時候需加載的包。在mian方法中,DocumentBuilderFactory是一個抽象類,其主要作用是定義工廠API,使應(yīng)用程序能夠從XML文檔獲得生成DOM對象樹的解析器。DocumentBuilder定義API,使其從XML文檔中獲取DOM文檔實例。使用此類,應(yīng)用程序可以從XML中獲取一個Document對象,之后開始解析XML文檔。具體“DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();”這句表
36、示創(chuàng)建一個工廠factory?!癉ocumentBuilder builder=factory.newDocumentBuilder();”表示創(chuàng)建一個文檔建設(shè)者。“Document document=builder.parse(new File("example1.xml");”表示由XML文檔“example1.xml”生成一個Document對象,對文檔的一切操作從此開始。當獲得XML文檔的入口之后,通過getDocumentElement()方法獲得文檔的根元素對象,進而通過getNodeName()方法獲得根元素名稱。本例的目標是遍歷元素的內(nèi)容,這要訪問根元素的所
37、有子元素,用到NodeList對象,即節(jié)點集合。本例中通過“document.getElementsByTagName("圖書");”實現(xiàn)。接下來的內(nèi)容相對簡單,在集合中作循環(huán),依次取出每一個子元素“圖書”查看數(shù)據(jù)。循環(huán)中所用到方法,.item(i)獲取集合中的第i個節(jié)點(以0為起始),.getNodeName()返回節(jié)點的名稱,getTextContent()返回文本數(shù)據(jù)。7.4.2 Element節(jié)點的操作Element接口是十分重要的接口,該接口被實例化后,會對應(yīng)節(jié)點樹上的元素類型的節(jié)點。這樣的節(jié)點使用getNodeType()方法測試,返回值為Node.ELEMEN
38、T_NODE。Element節(jié)點具備一些常用方法獲取相關(guān)信息。getNodeName()獲取節(jié)點的名稱,此處指XML中的標記名稱;getAttribute(String name)返回該節(jié)點對應(yīng)的名稱為name的屬性值。下面通過一個實例講解。打開記事本,在其中輸入如下代碼,如下例7-3所示。例7-3import org.w3c.dom.*;import javax.xml.parsers.*;import java.io.*;public class element_do public static void main(String args) try DocumentBuilderFacto
39、ry factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse(new File("example1.xml"); Element root=document.getDocumentElement(); String rooName=root.getNodeName(); System.out.println("XML文件根結(jié)點的名稱為:"+rooNa
40、me); NodeList nodelist=root.getChildNodes(); int size=nodelist.getLength(); for(int i=0;i<size;i+) Node node=nodelist.item(i); if(node.getNodeType()=Node.ELEMENT_NODE) Element elementNode=(Element)node; String name=elementNode.getNodeName(); String id=elementNode.getAttribute("isbn"); S
41、tring content=elementNode.getTextContent(); System.out.println(name+"n"+id+"n"+content+"n"); catch(Exception e) System.out.println(e); 將該文件保存為element_do.java。編譯執(zhí)行后得到的結(jié)果如圖7.9所示。該例主要說明Element節(jié)點的用法。獲取根元素之后,使用了方法getChildNodes()獲取根節(jié)點的子節(jié)點,得到的事一個節(jié)點集合。而Element的子節(jié)點不一定是Element節(jié)點,
42、有可能是Text節(jié)點、ProcessInstruction節(jié)點和CharacterData節(jié)點等。所以對于集合中的每一個節(jié)點首先判斷其是否為Element節(jié)點。如果是,進行強制類型轉(zhuǎn)換(Element elementNode=(Element)node;)。只有這樣,Element節(jié)點的特別方法才可以使用。本例中輸出了每一個圖書節(jié)點的名稱、屬性值和文本內(nèi)容(子元素文本內(nèi)容)。圖7.9 Element節(jié)點操作結(jié)果圖7.4.2 DTD相關(guān)信息 一個規(guī)范的XML文件,在裝入內(nèi)存中的時候,會被封裝成一個Document節(jié)點,或為DOM節(jié)點樹。在XML文件存在關(guān)聯(lián)的DTD時,Document節(jié)點有兩個節(jié)
43、點:Element節(jié)點、DocumentType節(jié)點。Element節(jié)點對應(yīng)根元素;DocumentType節(jié)點對應(yīng)DTD文件。通過Document節(jié)點的getDoctype()返回當前節(jié)點的DocumentType子節(jié)點。下面通過實例說明讀取有關(guān)DTD信息使用。首先準備XML文檔內(nèi)容,打開記事本,輸入如下內(nèi)容。<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE HXUCC PUBLIC "-/ISO77/hebei/forXML/ch" "wanghong.d
44、td" <!ELEMENT HXUCC ANY> <!ELEMENT YEAR (#PCDATA)> ><HXUCC> &chen; <YEAR>2010</YEAR> <DEPARTMENT> <DEPARTMENT_NAME>network lab</DEPARTMENT_NAME> </DEPARTMENT>&kkk; <DEPARTMENT> <DEPARTMENT_NAME>room</DEPARTMENT_NAME
45、> </DEPARTMENT></HXUCC>將文件保存為example2.xml。然后準備DTD內(nèi)容,在記事本中,輸入如下內(nèi)容<?xml version="1.0" encoding="gb2312"?><!ENTITY chen "河西大學(xué)計算中心" ><!ENTITY kkk SYSTEM "kk.xml"><!ELEMENT DEPARTMENT (DEPARTMENT_NAME)><!ELEMENT DEPARTMENT_
46、NAME (#PCDATA)>將文件保存為wanghong.dtd。再次準備實體文件如下<poem>This is a example of entity!</poem>將其存為kk.xml。最后,準備Java程序,在記事本中輸入如下內(nèi)容。import org.w3c.dom.*;import javax.xml.parsers.*;import java.io.*;public class do_dtd public static void main(String args) try DocumentBuilderFactory factory=Document
47、BuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse(new File("example2.xml"); DocumentType doctype=document.getDoctype(); String DTDName=doctype.getName(); System.out.println("DTD的名字:" +DTDName); String publicId=doct
48、ype.getPublicId(); System.out.println("PUBLIC的標識:" +publicId); String systemId=doctype.getSystemId(); System.out.println("systemId的標識:" +systemId); String internalDTD=doctype.getInternalSubset(); System.out.println("內(nèi)部DTD:" +internalDTD); NamedNodeMap map=doctype.getEnt
49、ities(); for(int i=0;i<map.getLength();i+) Entity node=(Entity)map.item(i); String encoding=node.getInputEncoding(); String content=node.getTextContent(); System.out.println(encoding); System.out.println(content); catch(Exception e) System.out.println(e); 將文件存為do_dtd.java,編譯后執(zhí)行該文件,其執(zhí)行結(jié)果如圖7.10所示。圖
50、7.10 讀取DTD信息結(jié)構(gòu)圖在該例中,首先通過“DocumentType doctype=document.getDoctype();”獲得DTD節(jié)點的對象doctype,然后通過該節(jié)點的幾個方法獲得DTD的相關(guān)信息。其中g(shù)etName()獲取根元素名稱;getPublicId()獲取外部DTD的公共標識;getSystemId()獲取外部DTD的系統(tǒng)標識;getInternalSubset()獲取內(nèi)部DTD的內(nèi)容。程序的最后一部分是獲取實體的內(nèi)容。語句“NamedNodeMap map=doctype.getEntities();”將DTD中定義的實體封裝到一個節(jié)點集合里,此中節(jié)點沒有順序
51、關(guān)系。接下來的循環(huán)結(jié)構(gòu)從集合中取出每一個實體進行處理。在每一步的處理過程中都是輸出實體的編碼(通過getInputEncoding())和內(nèi)容(通過getTextContent()),當然只有外部實體才有返回的結(jié)果,內(nèi)部實體沒有。本例設(shè)定了一個內(nèi)部實體和一個外部實體。7.4.3 Attr節(jié)點操作 Attr節(jié)點是一個相當特殊的節(jié)點,它對應(yīng)于XML文檔中元素的屬性。在XML文件中的元素可以包含子元素、文本數(shù)據(jù)和屬性。其中子元素對應(yīng)Element型的節(jié)點,文本數(shù)據(jù)對應(yīng)Text型的節(jié)點,這兩種節(jié)點都是節(jié)點樹中Element節(jié)點的子節(jié)點。而屬性對應(yīng)的Attr節(jié)點不是作為Element的子節(jié)點出現(xiàn)的,也就
52、是說在遍歷DOM樹的時候訪問不到Attr節(jié)點。要想訪問Attr節(jié)點,只有先找到其所屬的Element節(jié)點之后,用特別的方法訪問。下面的實例說明其操作。首先,制作XML文檔,本文檔改編自example1.xml,在此基礎(chǔ)上添加屬性,構(gòu)成的文檔內(nèi)容如下,并將其命名為example_attr.xml。<?xml version="1.0" ?><圖書信息><圖書 isbn="7-111-10288-6" 出版日期="1999.8"><書名>C#技術(shù)內(nèi)幕</書名><作者>
53、Joseph Mayo</作者><售價>59.00</售價></圖書><圖書 isbn="7-5084-1152-8/TP.456" 出版日期="2002.9"><書名>JAVA 2網(wǎng)絡(luò)協(xié)議內(nèi)幕</書名><作者>AI Williams</作者><售價>48.00</售價></圖書><圖書 isbn="7-121-02807-7" 出版日期="2006.7">&l
54、t;書名>Eclipse完全手冊</書名><作者>周競濤</作者><售價>55.00</售價></圖書></圖書信息>打開記事本,在里面輸入下列Java代碼,并將其命名為attribute_do.java。import org.w3c.dom.*;import javax.xml.parsers.*;import java.io.*;public class attribute_do public static void main(String args) try DocumentBuilderFacto
55、ry factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse(new File("example_attr.xml"); Element root=document.getDocumentElement(); String rooName=root.getNodeName(); System.out.println("XML文件根元素的名稱為:"+rooName); NodeList nodelist=root.getElementsByTagName(&quo
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 接樁專項施工方案
- 機柜間施工方案
- 二零二五年度美甲店知識產(chǎn)權(quán)保護與專利申請合同4篇
- 高效害蟲防治與建筑保護合同2025年度版4篇
- 部編人教版七年級上冊語文《少年正是讀書時》教學(xué)設(shè)計
- 2025年度新能源車輛掛名權(quán)轉(zhuǎn)讓及免責保障協(xié)議范本4篇
- 2025年版酒店餐飲行業(yè)食品安全與售后服務(wù)標準協(xié)議3篇
- 二零二五年船舶安全監(jiān)督與船員資質(zhì)審核協(xié)議3篇
- 2025年度商業(yè)空間瓷磚定制及安裝服務(wù)合同4篇
- 二零二五版蒙娜麗莎瓷磚環(huán)保認證與市場準入?yún)f(xié)議4篇
- 招標師《招標采購項目管理》近年考試真題題庫(含答案解析)
- 微生物組與唾液腺免疫反應(yīng)-洞察分析
- 2024公共數(shù)據(jù)授權(quán)運營實施方案
- 《向心力》 教學(xué)課件
- 結(jié)構(gòu)力學(xué)數(shù)值方法:邊界元法(BEM):邊界元法的基本原理與步驟
- 北師大版物理九年級全一冊課件
- 2024年第三師圖木舒克市市場監(jiān)督管理局招錄2人《行政職業(yè)能力測驗》高頻考點、難點(含詳細答案)
- RFJ 006-2021 RFP型人防過濾吸收器制造與驗收規(guī)范(暫行)
- 盆腔炎教學(xué)查房課件
- 110kv各類型變壓器的計算單
- 新概念英語課件NCE3-lesson15(共34張)
評論
0/150
提交評論