「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。
前言
最近做了一个需求,前端保存一个html模板,后端处理后将替换完数据的html返回给前端,然后展示,提供给用户打印。
HTML解析
JAVA中想要处理html,有两种方案
- 当做字符串来处理,直接替换掉占位符,但是这种方式不够灵活,当我们想要修改html样式的时候,字符串操作太过麻烦
- 将html解析成对象,我们直接操作对象的每一个属性,这样更加灵活
实现
第一种字符串替换,这里就不介绍了,接下来看一下怎么将html解析成对象,并且操作它。 这里使用JSOUP工具类
引入依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
将HTML解析成对象
- 我们先编写一个html模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>打印模板</title>
</head>
<body>
我是:<span>@name</span>,今年<span>@age</span>了。
</body>
</html>
- 加载模板文件
@Test
void jsoupTest() throws IOException {
File input = new File("src/main/resources/templates/test.html");
// 文档对象
Document doc = Jsoup.parse(input, "UTF-8");
System.out.println(doc);
}
输出
这个文档对象就是加载的
html文件内容。
- 获取所有带有
@的占位符
//查询出所有@占位符的元素节点
Elements elementsMatchingText = doc.getElementsMatchingText("^@");
System.out.println(elementsMatchingText);
- 替换掉占位标签的值
//查询出所有@占位符的元素节点
Elements elementsMatchingText = doc.getElementsMatchingText("^@");
for (Element element : elementsMatchingText) {
// 判断当前标签时候有信息
if (element.hasText()){
// element.text() 获取文本信息
// element.text("小明") 设置文本信息
switch (element.text()){
case "@name": element.text("小明");
break;
case "@age": element.text("18");
break;
}
}
}
System.out.println(doc);
输出
这样我们就可以实现动态的替换占位符了。 常用方法 这里列举几个常用方法,更详细的可以查阅官方文档
// 将html字符串解析为html文档对象
Document document = Jsoup.parse("html字符串");
//查询出所有^占位符的元素节点
Element select = document.selectFirst("tr:contains(^)");
//复制当前元素节点
Element clone = select.clone();
//获取元素节点下得所有子节点
Elements allMxElements = clone.getAllElements();
//判断当前节点是否有文本信息 <p>aaa</p>则为true <p></p>则为false
element.hasText()
//设置元素的文本内容
element.text();
//从DOM中删除此节点,并将其子节点上移到节点的父节点中。
element.unwrap();
总结
在操作html对象的时候要注意一些细节,比如一个元素节点里有两个占位符,在筛选的时候就要注意方法。当有多行操作的是,拼接时注意样式问题,补空行时要留意默认追加的元素设置行高。