基于java的xml解析類parser的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于java的xml解析類parser的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于java的xml解析類parser的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于java的xml解析類parser的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

基于java的xml解析類parser的設(shè)計(jì)與實(shí)現(xiàn)

1web應(yīng)用程序解析在當(dāng)前的網(wǎng)絡(luò)環(huán)境下,分析xml文件的工作量正在進(jìn)行中。我們總是使用某個(gè)搜索引擎在互聯(lián)網(wǎng)這個(gè)巨量信息庫里檢索信息,如Google和Yahoo等,提高了工作效率。我們之所以能夠享受搜索引擎帶來的方便快捷,是與一種可稱為網(wǎng)絡(luò)蜘蛛(Spider)的軟件的使用分不開的,運(yùn)行的Spider不斷在網(wǎng)上通過鏈接巡游,并且對訪問的HTML文檔進(jìn)行解析記錄。目前市場上存在一些HTML解析器,有時(shí)它們不能很好地滿足各自要求,這就要求用戶自己進(jìn)行編程對HTML文檔進(jìn)行解析。Java語言作為一種流行的網(wǎng)絡(luò)編程工具,在一定程度上提供解析HTML文檔的功能。本文以下兩部分就使用Java進(jìn)行HTML解析的主要技術(shù)和具體實(shí)現(xiàn)過程主要環(huán)節(jié)進(jìn)行了探討和研究,并給予相應(yīng)的重點(diǎn)提示。2相關(guān)技術(shù)2.1文件的獲取和獲取主要的HTML解析類Parser是HTMLEditorKit類的內(nèi)部類,包含在Swing包中。其是一個(gè)抽象類,使用它進(jìn)行工作關(guān)鍵在于將類Parser進(jìn)行實(shí)例化。Java對類Parser實(shí)行如此包裝并沒用考慮到外部解析HTML的功能需求,似乎產(chǎn)生了一些負(fù)面影響,可是我們可以使用HTMLEditorKit.Parser類實(shí)例化的方法,這種唯一的方法是通過重載HTMLEditorKit類的getParser方法來實(shí)例化HTMLEditorKit.Parser對象,從而實(shí)現(xiàn)其public訪問性。實(shí)現(xiàn)訪問Swing的HTML解析器的類HTMLParse定義文件HTMLParse.java如下:這個(gè)類的實(shí)例從Reader讀取HTML文檔,并在文檔中尋找五種標(biāo)簽:開始標(biāo)簽、結(jié)束標(biāo)簽、空標(biāo)簽、文本和注釋,它們涵蓋了普通HTML文件的所有重要部分。每次解析器看到這五個(gè)標(biāo)簽之一時(shí),它就會(huì)調(diào)用相應(yīng)的回調(diào)方法,回調(diào)方法在javax.swing.text.html.HTMLEditorKit.ParserCallback類中的定義。為了解析一個(gè)HTML文件,用戶寫一個(gè)回應(yīng)文本和標(biāo)簽的HTMLEditorKit.ParserCallback子類,然后傳遞一個(gè)用戶子類的實(shí)例到HTMLEditorKit.Parser的parse方法中,待處理的HTML文件的Reader對象將一同作為參數(shù)傳遞,parse方法的第三個(gè)參數(shù)用于指定示否注意文檔的字符集,一般取true。StringReaderr=newStringReader(...htmlstring...);HTMLEditorKit.Parserparse=newHTMLParse().getParser();parser.parse(r,callback,true);通過調(diào)用HTMLEditorKit的getParser方法來實(shí)現(xiàn)Parser對象的是例化,該方法沒有公共訪問接口,在子類中重載getParser使之成為公共成員函數(shù)。獲得了Parser類,就可以調(diào)用其parse方法,parse方法只是HTMLEditorKit.Parser類的公用方法,所有這些都是在HTMLEditorKit.ParserCallback子類的回調(diào)方法內(nèi)部處理的。Parse()只是簡單地從Reader中讀取數(shù)據(jù)直到讀完整個(gè)文檔,每次看到標(biāo)簽、注釋或者文本,都會(huì)調(diào)用HTMLEditorKit.ParserCallback實(shí)例的相關(guān)回調(diào)方法。HTMLEditorKit.Parser和HTMLEditorKit.ParserCallback實(shí)例都是獨(dú)立閱讀器的,可以解析多個(gè)文件,只是調(diào)用Parse()多次。對于HTML數(shù)據(jù)流中的每個(gè)種類的標(biāo)簽(tag)都會(huì)反復(fù)調(diào)用callback對象。以下討論P(yáng)arserCallback類的結(jié)構(gòu)。2.2使用使用到了一個(gè)調(diào)調(diào)劑ParserCallback是HTMLEditorKit內(nèi)的公用內(nèi)部類,必須使用ParserCallback類創(chuàng)建將用到的解析器,構(gòu)建ParserCallback類的子類就是實(shí)現(xiàn)對待處理的文件進(jìn)行解析,通過重載handleComment,handleEndTag,handleError,handleSimpleTag,handleStartTag,和handleText方法,在文檔解析時(shí)響應(yīng)輸入流中的具體項(xiàng)目:publicvoidhandleComment(chardata,intpos)publicvoidhandleEndTag(HTML.Tagt,intpos)publicvoidhandleError(StringerrorMsg,intpos)publicvoidhandleSimpleTag(HTML.Tagt,MutableAttributeSeta,intpos)publicvoidhandleStartTag(HTML.Tagt,MutableAttributeSeta,intpos)publicvoidhandleText(chardata,intpos)就幾個(gè)我們將使用到的回調(diào)方法說明如下:publicvoidhandleSimpleTag(HTML.Tagt,MutableAttributeSeta,intpos)當(dāng)處理到HTML文檔中的中的簡單標(biāo)簽時(shí),解析器調(diào)用handleSimpleTag方法,參數(shù)t指代定位到的標(biāo)簽,a包含有屬性列表,參數(shù)pos指示當(dāng)前位置。簡單標(biāo)簽有時(shí)也是結(jié)束標(biāo)簽,解析器解析到那種被認(rèn)為是簡單或未知標(biāo)簽的結(jié)尾標(biāo)簽時(shí),將調(diào)用handleSimpleTag方法。判別標(biāo)簽是否為結(jié)尾標(biāo)簽或真正的簡單標(biāo)簽的唯一途徑,是檢查標(biāo)簽中是否存在HTML.Attribute.ENDTAG屬性,只有結(jié)尾標(biāo)簽才包含該屬性。publicvoidhandleStartTag(HTML.Tagt,MutableAttributeSeta,intpos)當(dāng)處理到HTML文檔中的中的開始標(biāo)簽時(shí),解析器調(diào)用handleStartTag方法,參數(shù)t指代定位到的a包含有屬性列表,參數(shù)pos指示當(dāng)前位置。publicvoidhandleText(chardata,intpos)當(dāng)處理到HTML文檔中的文本(TEXT,包括HTML文檔中的任何顯示文本)時(shí),解析器調(diào)用handleTex方法。其中參數(shù)data中包含了當(dāng)前的文本,參數(shù)pos指示當(dāng)前的位置。例如data字符數(shù)組中數(shù)據(jù)為“Yahoo”,那么pos=2時(shí)data[pos]對應(yīng)的字符為“h”。2.3標(biāo)簽的提取HTML.Tag類是公共內(nèi)部類,用來表示HTML標(biāo)簽,將被傳遞到ParserCallback類提供的回調(diào)方法中。HTML.Tag類提供四種方法來返回關(guān)于標(biāo)簽的基本信息,它們是:publicbooleanbreaksFlow()若標(biāo)簽產(chǎn)生一個(gè)分行標(biāo)志,則返回truepublicbooleanisBlock()若標(biāo)簽產(chǎn)生一個(gè)分段標(biāo)志,則返回truepublicbooleanisPreformatted()若標(biāo)簽表示應(yīng)當(dāng)保留的空格,則返回truepublicStringtoString()將標(biāo)簽名轉(zhuǎn)換為字符串,以便處理用戶通常只是想了解標(biāo)簽的類型,為了達(dá)到此目的,可以使用HTML.Tag中預(yù)定義的標(biāo)簽常量來處理,包含了75個(gè)能為HTMLEditorKit.Parser識別的標(biāo)簽常量,通過HTMLEditorKit.Parser傳遞到回調(diào)方法的HTML.Tag元素,都是這75個(gè)對象中的一個(gè)。例如:判別變量t中的標(biāo)簽是否為H1標(biāo)簽,使用的代碼為:if(t==HTML.Tag.H1)2.4在網(wǎng)頁中的實(shí)現(xiàn)特定標(biāo)簽具有不同的屬性,處理HTML文件離不開對標(biāo)簽屬性的了解。HandleSimpleTag()和handleStartTag()回調(diào)方法的第二個(gè)參數(shù)是javax.swing.text.MutableAttributeSet類的一個(gè)實(shí)例,這個(gè)對象允許用戶察看什么屬性依附在指定標(biāo)簽上,代表了HTML標(biāo)簽上的屬性集合。HTML.Attribute類定義了80個(gè)能為HTMLEditorKit.Parser識別的標(biāo)準(zhǔn)屬性常量(HTML.Attribute.ACTION,HTML.Attribute.ALIGN和HTML.Attribute.HREF等等)。MutableAttributeSet類是javax.swing.text.AttributeSet接口的子接口,這些接口聲明了相關(guān)的方法,詳情參看有關(guān)資料。例如:檢索MutableAttributeSet對象a中的HREF屬性,使用的代碼是:Stringvalue=a.getAttribute(HTML.Attribute.HREF);3實(shí)現(xiàn)問題本文實(shí)現(xiàn)了讀入一個(gè)網(wǎng)頁HTML文件的URL地址,如123.com/campus.htm,或者一個(gè)本地HTML文件地址,如“file:/d:/Example/Page1.html”,通過使用以上研究過的技術(shù)將網(wǎng)頁中的超級鏈接名和相應(yīng)的地址解析出來,分別對應(yīng)存入兩個(gè)Collection對象workname和workurl容器中。其中要特別注意在HTMLEditorKit.Parser使用parse()方法調(diào)用HTMLEditorKit.ParserCallback類對象的回調(diào)方法處理標(biāo)記、文本等邏輯順序和超級鏈接名與其URL一一對應(yīng)的問題。3.1數(shù)據(jù)庫的生成和應(yīng)用要成功地實(shí)現(xiàn)對網(wǎng)頁HTML文件的解析,必須文檔通過輸入流讀入閱讀器對象Reader中,首先通過抽象類URLConnection建立與URL指定的數(shù)據(jù)源的動(dòng)態(tài)鏈接。再實(shí)現(xiàn)HTMLEditorKit.Parser類和HTMLEditorKit.ParserCallback類的實(shí)例化,最后使用HTMLEditorKit.Parser對象的parse()方法。以下代碼就是實(shí)現(xiàn)這些功能。3.2在文本中生成目標(biāo)文本HTMLEditorKit.Parser對象在解析HTML文件的時(shí)候,通常是按照HTML文檔源文件中的字符順序進(jìn)行處理,遇到不同的字符將會(huì)調(diào)用相應(yīng)的回調(diào)方法,在此我們考慮標(biāo)簽和文本的問題,其實(shí)HTML文件中的鏈接名同樣是作為文本TEXT處理的。我們在回調(diào)方法handleSimpleTag方法中試圖取得標(biāo)簽(文本除外)的鏈接URL,所以處理過程中每次遇到開始標(biāo)簽和簡單標(biāo)簽時(shí),總是希望取得相應(yīng)的URL,而對于標(biāo)簽<h1>和<br>等,讀到的字符串為null,在此情況下使handleSimpleTag方法返回,否則將不會(huì)正常工作。類HandleStartTag方法只是調(diào)用了handleSimpleTag方法。再者,這里是簡單的示例,要求將網(wǎng)頁HTML文件中的超級鏈接名及其URL對應(yīng)讀出,我們在ParserCallback類中定義一個(gè)用于同步的布爾變量,只要handleSimpleTag方法處理到標(biāo)簽<ahref>就使isLink值為真true。然后HTMLEditorKit.Parser對象處理到超級鏈接名文本時(shí),調(diào)用回調(diào)方法handleText時(shí),只有當(dāng)isLink值為真true時(shí)的文本讀出,處理完此文本后自動(dòng)isLink復(fù)位false值,從而實(shí)現(xiàn)它們一一對應(yīng)的關(guān)系。以下是我們用到的ParserCallback類定義(省去某些回調(diào)方法):4文件解析算法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論