简述通过Java解析HTML文档简述通过Java解析HTML文档2011-04-01 09:14:05摘要JAVA 语言是目前Internet 上大型的WEB 应用程序开发时使用得最热门的编程语言,本文从实践的角度重点阐述Java 语言中输入流类StreamTokenizer 在编写HTML 文件分析程序中的应用。
关键词:java html StreamTokenzer HtmlTokenizer Applet 计算机摘要JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文从实践的角度重点阐述Java语言中输入流类StreamTokenizer在编写HTML文件分析程序中的应用。
关键词:java html StreamTokenzer HtmlTokenizer Applet计算机信息技术已经渗透到人们生活的方方面面,网络信息已成为我们日常信息主要来源之一。
而这些信息时如何在这神奇的网络上体现出的呢,这些网站是如何用机器语言编辑的等等。
弄明白这些的方法很多,在这将通过java简单解析html文件,并举实例进行说明。
1 Java语言的概述1.1 Java语言的主要特点Java语言是一种适用于网络编程的语言,它的基本结构与C++极为相似,但却简单得多。
它集成了其它一些语言的特点和优势,又避开了它们的不足之处。
Java的主要特点有:简单性、平台独立性、面向对象的技术、多线程、动态性、安全性、高性能、分布性、强大性、解释性、可移植性等。
1.2 Java解析Html工具Java HTML Parser提供了一组Tag对象,这些对象可以深入解析一棵可搜索的结构树。
HtmlRipper是一个Java包能够按照预先定义好的规则设置来从Web页中抽取动态数据.Cobra是一个HTML工具包。
它包含一个纯Java HTML DOM 分析器和一个页面表现引擎。
Cobra支持HTML4,Javascript 和CSS2。
Java Mozilla Html Parser能够将html解析成Java Document对象。
它是一个基于Mozilla Html解析器封装的Html解析类库。
因此能够为开发人员提供一个浏览器质量的HTML解析器。
1.3 Java Applet通常翻译为Java小应用程序,也称Java小程序,它不是能独立运行的Java程序,而是通过支持Java浏览器来运行的Java程序。
在Java语言刚刚出现的时候,Java最吸引人的就是JavaApplet,用来创建WWW上的页面。
2 HTML语言剖析HTML全名为Hyper Text Markup Language,中文译为超文本标记语言,这是创建网页的脚本语言,它提供了精简而有力的文本定义,使我们可以设计出多姿多彩的超媒体文本(Hypermedia Document),通过HTTP(Hyper Text Teansfer Protocol)通信协议,是的HTML文本可以在全球互联网(World Wide Web,WWW)上进行跨平台的文件交换。
HTML文件为纯文本的文件格式,可以用任何文本编辑器或者用FrontPage、Dreamweaver等Web开发制作工具来编辑。
至于文件中的文字、字体、字体大小、段落、图片、表格及超级链接,甚至是文本名称都是以不同意的标记(Tags)来描述,以此来定义文件的结构与文件间的逻辑关联。
简而言之,HTML是以标记来描述文件中的多媒体信息。
3 Web与HTML互联关系Web服务器的核心是对HTML文件中的各标记(Tag)作出正确的分析,一种编程语言的解释程序也是对源文件中的保留字进行分析再做解释的。
实际应用中,我们也常常会遇到需要对某一特定类型文件进行关键字分析的情况,比如,需要将某个HTML文件下载并同时下载与之相关的.gif、.class等文件,此时就要求对HTML文件中的标记进行分离,找出所需的文件名及目录。
利用Java的输入流类StreamTokenizer进行HTML文件的分析,效果较好。
在此,我们要实现从已知的Web页面下载HTML文件,对其进行分析后,下载该页面中包含的HTML文件(如果在Frame 中)、图像文件和Class(Java Applet)文件。
4 程序实现4.1 编写嵌入java小程序字节码文件的html文档通过html的标记符可以把编译形成的字节码文件app2.class嵌入到html文档中。
其最基本的形式为:其中,code属性指明了所要加载的字节码文件,它与网页在同一个文件夹下:width和height属性分别给出了Applet显示区域的宽和高,单位为像素。
使用Windows的记事本,键入下面的html源文件:并将网页文件保存在字节按在的目录下,文件名可任意命名,例如page.htm。
这样就把小程序字节码文件App2.class嵌入到网页page1.htm中。
4.2 利用Java实现HTML的编辑首先要有一个编辑框,这个编辑框其实就是一个可编辑状态的网页,我们用iframe来建立编辑框。
并且在加上javascript代码来指定HtmlEdit有编辑功能:var editor;editor =document.getElementById("HtmlEdit").contentWindow;//只需键入以下设定,iframe立刻变成编辑器。
editor.document.designMode = 'On';editor.document.contentEditable = true;//但是IE与FireFox有点不同,为了兼容FireFox,所以必须创建一个新的document。
editor.document.open();editor.document.writeln('');editor.document.close(); //字体特效-加粗方法一function addBold(){editor.focus(); //所有字体特效只是使用execComman()就能完成。
editor.document.execCommand("Bold", false, null);}//字体特效-加粗方法二function addBold(){editor.focus(); //获得选取的焦点var sel = editor.document.selection.createRange(); insertHTML(""+sel.text+"");}function insertHTML(html){if (editor.document.selection.type.toLowerCase() != "none"){editor.document.selection.clear() ;}editor.document.selection.createRange().pasteHTML(html ) ;}4.3 对某个令牌流进行分析之前,首先应对该令牌流的语法表进行设置,在本例中,即是让程序分出哪个单词是HTML 的标记。
import java.io.*;import ng.String;class HtmlTokenizer extends 好论文123StreamTokenizer {//定义各标记,这里的标记仅是本例中必须的,可根据需要自行扩充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('标记两边的分割符this.ordinaryChar('>');} //end of constructorpublic int nextHtml(){int token; //令牌try{switch(token=this.nextToken()){case StreamTokenizer.TT_EOF://如果已读到流的尽头,则返回TT_EOFreturn 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) //标记FRAMEreturn HTML_FRAME;else if(sval.toUpperCase().indexOf("IMG")!=-1 && !outsideTag) //标记IMGreturn HTML_IMAGE;else if(sval.toUpperCase().indexOf("BACKGROUND") !=-1 && !outsideTag) //标记BACKGROUNDreturn HTML_BACKGROUND;else if(sval.toUpperCase().indexOf("APPLET")!=-1 && !outsideTag) //标记APPLETreturn 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 nextHtmlprotected boolean allWhite(String s){//过滤所有空格//实现略}// end of allWhite} //end of class5 程序调试心得5.1 Java是严格区分大小写的,但html标记语言并不区分别大小写,因此除嵌入的字节码文件名大小写必须与编译后的文件名一致外,其他标记符大小写都可以。