利用Java編寫HTML檔案分析程式(轉)
利用Java編寫HTML檔案分析程式(轉)[@more@]摘要:本文從實踐的角度重點闡述Java語言中輸入流類StreamTokenizer在編寫HTML檔案分析程式中的應用,並介紹了以位元組為單位下載Web頁面的例程。
一、概述
Web伺服器的核心是對HTML檔案中的各標記(Tag)作出正確的分析,一種程式語言的解釋程式也是對原始檔中的保留字進行分析再做解釋的。實際應用中,我們也常常會遇到需要對某一特定型別檔案進行關鍵字分析的情況,比如,需要將某個HTML檔案下載並同時下載與之相關的.gif、.class等檔案,此時就要求對HTML檔案中的標記進行分離,找出所需的檔名及目錄。在Java出現以前,類似工作需要對檔案中的每個字元進行分析,從中找出所需部分,不僅程式設計量大,且易出錯。筆者在近期的專案中利用Java的輸入流類StreamTokenizer進行HTML檔案的分析,效果較好。在此,我們要實現從已知的Web頁面下載HTML檔案,對其進行分析後,下載該頁面中包含的HTML檔案(如果在Frame中)、影像檔案和Class(Java Applet)檔案。
二、StreamTokenizer類
StreamTokenizer即令牌化輸入流的作用是將一個輸入流中變成令牌流。令牌流中的令牌實體有三類:單詞(即多字元令牌)、單字元令牌和空白(包括Java和C/C++中的說明語句)。
StreamTokenizer類的構造器為: StreamTokenizer(InputStream in)
該類有一些公有例項變數:ttype、sval和nval ,分別表示令牌型別、當前字串值和當前數字值。當我們需要取得令牌(即HTML中的標記)之間的字元時,應訪問變數sval。而讀向下一個令牌的方法是呼叫nextToken()。方法nextToken()的返回值是int型,共有四種可能的返回:
StreamTokenizer.TT_NUMBER: 表示讀到的令牌是數字,數字的值是double型,可以從例項變數nval中讀取。
StreamTokenizer.TT_WORD: 表示讀到的令牌是非數字的單詞(其他字元也在其中),單詞可以從例項變數sval中讀取。
StreamTokenizer.TT_EOL: 表示讀到的令牌是行結束符。
如果已讀到流的盡頭,則nextToken()返回TT_EOF。
開始呼叫nextToken()之前,要設定輸入流的語法表,以便使分析器辨識不同的字元。WhitespaceChars(int low, int hi)方法定義沒有意義的字元的範圍。WordChars(int low, int hi)方法定義構造單詞的字元範圍。
三、程式實現
1、HtmlTokenizer類的實現
對某個令牌流進行分析之前,首先應對該令牌流的語法表進行設定,在本例中,即是讓程式分出哪個單詞是HTML的標記。下面給出針對我們需要的HTML標記的令牌流類定義,它是StreamTokenizer的子類:
import java.io.*;
import java.lang.String;
class HtmlTokenizer extends
StreamTokenizer {
//定義各標記,這裡的標記僅是本例中必須的,
可根據需要自行擴充
static int HTML_TEXT=-1;
static int HTML_UNKNOWN=-2;
static int HTML_EOF=-3;
static int HTML_IMAGE=-4;
static int HTML_FRAME=-5;
static int HTML_BACKGROUND=-6;
static int HTML_APPLET=-7;
boolean outsideTag=true; //判斷是否在標記之中
//構造器,定義該令牌流的語法表。
public HtmlTokenizer(BufferedReader r) {
super(r);
this.resetSyntax(); //重置語法表
this.wordChars(0,255); //令牌範圍為全部字元
this.ordinaryChar('< '); //HTML標記兩邊的分割符
this.ordinaryChar('>');
} //end of constructor
public int nextHtml(){
int token; //令牌
try{
switch(token=this.nextToken()){
case StreamTokenizer.TT_EOF:
//如果已讀到流的盡頭,則返回TT_EOF
return HTML_EOF;
case '< ': //進入標記欄位
outsideTag=false;
return nextHtml();
case '>': //出標記欄位
outsideTag=true;
return nextHtml();
case StreamTokenizer.TT_WORD:
//若當前令牌為單詞,判斷是哪個標記
if (allWhite(sval))
return nextHtml(); //過濾其中空格
else if(sval.toUpperCase().indexOf("FRAME")
!=-1 && !outsideTag) //標記FRAME
return HTML_FRAME;
else if(sval.toUpperCase().indexOf("IMG")
!=-1 && !outsideTag) //標記IMG
return HTML_IMAGE;
else if(sval.toUpperCase().indexOf("BACKGROUND")
!=-1 && !outsideTag) //標記BACKGROUND
return HTML_BACKGROUND;
else if(sval.toUpperCase().indexOf("APPLET")
!=-1 && !outsideTag) //標記APPLET
return HTML_APPLET;
default:
System.out.println ("Unknown tag: "+token);
return HTML_UNKNOWN;
} //end of case
}catch(IOException e){
System.out.println("Error:"+e.getMessage());}
return HTML_UNKNOWN;
} //end of nextHtml
protected boolean allWhite(String s){//過濾所有空格
//實現略
}// end of allWhite
} //end of class
以上方法由筆者在近期專案中測試透過,作業系統為Windows NT4,程式設計工具使用Inprise Jbuilder3。
一、概述
Web伺服器的核心是對HTML檔案中的各標記(Tag)作出正確的分析,一種程式語言的解釋程式也是對原始檔中的保留字進行分析再做解釋的。實際應用中,我們也常常會遇到需要對某一特定型別檔案進行關鍵字分析的情況,比如,需要將某個HTML檔案下載並同時下載與之相關的.gif、.class等檔案,此時就要求對HTML檔案中的標記進行分離,找出所需的檔名及目錄。在Java出現以前,類似工作需要對檔案中的每個字元進行分析,從中找出所需部分,不僅程式設計量大,且易出錯。筆者在近期的專案中利用Java的輸入流類StreamTokenizer進行HTML檔案的分析,效果較好。在此,我們要實現從已知的Web頁面下載HTML檔案,對其進行分析後,下載該頁面中包含的HTML檔案(如果在Frame中)、影像檔案和Class(Java Applet)檔案。
二、StreamTokenizer類
StreamTokenizer即令牌化輸入流的作用是將一個輸入流中變成令牌流。令牌流中的令牌實體有三類:單詞(即多字元令牌)、單字元令牌和空白(包括Java和C/C++中的說明語句)。
StreamTokenizer類的構造器為: StreamTokenizer(InputStream in)
該類有一些公有例項變數:ttype、sval和nval ,分別表示令牌型別、當前字串值和當前數字值。當我們需要取得令牌(即HTML中的標記)之間的字元時,應訪問變數sval。而讀向下一個令牌的方法是呼叫nextToken()。方法nextToken()的返回值是int型,共有四種可能的返回:
StreamTokenizer.TT_NUMBER: 表示讀到的令牌是數字,數字的值是double型,可以從例項變數nval中讀取。
StreamTokenizer.TT_WORD: 表示讀到的令牌是非數字的單詞(其他字元也在其中),單詞可以從例項變數sval中讀取。
StreamTokenizer.TT_EOL: 表示讀到的令牌是行結束符。
如果已讀到流的盡頭,則nextToken()返回TT_EOF。
開始呼叫nextToken()之前,要設定輸入流的語法表,以便使分析器辨識不同的字元。WhitespaceChars(int low, int hi)方法定義沒有意義的字元的範圍。WordChars(int low, int hi)方法定義構造單詞的字元範圍。
三、程式實現
1、HtmlTokenizer類的實現
對某個令牌流進行分析之前,首先應對該令牌流的語法表進行設定,在本例中,即是讓程式分出哪個單詞是HTML的標記。下面給出針對我們需要的HTML標記的令牌流類定義,它是StreamTokenizer的子類:
import java.io.*;
import java.lang.String;
class HtmlTokenizer extends
StreamTokenizer {
//定義各標記,這裡的標記僅是本例中必須的,
可根據需要自行擴充
static int HTML_TEXT=-1;
static int HTML_UNKNOWN=-2;
static int HTML_EOF=-3;
static int HTML_IMAGE=-4;
static int HTML_FRAME=-5;
static int HTML_BACKGROUND=-6;
static int HTML_APPLET=-7;
boolean outsideTag=true; //判斷是否在標記之中
//構造器,定義該令牌流的語法表。
public HtmlTokenizer(BufferedReader r) {
super(r);
this.resetSyntax(); //重置語法表
this.wordChars(0,255); //令牌範圍為全部字元
this.ordinaryChar('< '); //HTML標記兩邊的分割符
this.ordinaryChar('>');
} //end of constructor
public int nextHtml(){
int token; //令牌
try{
switch(token=this.nextToken()){
case StreamTokenizer.TT_EOF:
//如果已讀到流的盡頭,則返回TT_EOF
return HTML_EOF;
case '< ': //進入標記欄位
outsideTag=false;
return nextHtml();
case '>': //出標記欄位
outsideTag=true;
return nextHtml();
case StreamTokenizer.TT_WORD:
//若當前令牌為單詞,判斷是哪個標記
if (allWhite(sval))
return nextHtml(); //過濾其中空格
else if(sval.toUpperCase().indexOf("FRAME")
!=-1 && !outsideTag) //標記FRAME
return HTML_FRAME;
else if(sval.toUpperCase().indexOf("IMG")
!=-1 && !outsideTag) //標記IMG
return HTML_IMAGE;
else if(sval.toUpperCase().indexOf("BACKGROUND")
!=-1 && !outsideTag) //標記BACKGROUND
return HTML_BACKGROUND;
else if(sval.toUpperCase().indexOf("APPLET")
!=-1 && !outsideTag) //標記APPLET
return HTML_APPLET;
default:
System.out.println ("Unknown tag: "+token);
return HTML_UNKNOWN;
} //end of case
}catch(IOException e){
System.out.println("Error:"+e.getMessage());}
return HTML_UNKNOWN;
} //end of nextHtml
protected boolean allWhite(String s){//過濾所有空格
//實現略
}// end of allWhite
} //end of class
以上方法由筆者在近期專案中測試透過,作業系統為Windows NT4,程式設計工具使用Inprise Jbuilder3。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-963801/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何編寫html檔案HTML
- java寫檔案(轉)Java
- (轉)Qt之qss檔案編寫QT
- 利用VB編寫螢幕保護程式 (轉)
- java 利用FileOutputStream寫檔案(兩種方式)Java
- 用Delphi編寫點對點傳檔案程式(1) (轉)
- 用Delphi編寫點對點傳檔案程式(2) (轉)
- 自己編寫JAVA環境下的檔案上傳元件 (轉)Java元件
- 使用vs code 編寫.vue檔案實現html程式碼補全功能VueHTML
- 利用Dephi5編寫控制皮膚程式 (轉)
- 建立程式編寫demo.py檔案
- Java程式編寫Java
- 利用DELPHI編寫WINDOWS外殼 (轉)Windows
- Java(j2se)編寫的程式如何生成可執行檔案?Java
- Docker | dockerfile 檔案編寫Docker
- 配置檔案的編寫
- 利用Delphi編寫IE擴充套件 (轉)套件
- PDF檔案轉HTML方法HTML
- md檔案批次轉htmlHTML
- 利用java本地複製檔案及資料夾 (轉)Java
- [轉]高質量JAVA程式碼編寫規範Java
- JAVA程式碼編寫的30條建議(轉)Java
- 編寫跨平臺Java程式注意事項(轉)Java
- webpack輸出檔案分析以及編寫一個loaderWeb
- 日常積累——彙編檔案編寫
- 如何編寫 Typescript 宣告檔案TypeScript
- Qt之qss檔案編寫QT
- 【ROS教程】編寫launch檔案ROS
- 檢測檔案編碼,轉換檔案編碼
- 用Java編寫ASP元件 (轉)Java元件
- 【Java】手工編寫JavaWeb專案!JavaWeb
- 【Java】讀寫文字檔案Java
- 利用Java技術編寫桌面軟體基礎Java
- 編寫批處理檔案利用諾頓2967埠溢位獲得控制權
- 用Java寫一個PDF,Word檔案轉換工具Java
- 用VC6編寫登錄檔管理程式(三) (轉)
- 用VC6編寫登錄檔管理程式(二) (轉)
- HTML Email的編寫HTMLAI