Java 将属性添加到 HTML 标签而不更改格式

Java add attribute to HTML tags without changing formatting

A 有一个任务是制作一个 Maven 插件,它在特定位置获取 HTML 文件,并为每个没有它的标签添加一个服务属性。这是在源代码上完成的,这意味着我和我的同事将不得不进一步编辑这些文件。

作为第一个解决方案,我求助于 Jsoup,它似乎可以完成这项工作,但有一个小而烦人的问题:如果我们有一个包含多个长属性的标签(我们经常这样做 HTML 代码是进一步处理的来源)我们像这样换行:

<ui:grid id="category_search" title="${handler.getMessage( 'title' )}" 
        class="is-small is-outlined is-hoverable is-foldable"
        filterListener="onApplyFilter" paginationListener="onPagination" ds="${handler.ds}" 
        filterFragment="grid_filter" contentFragment="grid_contents"/>

但是,Jsoup 将其变成了很长的一行:

<ui:grid id="category_search" title="${handler.getMessage( 'title' )}" class="is-small is-outlined is-hoverable is-foldable" filterListener="onApplyFilter" paginationListener="onPagination" ds="${handler.ds}" filterFragment="grid_filter" contentFragment="grid_contents"/>

这是一种不好的做法,阅读和编​​辑起来真的很痛苦。

那么有没有其他不太复杂的方法来添加这个属性而不解析和重组 HTML 代码或者可能以某种方式保留换行符 标签中?

不幸的是,JSoup 的主要用例不是创建人类阅读或编辑的 HTML。具体来说,JSoup 的 API 非常接近于 DOM 建模,后者无法在标签内存储或建模换行符,因此无法保留它们。

我只能想到两个解决方案:

  1. 查找(或编写)替代的 HTML 解析器库,它有一个 API 保留标签内的格式。如果这样的事情已经存在,我会感到惊讶。

  2. 运行 通过支持包装在标签内的格式化程序生成的代码。这不会保留原始换行符,但至少属性不会全部在一行上。我无法找到执行此操作的 Java 库,因此您可能需要考虑使用外部程序。

似乎没有什么好的方法可以在将标签解析为 POJO 时保留标签内的中断(或者我还没有找到),所以我编写了一个简单的分词器,它将传入的 HTML 字符串分成几部分像这样:

String[] parts = html.split( "((?=<)|(?<=>))" );

这使用正则表达式查找在 < 之前和 > 之后进行拆分。然后遍历零件并决定是否插入属性。