




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第10章 XML與Java 返回主頁 上一章 下一章教學(xué)提示:一個單獨(dú)的XML文件不能做任何的工作,它需要與應(yīng)用程序結(jié)合來實(shí)現(xiàn)各種功能,應(yīng)用程序通過XML解析器和XML應(yīng)用程序接口處理XML文件。本章介紹了Java程序如何使用DOM解析XML文件。JAXP 提供的類和方法,可以讓Java應(yīng)用程序使用DOM解析或轉(zhuǎn)換XML文件。教學(xué)要求:了解Java的特點(diǎn),熟悉Java的開發(fā)環(huán)境JDK的安裝和配置,掌握J(rèn)ava使用DOM加載XML的方法,掌握訪問XML元素和屬性的方法,掌握使用DOM創(chuàng)建XML文件的方法,學(xué)會轉(zhuǎn)換XML文件為HTML的方法。10.1 Java語言簡介10.2
2、Java的開發(fā)環(huán)境10.3 Java程序加載XML文件10.4 Java程序中訪問XML元素和屬性10.5 Java程序中XML文件的轉(zhuǎn)換小 結(jié)習(xí) 題寫字版 繪圖板 進(jìn)入Editplus10.1 Java語言簡介 本章開頭 下一節(jié)10.1.1 Java的誕生Java來自于Sun公司的一個叫Green的項(xiàng)目,其原先的目的是為家用消費(fèi)電子產(chǎn)品開發(fā)一個分布式代碼系統(tǒng),這樣可以把E-mail發(fā)給電冰箱、電視機(jī)等家用電器,對它們進(jìn)行控制,和它們進(jìn)行信息交流。開始,準(zhǔn)備采用C+,但C+太復(fù)雜,安全性差。1991年,Sun公司的Jame Gosling、Bill Joe等人開發(fā)了一種新的
3、語言O(shè)ak(Java的前身),Oak是一種用于網(wǎng)絡(luò)的精巧而安全的語言,Sun公司曾以此投標(biāo)一個交互式電視項(xiàng)目,但結(jié)果是被SGI打敗??蓱z的Oak幾乎無家可歸,恰巧這時Mark Andersen開發(fā)的Mosaic和Netscape啟發(fā)了Oak項(xiàng)目組成員,他們用Java編制了HotJava瀏覽器,得到了Sun公司首席執(zhí)行官Scott McNealy的支持,觸發(fā)了Java進(jìn)軍Internet.Java的取名也有一趣聞。有一天,幾位Java成員組的會員正在討論這個新的語言取什么名字,當(dāng)時他們正在咖啡館喝著Java(爪哇)咖啡,有一個人靈機(jī)一動說不如就叫Java,得到了其他的人的贊賞,于是,Java這個
4、名字就這樣傳開了。10.1.2 Java語言的特點(diǎn)根據(jù)Sun公司的“Java白皮書”中對Java的定義,Java是一種簡單、面向?qū)ο?、分布式、解釋性、健壯、安全、結(jié)構(gòu)中立、可移植、高性能、多線程、動態(tài)的語言。1)簡單性 Java語言是一種面向?qū)ο蟮恼Z言,它通過提供最基本的方法來完成指定的任務(wù),只需理解一些基本的概念 ,就可以用它編寫出適合于各種情況的應(yīng)用程序。 Java語言是一種類似C+的面向?qū)ο蟮恼Z言,因此,C+程序員可以很快就掌握J(rèn)ava編程技術(shù)。Java摒棄了C+中容易引發(fā)程序錯誤的地方,如指針的內(nèi)存管理。Java提供了豐富的類庫,使編程比較容易。2)面向?qū)ο驤ava語言的設(shè)計(jì)集中于對象
5、及其接口,對象中封裝了它的狀態(tài)變量以及相應(yīng)的方法 ,實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,并且通過繼承機(jī)制,子類可以使用父類所提供的方法,實(shí)現(xiàn)了代碼的復(fù)用。它提高了簡單的類機(jī)制及動態(tài)的接口模型,是純面向?qū)ο缶幊陶Z言,它不支持類似C語言那樣的面向過程的程序設(shè)計(jì)技術(shù)。Java支持靜態(tài)和動態(tài)風(fēng)格的代碼繼承及復(fù)用。3)分布式Java包括一個支持HTTP和FTP等基于TCP/IP協(xié)議的子庫。因此,Java應(yīng)用程序可憑借URL打開并訪問網(wǎng)絡(luò)上的對象,其訪問方式與訪問本地文件系統(tǒng)幾乎完全相同。為分布式環(huán)境尤其是Internet提供動態(tài)內(nèi)容無疑是一項(xiàng)非常困難的任務(wù),但Java的語法特性卻使我們很
6、容易實(shí)現(xiàn)這項(xiàng)目標(biāo)。4)解釋性Java解釋器(運(yùn)行系統(tǒng))能直接運(yùn)行目標(biāo)代碼指令。鏈接程序通常比編譯程序所需資源少,所以程序員可以在創(chuàng)建源程序上花上更多的時間。5)健壯性Java在編譯和運(yùn)行程序時,都要對可能出現(xiàn)的問題進(jìn)行檢查,以消除錯誤的產(chǎn)生。它提供自動垃圾收集來進(jìn)行內(nèi)存管理,防止程序員在管理內(nèi)存時容易產(chǎn)生的錯誤。通過集成的面向?qū)ο蟮睦馓幚頇C(jī)制,在編譯時,Java提示出可能出現(xiàn)但未被處理的例外,幫助程序員正確地進(jìn)行選擇以防止系統(tǒng)的崩潰。另外,Java在編譯時還可捕獲類型聲明中的許多常見錯誤,防止動態(tài)運(yùn)行時不匹配問題的出現(xiàn)。6)安全性Java的安全性可從兩個方面得到保證。一方面Java語言不支持
7、指針和釋放內(nèi)存等C+的功能,這樣就避免了非法內(nèi)存操作。另一方面,類裝載通過將本機(jī)類與網(wǎng)絡(luò)資源類的名稱分開,來保持安全性。因此調(diào)入類時總要經(jīng)過檢查,這樣避免了“特洛伊木馬”現(xiàn)象的出現(xiàn)。7)結(jié)構(gòu)中立另外,為了使Java作為網(wǎng)絡(luò)的一個整體,Java程序?qū)⑺某绦蚓幾g成一種結(jié)構(gòu)中立的中間文件格式。只要有Java運(yùn)行系統(tǒng)的機(jī)器都能執(zhí)行這種中間代碼。 8)可移植性與平臺無關(guān)的特性使 Java程序可以方便地被移植到網(wǎng)絡(luò)上的不同機(jī)器。同時Java的類庫中也實(shí)現(xiàn)了與不同平臺的接口,使這些類庫可以移植。另外Java編譯器是由 Java語言實(shí)現(xiàn)的,Java運(yùn)行時系統(tǒng)由標(biāo)準(zhǔn)C實(shí)現(xiàn) ,這使得Java系統(tǒng)本身也具有可移植
8、性。 9)高性能如果解析器速度不慢,Java可以在運(yùn)行時直接將目標(biāo)代碼翻譯成機(jī)器指令。從而得到較高的性能。10)多線程Java提供多線程功能使得在一個程序里可同時執(zhí)行多個小任務(wù),而且同步機(jī)制保證了對共享數(shù)據(jù)的正確操作。通過使用多線程可以很容易地實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時交互行為。11)動態(tài)性Java的動態(tài)特性是其面向?qū)ο笤O(shè)計(jì)方法的擴(kuò)展。它允許程序動態(tài)地裝入運(yùn)行過程中所需要的類,這是C+語言進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)所無法實(shí)現(xiàn)的。而且Java通過接口來支持多繼承,使之比嚴(yán)格的類繼承具有更靈活的方式和擴(kuò)展性。10.1.3 Java帶來的影響Java雖出現(xiàn)的時間不長,但已被業(yè)界接受,IBM、Apple、DEC、Ad
9、obe、SiliconGraphics、HP、Oracle、Toshiba、NetScape和Microsoft等大公司已經(jīng)購買了Java的許可證。Microsoft還在其Web瀏覽器Explorer 3.0版中增加了對Java的支持。另外,眾多的軟件開發(fā)商也開發(fā)了許多支持Java的軟件產(chǎn)品。如:Borland公司的基于Java的快速應(yīng)用程序開發(fā)環(huán)境Latte;Metrowerks公司和Natural Intelligence公司分別開發(fā)的基于Machintosh的Java開發(fā)工具;Sun公司的Java開發(fā)環(huán)境Java Workshop;Microsoft也開發(fā)出系列Java產(chǎn)品。數(shù)據(jù)庫廠商如
10、Illustra, Sybase, Versant, Oracle都在開發(fā)支持HTML和Java的CGI(Common Gateway Interface)。在以網(wǎng)絡(luò)為中心的計(jì)算時代,不支持HTML和Java,就意味著應(yīng)用程序的應(yīng)用范圍只能限于同質(zhì)的環(huán)境。Internet正在成為企業(yè)信息系統(tǒng)最佳的解決方案。它的優(yōu)點(diǎn)表現(xiàn)在:便宜、易于使用和管理。用戶不管使用何種類型的機(jī)器和操作系統(tǒng),界面是統(tǒng)一的Web瀏覽器,而數(shù)據(jù)庫、Web頁面、應(yīng)用程序(用Java編的applet)則存在WWW服務(wù)器上。開發(fā)人員只需維護(hù)一個軟件版本,管理人員省去了為用戶安裝、升級、培訓(xùn)之苦,用戶則只需一個操作系統(tǒng)和
11、一個Internet瀏覽器足矣。我們可以設(shè)想未來的計(jì)算方式,每個HomePage的實(shí)質(zhì)是一個多媒體應(yīng)用程序,這些程序用Java來開發(fā)。Java應(yīng)用程序運(yùn)行在異質(zhì)的機(jī)器、異質(zhì)的操作系統(tǒng)之上,甚至于電冰箱、烤面包箱、防盜電子設(shè)備之中,用Internet把所有的電子設(shè)備連接起來,通過TCP/IP進(jìn)行信息的交流。Java應(yīng)用程序之間既可以交換消息,也可以交換程序(一個Java的小應(yīng)用程序applet)。或許有一天,我們可以在Netscape瀏覽器里查看電冰箱的溫度,向烤面包箱發(fā)一個電子郵件。Java的出現(xiàn)是計(jì)算機(jī)信息交換的一個重要里程碑。在單機(jī)時代,程序進(jìn)程之間靠共享存儲進(jìn)行變量交換;在網(wǎng)絡(luò)時代,運(yùn)行
12、在不同宿主機(jī)上的程序按網(wǎng)絡(luò)協(xié)議進(jìn)行無格式的消息(二進(jìn)制字符流)交換,消息的語義由交換程序雙方維護(hù);在Java時代,運(yùn)行在網(wǎng)絡(luò)上的程序進(jìn)程交換的是小應(yīng)用程序(applet)。小應(yīng)用程序是什么?它是一個對象,由一組屬性和方法構(gòu)成,是一個可執(zhí)行的實(shí)體;不僅有數(shù)據(jù)的狀態(tài),而且有定義在數(shù)據(jù)上的操作。未來可能進(jìn)行代理(Agent)交換,代理有一定的智能性,那便是信息交換的更高級階段。隨著Internet的崛起、Java的誕生,巨型的、臃腫的應(yīng)用軟件開始向小型化發(fā)展,由眾多“生活”在Internet上的小應(yīng)用程序(applet)相互協(xié)作完成信息的處理與傳遞。Java會加速應(yīng)用軟件的小型化、網(wǎng)絡(luò)化的趨勢。隨著
13、Internet的發(fā)展,軟件必然是面向“大眾”,而不是“少數(shù)人”的奢侈品,薄利多銷將是網(wǎng)絡(luò)應(yīng)用軟件的重要特點(diǎn)。分布式對象技術(shù)保證了用多少,下載多少。Java連同Internet, WWW正在改變應(yīng)用軟件的開發(fā)和使用方式,一切都要圍繞著網(wǎng)絡(luò),圍繞著平臺無關(guān)。很多人認(rèn)為,Word, Excel等傳統(tǒng)的信息處理工具都必然走向萎縮,因?yàn)樗鼈兪菃螜C(jī)時代的產(chǎn)物。信息的價值在于使用和共享,Internet和Web是信息的使用和共享最快捷、最便宜的方式,Word將演化成為Web寫作工具,Excel則將演化成Web上的電子表格。 10.2 Java的開發(fā)環(huán)境 上一節(jié) 下一節(jié) 本章開頭Java程序的開發(fā)
14、環(huán)境需要安裝Sun公司的JDK,然后配合Windows的記事本或其他編輯工具建立Java應(yīng)用程序。10.2.1 JDK的安裝Java開發(fā)工具“Java Development Kit”(JDK)擁有很多版本,本章使用JDK1.4版,這個版本內(nèi)含JAXP API1.1版。我們可以從免費(fèi)下載此開發(fā)工具。雖然Java是跨平臺的,但在各種平臺時的安裝方式卻各不相同,下載時要選擇支持的操作系統(tǒng)和語言下載。下載好后即可運(yùn)行安裝了。這里主要介紹Windows操作系統(tǒng)下的J2sdk1.4.2_07-win.exe安裝過程。JDK的安裝比較簡單,和安裝其他的軟件沒有什么區(qū)別,安裝過程介紹如下:1)雙擊下載后的J
15、2sdk1.4.2_07-win.exe,先出現(xiàn)歡迎安裝的向?qū)Ы缑?,然后出現(xiàn)版權(quán)協(xié)議說明界面,接受版權(quán)協(xié)議后,單擊【Next】按鈕,如圖10.1所示。2)出現(xiàn)選擇安裝組件的界面和安裝路徑,默認(rèn)路徑是c:j2sdk1.4.2_07,如圖10.2所示。3)選擇瀏覽器,然后單擊【Next】按鈕繼續(xù)安裝,如圖10.3所示。4)對JDK進(jìn)行安裝,如圖10.4所示,安裝完畢后,單擊【Finish】按鈕結(jié)束安裝。 圖10.1 版權(quán)協(xié)議界面圖10.2 選擇安裝組件和安裝路徑的界面圖10.3選擇瀏覽器界面圖10.4復(fù)制文件進(jìn)行安裝的界面10.2.2 JDK的配置安裝好 JDK, 還需要更新Path路徑
16、變量,假設(shè)JDK安裝在c:j2sdk1.4.2_07目錄下。下面以Windows 2000、XP操作系統(tǒng)為例來進(jìn)行配置。在桌面上用鼠標(biāo)單擊【我的電腦】,選擇【屬性】菜單,出現(xiàn)【屬性】對話框,選擇【高級】標(biāo)簽頁,如圖10.5。單擊【環(huán)境變量】按鈕后,如圖10.6所示。找到系統(tǒng)變量Path,編輯Path變量的值,在Path值域的文本框后面加上c:j2sdk1.4.2_07bin。在系統(tǒng)變量中新建classpath變量,將其值設(shè)置為c:j2sdk1.4.2_07lib,一般情況下這個路徑下的java包已經(jīng)夠用。有些特殊用途的java程序需要特定的包支持,可以將需要的包拷貝到這個路徑下。用戶開發(fā)的類或
17、包也需要把其所在路徑追加到classpath中,用分號與前面已有路徑隔開。如果要用到JSP服務(wù)或者J2EE架構(gòu),還需要設(shè)置JAVA_HOME等環(huán)境變量。圖10.5 【屬性】對話框圖10.6 【環(huán)境變量】對話框10.3 Java程序加載XML文件 上一節(jié) 下一節(jié) 本章開頭為了簡化編寫處理 XML 的 Java 程序,已經(jīng)建立了多種編程接口。這些接口或者由公司定義,或者由標(biāo)準(zhǔn)體或用戶組定義,以滿足 XML 程序員的需要。以下列出了四種接口: · Document Object Model(DOM,文檔對象模型),Level 2 · Simple API
18、for XML (SAX), Version 2.0 · JDOM, Jason Hunter 和 Brett McLaughlin 創(chuàng)立的一種簡單 Java API · Sun推出JAXB(Java Architecture for XML Binding) 這四種接口中DOM是W3C的正式推薦,本章主要介紹Java應(yīng)用程序如何使用DOM解析或轉(zhuǎn)換XML文件。要創(chuàng)建 DOM 或 SAX 解析器,需要使用 JAXP(Java API for XML Processing)。 10.3.1 JAXP的簡介 JAXP使得用Java語
19、言開發(fā)處理XML數(shù)據(jù)的應(yīng)用程序非常容易,JAXP包括詞法分析器、標(biāo)準(zhǔn)SAX與DOM,可以選擇以事件流或建立對象表示來解析數(shù)據(jù)。JAXP1.1版本還支持XSLT標(biāo)準(zhǔn),可以控制數(shù)據(jù)的表示,并可以將數(shù)據(jù)轉(zhuǎn)換成其它XML文件或其它格式,如HTML。JAXP還提供對名稱空間的支持,可以在沒有命名沖突的情況下使用DTD。JAXP 提供的類和方法,可以讓Java應(yīng)用程序使用DOM解析或轉(zhuǎn)換XML文件,在JDK1.4支持的JAXP API 1.1版支持XML,建議規(guī)格DOM Level 2、XSLT 1.0和SAX 2.0。其解析文檔對象模型的相關(guān)套件,如表12-1所示:表10-1 JAXP AP
20、I 1.1解析文檔對象模型的相關(guān)套件套 件說 明Javax.xml.parsers提供處理XML文件的類Javax.xml.transform提供處理XSLT文件的類org.xml.sax這是SAX解析器,提供以事件驅(qū)動方式解析XML文件的APIorg.xml.saxhelpers提供解析錯誤處理的相關(guān)類,可以幫助程序設(shè)計(jì)者使用SAXAPIOrg.w3c.dom提供支持DOM建議規(guī)格的套件10.3.2 常用的DOM接口DOM定義了一套標(biāo)準(zhǔn)的接口以便按照程序的設(shè)計(jì)顯示XML文檔。當(dāng)然。DOM不是一種實(shí)現(xiàn),支持DOM的XML解析器必須實(shí)現(xiàn)DOM所定義的接口。最常用的幾個DO
21、M接口對象可見第九章的表9-3所示,這里不再贅述。10.3.3 加載XML文檔文件在Java程序中加載XML文檔文件,步驟如下:1)首先需要導(dǎo)入相關(guān)的套件,如下所示:import javax.xml.parsers.*;import org.xml.sax.*;import org.w3c.dom.*;import java.io.*;其中org.xml.sax.*套件是解析錯誤處理的相關(guān)套件,此外因?yàn)閄ML文件屬于文本文件,所以導(dǎo)入文件處理的套件import java.io.*。2)在JAXP中,DOM解析器稱為“DocumentBulider”,可以通過工廠類DocumentBulider
22、Factory獲得,而Document對象則可以通過類DocumentBulider獲得,使用try catch指令建立解析的錯誤處理。在建立DocumentBulider對象后,可使用parser方法解析加載XML文件,這是一個File對象加載后就可以處理XML文件的節(jié)點(diǎn)內(nèi)容。其程序塊的架構(gòu)如下所示:/獲得一個XML文件的解析器DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try /解析XML文件生成DOM文檔的接口類,以便訪問DOM
23、0; DocumentBuilder db=dbf.newDocumentBuilder(); document=db.parser(new File(args0); . catch(SAXException se) /解析過程錯誤 Exception e=se; if(se.getException()!=null)
24、160; e=se.getException(); e.printStackTrace(); catch(ParserConfigurationExcepion pe) /解析器設(shè)定錯誤 pe.printStackTrace(); catch(IOException ie) &
25、#160; /文件處理錯誤 ie.printStacktrack(); 3)獲得接口類Document實(shí)例后,就可以對DOM的文檔樹進(jìn)行訪問。如要遍歷DOM文檔,首先要獲得根節(jié)點(diǎn),然后獲得根節(jié)點(diǎn)的子節(jié)點(diǎn)列表。 /獲得根節(jié)點(diǎn)Element element=document.getDocumentElement(); /獲得根節(jié)點(diǎn)的子節(jié)點(diǎn)列表 Nodelist=element.getChildNodes();【例10.1】顯示加載
26、的外部XML文件所有節(jié)點(diǎn)的名稱和值,code10_1.java,顯示結(jié)果如圖10.7。這里通過遞歸方法實(shí)現(xiàn)遍歷的目的。import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_1 static Document document; public static void main(String args) if(args.length!=1)
27、 System.out.println("加載xml file"); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try DocumentBuilder db=dbf.newDocumentBuilder(); /讀入XML文檔
28、0; document=db.parse(new File(args0); /遍歷XML文檔 walkNode(document.getDocumentElement(); catch(SAXException se) /解析過程錯誤 Exception e=se;
29、0; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器設(shè)定錯誤
30、 pe.printStackTrace(); catch(IOException ie) /文件處理錯誤 ie.printStackTrace(); private static void walkNode(Node anode)
31、60; NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;i<child.getLength();i+) Node node=child.item(i);
32、60; if(node.hasChildNodes() walkNode(node); else printNode(node); &
33、#160; private static void printNode(Node anode) System.out.println(anode.getNodeName()+","+anode.getNodeValue(); 被引用的XML文件為code10_1.xml: <?xml version="1.0" encoding="gb2312" ?><customers
34、> <customer ID="c0500103" > <username>cheaperget</username> <password>12345678</password> <email>notknown</email> <registerdate>200508</registerdate> <address>
35、160; <zipcode>361021</zipcode> <phone>lt;/phone> <street>XX省XX市銀江路108號</street> </address> </customer> <customer
36、ID="c0500208" > <username>dreamingboy</username> <password>22345678</password> <email>greatman</email> <registerdate>200505</registerdate> <address> &
37、#160; <zipcode>215006</zipcode> <phone>lt;/phone> <street>XX省XX市人民路616號</street> </address> </customer></customers> 圖10.7 例10.1運(yùn)
38、行結(jié)果本例中遍歷了XML文檔的所有節(jié)點(diǎn),并顯示出了所有節(jié)點(diǎn)的名稱和值。從結(jié)果中可以看出有許多#text節(jié)點(diǎn),其中一些是表示文本節(jié)點(diǎn),如#text,cheaperget和#text,12345678;還有的表示XML文件中行與行之間的換行符和空格符,如customers,null后的#text就是XML文件中第二行與第三行之間的換行符和空格符。如何去掉這些多余的#text節(jié)點(diǎn)呢?我們可以把XML文檔中的換行符和空格符去掉,再重新運(yùn)行程序,將會發(fā)現(xiàn)這些多余的#text節(jié)點(diǎn)全都沒有了??墒前裍ML文檔中的換行符和空格符去掉后,XML可讀性就非常差,怎樣解決這個問題呢?我們可以在加載文件時并設(shè)定參數(shù)。
39、10.3.4 設(shè)定加載XML文件的參數(shù)DocumentBuilderFactory類提供相關(guān)方法可以設(shè)定解析器解析XML文件的方式,例如:是否忽略文字或whitespace內(nèi)容的元素等,如表10.2所示: 表10.2 加載XML文件的參數(shù) 方 法說 明setCoalesing(Boolen)設(shè)置解析器CDATA節(jié)點(diǎn)轉(zhuǎn)換成TEXT文字節(jié)點(diǎn)和新增在其相鄰文字節(jié)點(diǎn)之后(如果有的話),默認(rèn)值為false,true表示轉(zhuǎn)換setExpandEntityReferencedes(boolen)設(shè)置解析器展開實(shí)體參考的節(jié)點(diǎn),默認(rèn)
40、值為true表示展開,false表示不展開setIgnoringComments(boolen)設(shè)置解析器忽略注釋文字,默認(rèn)值為false,true表示不忽略SetIgnoringElementContentWhitespace(boolen)設(shè)置解析器忽略元素內(nèi)容為whitespace空白字節(jié)的節(jié)點(diǎn),默認(rèn)值為false,true表示忽略【例10.2】加載外部code10_2.xml文件(此XML文件擁有DTD文件),并設(shè)定解析器參數(shù),然后顯示所有節(jié)點(diǎn)的名稱和值,code10_2.java,顯示結(jié)果如圖10.8。import javax.xml.parsers.*;import org.xml
41、.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_2 static Document document; public static void main(String args) if(args.length!=1) System.out.println("加載xml file"); return;
42、; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try /設(shè)定解析參數(shù) dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db=dbf.newDocumentBuilder(); /讀入XML文檔&
43、#160; document=db.parse(new File(args0); /遍歷XML文檔 walkNode(document.getDocumentElement(); catch(SAXException se) /解析過程錯誤 Exception e=se; &
44、#160; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器設(shè)定錯誤
45、60; pe.printStackTrace(); catch(IOException ie) /文件處理錯誤 ie.printStackTrace(); private static void walkNode(Node anode)
46、 NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;i<child.getLength();i+) Node node=child.item(i);
47、 if(node.hasChildNodes() walkNode(node); else printNode(node);
48、0; private static void printNode(Node anode) System.out.println(anode.getNodeName()+","+anode.getNodeValue(); 圖10.8 例10.2 運(yùn)行結(jié)果被引用的XML文件為code10_2.xml<?xml version="1.0" encoding="gb2312"?><!DOC
49、TYPE customers SYSTEM "code10_2.dtd"><customers> <customer ID="c0500103"> <username>cheaperget</username> <password>
50、;12345678</password> <email>notknown</email> <registerdate>200508</registerdate> <address>
51、 <zipcode>361021</zipcode> <phone>lt;/phone> <street>XX省XX市銀江路108號</str
52、eet> </address> </customer> <customer ID="c0500208"> <username>dreamingboy</username>
53、0; <password>22345678</password> <email>greatman</email> <registerdate>200505</registerdate>
54、0; <address> <zipcode>215006</zipcode> <phone>lt;/phone>
55、; <street>XX省XX市人民路616號</street> </address> </customer></customers>10.4 Java程序中訪問XML元素和屬性 上一節(jié) 下一節(jié) 本章開頭如果仔細(xì)分析例10.2的運(yùn)算結(jié)果,會發(fā)現(xiàn)元素的屬性沒有顯示出來,如何顯示出元素的屬性呢?從第九章的學(xué)習(xí),我們知道DOM是
56、由W3C制訂的用于處理XML文件和HTML文件的API。在應(yīng)用程序中,基于DOM的XML解析器將一個XML文檔轉(zhuǎn)換成一個類似于樹的對象模型集合,通常稱為DOM樹。在這棵樹中,包含了XML文檔所有內(nèi)容,并都用節(jié)點(diǎn)表示。首先來看一下XML文檔常見的節(jié)點(diǎn)的種類,如表10-3所示:表10-3 XML文件節(jié)點(diǎn)種類節(jié)點(diǎn)類型說 明NODE_DOCUMENT_TYPE<!DOCTYPE node SYSTEM “code10_2.dtd”>NODE_PROCESSING_INSTRUCTION<?xml vertion=”1.0”>NODE_ELEM
57、ENT<username>cheaperget</username>NODE_ATTRIBUTEID="c0500103"NODE_TEXTcheaperget表中列出了節(jié)點(diǎn)種類的常數(shù)名稱,當(dāng)DOM加載XML文件后,Java程序代碼看到的XML文件內(nèi)容就是表中各種節(jié)點(diǎn)組成的一棵樹狀結(jié)構(gòu),而節(jié)點(diǎn)本身還可能包含一些信息,例如節(jié)點(diǎn)的名字、節(jié)點(diǎn)值、節(jié)點(diǎn)的類型等,因此DOM樹中的節(jié)點(diǎn)是對象,對象包含方法與屬性。下面我們就看如何使用節(jié)點(diǎn)的方法來訪問節(jié)點(diǎn)的屬性。 10.4.1 訪問XML元素和屬性上節(jié)例10.2中我們已經(jīng)遍歷了DOM樹中的所有元素,如果仔細(xì)分析的運(yùn)
58、算結(jié)果,會發(fā)現(xiàn)元素的屬性沒有顯示出來,如何顯示出元素的屬性以及訪問元素呢?下面我們來進(jìn)行詳細(xì)講解。在DOM接口規(guī)范中,有四個基本接口:Document、Node、NodeList、Element。在這四個基本接口中,Document接口是對文檔進(jìn)行操作的入口,它是從Node接口繼承過來的。Node接口是其他大多數(shù)接口的父類,像Document、Element、Text、Comment等接口都是從Node接口繼承過來的。NodeList接口是一個節(jié)點(diǎn)的集合,它包含了某個節(jié)點(diǎn)中的所有子節(jié)點(diǎn)。下面我們來對這幾個接口分別做一些簡單的介紹。1.Document接口Document接口代表了整個XML文檔
59、,因此,它是整個文檔樹的根,提供了對文檔中的數(shù)據(jù)進(jìn)行訪問和操作的入口。通過Document節(jié)點(diǎn),可以訪問到文檔中的其他節(jié)點(diǎn),如處理指令、批注、文字等。方法描述:1)getDocumentElement() Document文件對象使用該方法可獲取XML文件的根節(jié)點(diǎn);2)getElementsByTagName() Document使用標(biāo)記名獲取子節(jié)點(diǎn),取出的節(jié)點(diǎn)是一個NodeList對象。2.Node接口Node接口在整個DOM樹中具有舉足輕重的地位,DOM接口中很大一部分接口是從Node接口繼承過來的,例如Document、Element、Text、Comment等
60、接口,都是從Node接口繼承過來的。在DOM樹中,Node接口代表了樹中的一個節(jié)點(diǎn)。方法列表:1)getChildNodes() 獲取子節(jié)點(diǎn)的NodeList節(jié)點(diǎn)對象列表,即子節(jié)點(diǎn)數(shù);2)getNodeName() 返回節(jié)點(diǎn)名稱,不同節(jié)點(diǎn)種類的值不同;3)getNodeType() 返回節(jié)點(diǎn)種類的代碼;4)getNodeValue() 返回節(jié)點(diǎn)的值;5)getFirstChild() 獲取第一個子節(jié)點(diǎn);6
61、)getNextSibling() 獲取此節(jié)點(diǎn)的兄弟節(jié)點(diǎn),即同級的下一個節(jié)點(diǎn);7)getLastChild() 獲取最后一個子節(jié)點(diǎn);8)getParentNode() 獲取父節(jié)點(diǎn);9)hasChildNodes() Node節(jié)點(diǎn)對象檢查是否擁有子節(jié)點(diǎn),是返回true,否則為false。3.NodeList接口NodeList接口提供了對節(jié)點(diǎn)集合的抽象定義,它并不包含如何實(shí)現(xiàn)這個節(jié)點(diǎn)集的定義。NodeList用于表示有順序關(guān)系的一組節(jié)點(diǎn),比如某個節(jié)點(diǎn)的子節(jié)點(diǎn)序列。N
62、odeList中的每個item都可以通過一個索引來訪問,該索引值從0開始。另外,它還出現(xiàn)在一些方法的返回值中,例如GetNodeByName。方法列表:1)getLength() 可獲取NodeList對象共有多少節(jié)點(diǎn),即節(jié)點(diǎn)的個數(shù);2)item(int) 返回參數(shù)制定的節(jié)點(diǎn)對象,參數(shù)是節(jié)點(diǎn)對象的索引值。4.Element接口Element接口是從Node接口繼承過來的,它代表了XML文檔中的元素。Element接口提供了訪問DOM樹中元素內(nèi)容與信息的途徑,并給出了對DOM樹中的元素進(jìn)行遍歷的支持。方法列表:1)getElementsByTagName(St
63、ring) 通過標(biāo)簽名稱獲取元素;2)getTagName() 獲取元素的標(biāo)簽的名稱;3)getAttributes(String) 獲取元素的屬性,是屬性對象列表,屬于NamedNodeMap;4)getAttributeNode(String) 通過屬性的名字得到一個屬性類型節(jié)點(diǎn)。5NamedNodeMap屬性列表對象NamedNodeMap對象可以獲取元素的屬性列表,因?yàn)橐粋€元素可能擁有多個屬性??梢允褂胓etAttributes獲取屬性列表。下面我們通過一個實(shí)例來說
64、明如何使用上述對象和方法來解析一個XML文檔【例10.3】使用DOM對象和方法訪問XML文件的元素與屬性,code10_3.java。XML文件為code10_1.xml,顯示結(jié)果如圖10.9import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*; public class code10_3 static Document document; public static void main(String args) if(ar
65、gs.length!=1) System.out.println("加載xml file"); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try DocumentBuilder db=dbf.newDocumentBui
66、lder(); /讀入XML文檔 document=db.parse(new File(args0); /獲得根元素 Node root=document.getDocumentElement(); /獲得根元素的子節(jié)點(diǎn)列表 NodeList childs=root.getChildNodes();
67、 GetElement(childs); catch(SAXException se) /解析過程錯誤 Exception e=se; if(se.getException()!=null) e=se.getException();
68、0; e.printStackTrace(); catch(ParserConfigurationException pe) /解析器設(shè)定錯誤 pe.printStackTrace(); catch(IOException ie) /文件處理錯誤
69、60; ie.printStackTrace(); public static void GetElement(NodeList childs) int i=0; if(childs.getLength()=0) /該節(jié)點(diǎn)沒有子節(jié)點(diǎn)
70、160; System.out.println("該節(jié)點(diǎn)沒有子節(jié)點(diǎn)!"); for(i=0;i<childs.getLength();i+) /獲取第i個子節(jié)點(diǎn)
71、160; Node node=childs.item(i); /獲取節(jié)點(diǎn)的類型,可以是ElementNode,TextNode,DocumentNode等 short nodetype=node.getNodeType();
72、160; /*ElementNode類型的節(jié)點(diǎn)可包含子節(jié)點(diǎn)和屬性等*/ if(nodetype=Node.ELEMENT_NODE) /得到節(jié)點(diǎn)名稱
73、60; String name=node.getNodeName(); String attrValue="",attrName="" System.out.println("this is element! name is:"+name);
74、; if(node.hasAttributes() /*取出一個元素的屬性,得到的是一個屬性對象列表(NameNodeMap),在此因?yàn)閤ml文檔中元素只有一個屬性,所以只取NameNode
75、Map中的第“0”個值。*/ Node attrNode=node.getAttributes().item(0); /*取出該屬性節(jié)點(diǎn)的Name和Value,即是一個ElementNode的屬性名稱和屬性值*/
76、160; attrName=attrNode.getNodeName(); attrValue=attrNode.getNodeValue(); System.out.println("this eleme
77、nt attr is:"+attrValue+"attrnameis:"+attrName); /如有子節(jié)點(diǎn),遞歸調(diào)用GetElement() if(node.hasChi
78、ldNodes() GetElement(node.getChildNodes(); /*Text類型節(jié)點(diǎn)沒有子節(jié)點(diǎn),節(jié)點(diǎn)名為#text,節(jié)點(diǎn)的值為xml文檔中元素的值*/
79、60; if(nodetype=Node.TEXT_NODE) /該節(jié)點(diǎn)的name是"#text" String txtName=node.getNodeName(); /取出Text類型節(jié)點(diǎn)的值 Node thisparent=node.getParentNode(); Node txtNode=th
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高二化學(xué)同步課堂課件(人教版2019選擇性必修1)第二節(jié) 水的電離和溶液的pH 第3課時
- 眼科患者關(guān)懷護(hù)理
- 推廣咨詢費(fèi)合同范本
- 2025至2030年中國旋翼濕式防滴漏水表數(shù)據(jù)監(jiān)測研究報告
- 安徽小學(xué)英語試卷
- 浙江國企招聘2024溫州市洞頭區(qū)機(jī)關(guān)事業(yè)單位(國企)第五期招聘13人筆試參考題庫附帶答案詳解
- 公務(wù)員保密知識
- 有機(jī)化學(xué)第九章羧酸及取代羧酸課件
- 2025年中國蛋糕紙杯市場調(diào)查研究報告
- 二零二五年度無固定期限勞動合同解除賠償金計(jì)算及執(zhí)行細(xì)則
- 車間主任考核表實(shí)用文檔
- 提高領(lǐng)導(dǎo)干部的溝通能力
- 《航空公司服務(wù)質(zhì)量改善研究8800字(論文)》
- GB/T 9124-2010鋼制管法蘭技術(shù)條件
- GB/T 4117-2008工業(yè)用二氯甲烷
- FZ/T 07019-2021針織印染面料單位產(chǎn)品能源消耗限額
- 人教PEP版英語五年級下冊第四單元全部課件
- 硬筆書法 社團(tuán)教案
- 中國膿毒癥及膿毒性休克急診治療指南
- 工序標(biāo)準(zhǔn)工時及產(chǎn)能計(jì)算表
- 人教版體育與健康四年級-《障礙跑》教學(xué)設(shè)計(jì)
評論
0/150
提交評論