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 建模,后者无法在标签内存储或建模换行符,因此无法保留它们。
我只能想到两个解决方案:
查找(或编写)替代的 HTML 解析器库,它有一个 API 保留标签内的格式。如果这样的事情已经存在,我会感到惊讶。
运行 通过支持包装在标签内的格式化程序生成的代码。这不会保留原始换行符,但至少属性不会全部在一行上。我无法找到执行此操作的 Java 库,因此您可能需要考虑使用外部程序。
似乎没有什么好的方法可以在将标签解析为 POJO 时保留标签内的中断(或者我还没有找到),所以我编写了一个简单的分词器,它将传入的 HTML 字符串分成几部分像这样:
String[] parts = html.split( "((?=<)|(?<=>))" );
这使用正则表达式查找在 <
之前和 >
之后进行拆分。然后遍历零件并决定是否插入属性。
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 建模,后者无法在标签内存储或建模换行符,因此无法保留它们。
我只能想到两个解决方案:
查找(或编写)替代的 HTML 解析器库,它有一个 API 保留标签内的格式。如果这样的事情已经存在,我会感到惊讶。
运行 通过支持包装在标签内的格式化程序生成的代码。这不会保留原始换行符,但至少属性不会全部在一行上。我无法找到执行此操作的 Java 库,因此您可能需要考虑使用外部程序。
似乎没有什么好的方法可以在将标签解析为 POJO 时保留标签内的中断(或者我还没有找到),所以我编写了一个简单的分词器,它将传入的 HTML 字符串分成几部分像这样:
String[] parts = html.split( "((?=<)|(?<=>))" );
这使用正则表达式查找在 <
之前和 >
之后进行拆分。然后遍历零件并决定是否插入属性。