html TagStream流的实现

我想对于一个html文件进行如下的处理:
1)把html里面的文本也看成tag,对于tag有三种属性,一种是开始的tag,如<body>,一种是结束的tag,比如</body>,还有一种就是封闭在对应的开始和封闭的tag的文本,比如<p>that is a p item</p>,其中that is a p item就是普通文本。
2)把html里面的所有tag(包括文本),形成一个数组,加入了hasnext(),next()方法
3)如果文本tag的isempty(),就忽略不计

如下的html:

<html>
<head>
<title>title content</title>
</head>
<body>
<font>font content</font>
<p>p content</p>
body content
</body>
</html>


形成下面的tag 流:
html>head>title>title content>/title>/head>body>font>font content>/font>p>pcontent>/p>body content>/body>/html

tag属性类:
public class Tagattribute {
/*attribute set mostly as 't':text 's':start tag 'e':end tag*/
private char attribute;
private String content;

public Tagattribute(char attribute,String content){
this.attribute = attribute;
this.content = content;
}
/*get set method*/
}



使用java.io.*;形成数组,按照数组下标读取:
package org.biti.html;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class TagStream {
private Tagattribute[] tas = null;
private int order = 0;

public static void main(String[] args){
TagStream ts = new TagStream("d:\\data\\index.html","GB2312");
while(ts.hasnext()){
Tagattribute ta = ts.next();
System.out.println(ta.getattribute()+":"+ta.getcontent());
}
}

public TagStream(String file,String charset){
InputStreamReader is;
ArrayList<Tagattribute> al = new ArrayList<Tagattribute>();
try {
is = new InputStreamReader(new FileInputStream(file),charset);
BufferedReader buffer = new BufferedReader(is);
char[] cbuff = new char[1];
StringBuffer tag = new StringBuffer();

while( buffer.read(cbuff) != -1){
char start = cbuff[0];
if(start=='<'){
String content = tag.toString();
content = content.replaceAll("^\\s+|\\s+$|\r+|\n+", "");
content = content.replaceAll(" ","");
if(!content.isEmpty()){
// System.out.println("content:"+content);
al.add(new Tagattribute('t',content));
}
tag.delete(0, tag.length());

String webtag = "";
while(buffer.read(cbuff)!=-1){
char end = cbuff[0];
if(end=='>'){
webtag = tag.toString();
break;
}
tag.append(end);
}

if(webtag.charAt(0)=='/'){
webtag = webtag.substring(1);
al.add(new Tagattribute('e',webtag));
}else{
webtag = webtag.trim().split("\\s+")[0];
al.add(new Tagattribute('s',webtag));
}
// System.out.println(webtag);

tag.delete(0, tag.length());
}else{
tag.append(start);
}
}
tas = (Tagattribute[]) al.toArray(new Tagattribute[0]);
} catch (IOException e){
e.printStackTrace();
}
}

public boolean hasnext(){
if(order<tas.length){
return true;
}
return false;
}

public Tagattribute next(){
if(order<tas.length){
Tagattribute ta = tas[order];
order++;
return ta;
}else{
return null;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值