动态打印模板文件

574 阅读2分钟

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」。

前言

最近做了一个需求,前端保存一个html模板,后端处理后将替换完数据的html返回给前端,然后展示,提供给用户打印。

HTML解析

JAVA中想要处理html,有两种方案

  1. 当做字符串来处理,直接替换掉占位符,但是这种方式不够灵活,当我们想要修改html样式的时候,字符串操作太过麻烦
  2. 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);
}

输出 image.png

这个文档对象就是加载的html文件内容。

  • 获取所有带有@的占位符
//查询出所有@占位符的元素节点
Elements elementsMatchingText = doc.getElementsMatchingText("^@");
System.out.println(elementsMatchingText);

image.png

  • 替换掉占位标签的值
//查询出所有@占位符的元素节点
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);

输出 image.png

这样我们就可以实现动态的替换占位符了。 常用方法 这里列举几个常用方法,更详细的可以查阅官方文档

// 将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对象的时候要注意一些细节,比如一个元素节点里有两个占位符,在筛选的时候就要注意方法。当有多行操作的是,拼接时注意样式问题,补空行时要留意默认追加的元素设置行高。