|
另外一个关键点就在于补齐截取出来的标签,而在这之前你可能需要面对里面的一些不常用甚至没见过的标签,所以你就需要扩展标签,而这时一个叫htmlparser的开源包
则可以帮得上忙了,它里面定义了一些常用的标签你可以在读取出来后它会帮你自动补齐,但是面对一些它里面没有的标签要怎么办呢,这时你可以自己再扩展出一些属于你自
已的标签,只要继承里面的一个叫CompositeTag的容器类,然后再模仿它已经定义好的标签进行扩展,当然写好了之后不要忘了要进行标签的注册,要不然它不能识别到这些自
定义的标签,不能识别到则不会自动帮你补齐。
下面是先定义一个标签(当然,这是一个比较简单的标签):
顺便赋上一篇关于自定义标签的文章:http://blog.csdn.net/joliny/archive/2008/02/27/2124678.aspx 可以参考.
public class WbrTag extends CompositeTag{ private static final String[] mIds = {"WBR"}; private static final String[] mEndTagEnders = {"head"}; public String[] getIds() { return (mIds); } public String[] getEndTagEnders() { return (mEndTagEnders); } public String[] getEnders() { return super.getEnders(); }}
然后再进行标签的注册,这里当然可以注册多个自定义的标签:
public static void registerTags(Parser parser){ // 注册自定义的新结点解析器,这是必要的... PrototypicalNodeFactory factory = new PrototypicalNodeFactory(); factory.registerTag(new WbrTag()); parser.setNodeFactory(factory);}
然后再进行补齐:
public static String subcontent(File file,int len) { try { String html = readWithTag(file, len); Parser parser = Parser.createParser(new String(html.getBytes(), "8859_1"), ""); registerTags(parser); NodeList nodelist = parser .extractAllNodesThatMatch(new NodeFilter() { public boolean accept(Node node) { if (node instanceof CompositeTag) return true; return false; } }); String str = ""; String tmp = ""; for (int i = 0; i < nodelist.size(); i++) { CompositeTag testTag = (CompositeTag) nodelist.elementAt(i); if (testTag.getParent() == null) { //记住这里只需循环第一层就能帮你补齐的了 tmp = new String(testTag.toHtml().getBytes("8859_1")); str += tmp + "\n"; } } return str; } catch (Exception e) { return ""; }}
还有要补充一下的就是我用的htmlparser的1.5版本,它的不同版本可能有所不同,特此声明. |
|