java-jsoup-解析html文本
jsoup 是一款Java 的HTML解析器,可直接解析某個URL位址、HTML文本内容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作資料。
一、maven 依賴
<!-- dom 解析 -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
二、執行個體
目标:
1.删除html中有指定屬性的dom節點
2.将此邏輯加入 filter 中,可以對靜态html、動态jsp等标準 html 輸出流,進行權限控制(需要權限控制的節點需要加埋點,即:auth-code 屬性)
package com.demo.preview;
import static org.junit.Assert.*;
import java.util.ArrayList;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
import com.lowagie.text.List;
import me.grass.coder.Debug;
/**
*
* @author xxj
*/
public class jsoupTest {
@Test
public void testHtml() {
StringBuffer sbf = new StringBuffer();
sbf.append("<!doctype html>");
sbf.append("<html lang=\"en\">");
sbf.append(" <head>");
sbf.append(" <meta charset=\"UTF-8\">");
sbf.append(" <meta name=\"Generator\" content=\"EditPlus®\">");
sbf.append(" <meta name=\"Author\" content=\"\">");
sbf.append(" <meta name=\"Keywords\" content=\"\">");
sbf.append(" <meta name=\"Description\" content=\"\">");
sbf.append(" <title>Document</title>");
sbf.append(" </head>");
sbf.append(" <body>");
sbf.append(" <div id=\"myDiv\"></div>");
sbf.append(" <div auth=\"myDiv\"></div>");
sbf.append(" <div auth-code=\"111\"><div id=\"\">0000</div></div>");
sbf.append(" <div auth-code=\"222\">bb</div>");
sbf.append(" <div auth-code=\"333\"><div id=\"\">5555</div></div>");
sbf.append(" <div auth-code=\"444\">dd</div>");
sbf.append(" </body>");
sbf.append("</html>");
//授權碼
ArrayList<String> auths= new ArrayList<String>();
auths.add("111");
auths.add("222");
String html = sbf.toString();
Document doc = Jsoup.parse(html);
Elements eles=doc.select("[auth-code]");//查找有指定屬性的元素
Debug.printFormat("比對:{0}",eles.size());
if(eles==null || eles.size()==0){
Debug.print("無内容");
return;
}
Element e;
Integer n=0;
String authCode;
for(int i=0;i<eles.size();i++){
e = eles.get(i);
Debug.printFormat("{0}.{1}"
,(++n)
,e.outerHtml());
authCode = e.attr("auth-code");
//鑒權
if(!hasAuth(authCode,auths))
e.remove();
}
Debug.print("html内容;",doc.outerHtml());
}
/**
* 鑒權
* @param auth
* @param auths
* @return
*/
boolean hasAuth(String auth,ArrayList<String> auths){
if(auth==null || auth.isEmpty())
return false;
return auths.contains(auth);
}
}