在App应用中,我们常常会加载一些新闻、通知等内容,这些内容很多来自于数据库中存储的HTML文本,里面的标签杂乱不堪,且内容中又包括图片等。
处理这些内容,我们可以利用正则表达式来处理,但标签太多,太杂,又想保留换行等格式,正则表达式写起来麻烦,我是个懒人,于是有了更简便的方法,就是利用Jsoup来处理。示例HTML代码如下:
<p style="\"font-family:" simsun;="" font-size:="" 14px;\"=""> 记者从贵阳市旅游产业发展委获悉,国庆黄金周临近,爽爽贵阳一片秋意浓。即日起,市内各大景区景点纷纷推出各类特色国庆、中秋主题节庆活动,给市民游客带来一个丰盛的节日盛宴。</p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""><img id="\"6276046\"" title="\"\"" border="\"0\"" src="\"http://www.gywb.cn/xinwen/attachement/jpg/site2/20170927/3417eb9bc7b41b35c33901.jpg\"" sourcedescription="\"编辑提供的本地文件\"" sourcename="\"本地文件\"" data-bd-imgshare-binded="\"1\"" style="\"max-width:" 100%;="" height:="" 500px;="" width:="" 400px;\"="" /></p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""> 图为20万盆菊花扮靓花画小镇,与市民游客一起迎国庆</p> <p style="\"font-family:" simsun;="" font-size:="" 14px;\"=""> 长假期间,国家5A级旅游景区青岩古镇将开展丰富多彩的民族文艺演出,演出内容包括滚山珠、锦鸡舞等贵州非遗文化品牌节目。在状元街,知名专家将现场传授植物扎染及香囊制作工艺体验。同时,贵州饭店国际会议中心将开通“青岩古镇旅游直通车”,每天发车,贵州饭店至青岩古镇28元/人/趟、大学城至青岩古镇10元/人/趟。</p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;\"=""><img id="\"6276048\"" title="\"\"" border="\"0\"" src="\"http://www.gywb.cn/xinwen/attachement/jpg/site2/20170927/3417eb9bc7b41b35c34502.jpg\"" sourcedescription="\"编辑提供的本地文件\"" sourcename="\"本地文件\"" data-bd-imgshare-binded="\"1\"" style="\"max-width:" 100%;="" height:="" 350px;="" width:="" 500px;\"="" /></p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""> 图为20万盆菊花扮靓花画小镇,与市民游客一起迎国庆</p> <p style="\"font-family:" simsun;="" font-size:="" 14px;\"=""> 秋高气爽看10月,在乌当区花画小镇,20万盆菊花上山,穿上盛装迎接国庆中秋“双节”。此次花展将从10月1日持续至11月30日,共两个月。游客不仅可在园区“廊桥”欣赏菊花种类、食用药用价值和有关菊花的文学作品等知识展板,还可在菊展的三个展销区域,免费领取菊花茶一袋,每日限量300份。此外,还有优秀国画及书法作品,让游客近距离感受中国文化的博大精深;在菊花诗词朗诵区域,园区将为游客提供一个文化展示与才艺交流的平台。</p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""><img id="\"6276052\"" title="\"\"" border="\"0\"" src="\"http://www.gywb.cn/xinwen/attachement/jpg/site2/20170927/3417eb9bc7b41b35c35804.jpg\"" sourcedescription="\"编辑提供的本地文件\"" sourcename="\"本地文件\"" data-bd-imgshare-binded="\"1\"" style="\"max-width:" 100%;="" height:="" 350px;="" width:="" 400px;\"="" /></p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""> 图为20万盆菊花扮靓花画小镇,与市民游客一起迎国庆</p> <p style="\"font-family:" simsun;="" font-size:="" 14px;\"=""> 双节期间,修文县将举办“野生动物园现场特惠+农业嘉年华现场特惠”、“漂流(上半程)+朵芳阁桃源河酒店”等活动,凡10月1日-7日期间游玩野生动物园的游客,用手机与动物园小动物自拍合影,以及赴农业嘉年华进行参观的游客,用手机在现场自拍,经工作人员验证后,桃源河漂流上半段票价可享受学生票价80元/人优惠。此外,中秋节10月4日当天,游客还可在朵芳阁参与免费领月饼、猜灯谜等活动。</p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""><img id="\"6276054\"" title="\"\"" border="\"0\"" align="\"center\"" src="\"http://www.gywb.cn/xinwen/attachement/jpg/site2/20170927/3417eb9bc7b41b35c36305.jpg\"" sourcedescription="\"编辑提供的本地文件\"" sourcename="\"本地文件\"" data-bd-imgshare-binded="\"1\"" style="\"max-width:" 100%;="" height:="" 350px;="" width:="" 500px;\"="" /></p> <p align="\"center\"" style="\"font-family:" simsun;="" font-size:="" 14px;="" text-align:="" center;\"=""> 图为20万盆菊花扮靓花画小镇,与市民游客一起迎国庆</p> <p style="\"font-family:" simsun;="" font-size:="" 14px;\"=""> 贵阳市旅游产业发展委温馨提醒广大游客,出行前做好计划,提早了解景区的开放情况和周边交通、餐饮、天气等。出游的过程中要注意安全,遵守景区的安全警示,游客在身体不适的情况下不要勉强进行旅游活动。通过网络等自由组团进行户外探险等活动时,要详细了解组织者的身份、资质,目的地的气候、团友的组成结构等信息,事先做好充分的准备。此外,游客还应遵守法律规定,做到文明出行。</p>
下面,我们就来一步步处理这些内容并显示
1、要在App的build.gradle引入Jsoup
implementation 'org.jsoup:jsoup:1.11.3'
2、设置WebView属性
WebSettings webSettings = webView.getSettings();//获取WebView的设置属性 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//把html中的内容放大到WebView等宽的一列中 webSettings.setJavaScriptEnabled(true);//让WebView支持js webSettings.setSupportZoom(true); // 可以缩放 webSettings.setBuiltInZoomControls(true); // 显示放大缩小(这个不设置则缩放不起作用) webSettings.setDisplayZoomControls(false);//不显示webview缩放按钮(通过这个设置则可以不显示那个缩放工具条)
3、添加一段css样式以让WebView按新的样式显示,在这段样式中设定了字体大小,图片大小以及水平居中
private static final String cssStart = "<html>" + "\n"+ "<header>" + "\n"+ "<style type=\"text/css\"> img {" + "width:90%;" + "height:auto;" + "display:block;" + "clear:both;" + "margin:auto" + "}" + "\n" + "body {" + "margin-right:15px;" + "margin-left:15px;" + "margin-top:15px;" + "font-size:21px;" + "}" + "\n" + "</style>" + "\n" + "</header>" + "\n" + "<body>" +"\n";
private static final String cssEnd = "\n"+"</body>"+"\n"+"</html>";
4、写一个简单的处理函数来清理HTML内容并保留换行格式以及添加新的css样式
public static String getNewHtml(String htmlText){ try { htmlText =
htmltext = Jsoup.clean(htmltext,Whitelist.basicWithImages());
htmltext = cssStart+htmltext+cssEnd;
return htmltext;
} catch (Exception e) {
return htmltext;
}
}
5、通过上述处理后,我们就可以直接用WebView来处理了
webView.loadData(getNewHtml(htmlText), "text/html; charset=UTF-8", null);
显示效果如下图:
通过一系列的处理,我们已经将不同格式的HTML以及HTML中不同大小的图片按照统一的标准来展示,同时保留了原来的换行格式。
注:Jsoup clena的参数说明
WhiteList中有几个参数选项
1、none()
只保留文本,其他所有的html内容均被删除
2、basic()
允许的标签包括: a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong, sub, sup, u, ul,以及合适的属性。标签a指向的连接可以是 http, https, ftp, mailto,转换完后会强制添加 rel=nofollow这个属性。不允许包含图片。
3、basicWithImages()
在basic的基础上增加了图片的标签:img以及使用src指向http或https类型的图片链接。
4、simpleText()
只允许: b, em, i, strong, u
5、relaxed()
允许的标签: a, b, blockquote, br, caption, cite, code, col, colgroup, dd, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul。结果不包含标签rel=nofollow ,如果需要可以手动添加。
如果只想保留文本及换行,则clean的代码换成如下:
String htmlText=Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
其中白名单根据自己的需求进行变更。