91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用Java編寫HTML文件分析程序(轉)

發布時間:2020-08-11 16:27:03 來源:ITPUB博客 閱讀:163 作者:BSDLite 欄目:編程語言
利用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。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万年县| 富蕴县| 七台河市| 阿城市| 克东县| 突泉县| 安平县| 佳木斯市| 兴和县| 吉水县| 抚松县| 进贤县| 张家口市| 小金县| 青川县| 七台河市| 社会| 正阳县| 文化| 合江县| 绥芬河市| 梓潼县| 额敏县| 乌拉特前旗| 新郑市| 昌江| 中卫市| 高雄县| 皋兰县| 乾安县| 铁岭县| 额尔古纳市| 棋牌| 关岭| 璧山县| 枣阳市| 滨州市| 明水县| 阿勒泰市| 揭阳市| 保康县|