首先简单的介绍一下jsoup,jsoup是一款Java的HTML解析器,Jsoup可以将HTML转换成一个org.jsoup.nodes.Document对象,然后从Document对象中取出想要的元素。
在此附上jsoup的文档地址:Jsoup官方中文文档
首先引入jsoup
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
使用Jsoup将Html的标签由嵌入式改为内联式的思路是先将html解析成document,然后就可以很方便地获取到document中的元素信息,再将原本写在head中的标签样式以key,value的形式存到map中,之后再获取到body内行上面的class信息,将这些class全部替换成map中的value即可,下面附上一个简单的demo以供参考,代码中有详细的注释。
/**
* 将写在head中的样式写入行内,变成内联式标签
* @param html 原本需要替换的html
* @return 替换之后的html
*/
public String headCssToLineCss(String html) {
//将html转成Document
org.jsoup.nodes.Document doc = Jsoup.parse(html);
//获取其中的style的内容
String allcss = doc.getElementsByTag("style").html();
//使用正则将所有的标签信息以key,value的形式放入map
Map<String, String> styleMap = new HashMap<>();
Pattern pattern = Pattern.compile("\\.(\\w+)\\{(?s)(.+?)\\}");
Matcher matcher = pattern.matcher(allcss);
while (matcher.find()) {
styleMap.put(matcher.group(1), matcher.group(2));
}
//进行转换
String repalcedHtml = replaceClass(styleMap,html);
return repalcedHtml;
}
/**
* 替换方法
* @param styMap 嵌入式标签的名字,内容组成的map
* @param html html信息
* @return 替换完成之后的html
*/
private static String replaceClass(Map<String, String> styMap, String html) {
org.jsoup.nodes.Document doc = Jsoup.parse(html);
//获取body内的行上面的class
Elements anyClass = doc.getElementsByAttribute("class");
for (Element element : anyClass) {
String aClass = element.attr("class");
String[] classStrs = (aClass.split(" "));
//对所有的class进行替换
for (String classStr : classStrs) {
element.attr("style", element.attr("style") + styMap.get(classStr));
}
element.removeAttr("class");
}
//返回替换之后的html
return doc.toString();
}