参考文档:http://allenj2ee.iteye.com/blog/222457 ,希望与大家分享
从简单方面的理解,Filter是根据某种条件过滤取出需要的Node再进行处理。Visitor则是遍历内容树的每一个节点,对于符合条件的节点进行处理
。实际的结果异曲同工,两种不同的方法可以达到相同的结果:
1、
package html;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.htmlparser.Parser;
import org.htmlparser.Remark;
import org.htmlparser.Tag;
import org.htmlparser.Text;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.NodeVisitor;
public class TestVisitor {
public static void testVisitor (String url){
try {
//==============连接方法一 ==================
URL l_url = new java.net.URL(url);
HttpURLConnection l_connection =(HttpURLConnection) l_url.openConnection();
//通过指定URLConnection对象创建Parser对象
Parser parser = new Parser(l_connection);
//==============连接方法二 ==================
//建立连接
// HttpURLConnection l_connection =(HttpURLConnection) l_url.openConnection();
//通过指定URLConnection对象创建Parser对象
// Parser parser = new Parser();
// parser.setURL(url);
parser.setEncoding(parser.getEncoding());
NodeVisitor visitor = new NodeVisitor (true, false){
public void visitTag(Tag tag){
System.out.println("tagname="+tag.getTagName()+"--text="+tag.getText()+"--
class="+tag.getPage());
}
public void visitStringNode (Text string) {
System.out.println("This is Text:"+string);
}
public void visitRemarkNode (Remark remark) {
System.out.println("This is Remark:"+remark.getText());
}
public void beginParsing () {
System.out.println("beginParsing");
}
public void visitEndTag (Tag tag){
System.out.println("visitEndTag:"+tag.getText());
}
public void finishedParsing () {
System.out.println("finishedParsing");
}
};
parser.visitAllNodesWith(visitor);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
testVisitor("http://www.hao123.com/");
}
}
2、可以看到,开始遍历所以的节点以前,beginParsing先被调用,然后处理的是中间的Node,最后在结束遍历以前,finishParsing被调用。因为我
设置的 recurseChildren和recurseSelf都是false,所以Visitor没有访问子节点也没有访问根节点的内容。
3、先把recurseSelf设置成true,看看会发生什么。
NodeVisitor visitor = new NodeVisitor( false, true) {
可以看到,HTML页面的第一层节点都被调用了。
4、我们再用下面的方法调用看看:
NodeVisitor visitor = new NodeVisitor( true, false)
可以看到,所有的子节点都出现了,除了刚刚例子里面的两个最上层节点This is Tag:head和This is Tag:html
想让它们都出来,只需要
NodeVisitor visitor = new NodeVisitor( true, true) {