buttonChan 2014-03-02
项目中需要实现一个功能,即将html中标签的style属性值,提取出单独的css文件。
目前已有相关的网站实现: extractcss.com
虽然开源,但是它是通过js实现,而且用到了jquery。
本文将讨论如何在java中实现类似的功能,由于项目的需要,所以只实现一部分功能(class选择器)。
该功能用到了Java中拥有类似于JQuery选择器功能的html解析工具Jsoup: http://jsoup.org/
实现的方法如下:
/** * 从html中获取出css文本 * 参考extractCss网站 * 借助于Js * @param html 含有style格式的html文本 * @return 提取出的css文本 */ public static String extractCss(String html){ Set<String> allClasses = new HashSet<String>(); // 初始化参数 StringBuffer resultCss = new StringBuffer(); org.jsoup.nodes.Document doc = Jsoup.parse(html); //获取html对象 Elements classes = doc.select("*[class]"); for(Iterator<Element> ite = classes.iterator(); ite.hasNext();){ Element element = ite.next(); String splits[] = element.attr("class").split(" "); for(int i=0; i< splits.length; i++){ allClasses.add(splits[i]); if(i==splits.length-1){ Elements children = doc.select("."+splits[i]+"> *"); for(Iterator<Element> tor = children.iterator(); tor.hasNext();){ Element e = tor.next(); if(!e.hasAttr("class")){ //如果没有定义class属性 allClasses.add(splits[i]+" > "+e.tagName().toLowerCase()); } } } } } for(String clss: allClasses){ Elements element = doc.select("."+clss); if(element.hasAttr("style")){ resultCss.append("."+clss+"{"+element.attr("style")+"}"); } } return resultCss.toString(); }