麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

用Java編寫HTML文件分析程序

2019-11-18 13:27:45
字體:
來源:轉載
供稿:網友

  一、概述
    
    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。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一区二区三区小视频 | 久久久一区二区三区视频 | 69性欧美高清影院 | 国产精品成aⅴ人片在线观看 | 久久久精品视频免费看 | 国产精品自拍啪啪 | 天天透天天狠天天爱综合97 | 91美女福利视频 | 久久精品网 | 免费高清一级欧美片在线观看 | 桥本有菜免费av一区二区三区 | 久久久久久久久国产 | 午夜a狂野欧美一区二区 | 激情网站免费观看 | 久久毛片| 成人区一区二区三区 | 日韩精品中文字幕一区二区三区 | 99精品视频在线免费观看 | 成人男女激情免费视频 | 美女黄色毛片免费看 | 久久最新视频 | 亚洲一区二区三区精品在线观看 | 91久久国产综合精品女同国语 | 久久99久久99免费视频 | 一级视频网站 | 粉嫩粉嫩一区二区三区在线播放 | 99精品视频在线看 | 性少妇videosexfreexx入片 | 国产一区二区三区四区五区精品 | 私库av在线免费观看 | 免费在线观看毛片 | 国产91一区二区三区 | 欧美日本一 | 超碰97最新 | 日韩电影一区二区三区 | 欧美一级一区二区三区 | 久久久无码精品亚洲日韩按摩 | 福利免费在线 | 欧美成人免费小视频 | 国产精品自在线拍 | 欧洲成人av |