有选择地停用 jsoup 中文档中某些区域的漂亮打印

Selectively deactivate pretty-print in jsoup for certain regions in a document

使用 jsoup 清理 HTML 文档时,我喜欢它自动应用漂亮打印的事实。我知道我可以在每个文档的基础上停用它,但我喜欢将它应用于大部分文档,除了某些有问题的区域,在这些区域中 jsoup 做得不好。

一个例子是带有 CSS specifying white-space: pre-wrap;DIV 标签,即它们在语义上的行为类似于 PRE 标签,这意味着浏览器将对换行符和其他空格敏感(缩进).如果在这些区域内有更多标签,如 BRSPAN 等,情况会变得更糟,因为应用了漂亮的打印并破坏了这些区域的预期格式。

因此,我不想在整个 HTML 文档中完全停用漂亮打印,而是希望在解析器遇到类似 div.listing 的情况时有选择地停用它(是的,我知道 CSS class 问题区域的名称)并在那里保留原来的 HTML。我将如何实施它?

更新: 我忘了说我使用

打印清理过的文档
output.print(document);

其中 outputPrintStreamdocument 是 jsoup Document 实例。所以如果有更好的文档输出方式,我也欢迎大家指教

我最终做了什么,因为到目前为止我在这里没有得到答案,也没有找到更好的解决方案,这很糟糕,但它有效:

  1. 解析 + 清理文档
  2. 获取(通过 toString())+ 保留印刷精美的 HTML 内容
  3. 停用漂亮打印,然后获取(通过toString())+ 重新解析原始格式的内容到临时文档
  4. 重新解析步骤2中的漂亮打印内容并分配给原始文档(覆盖它),然后为新分配的文档停用漂亮打印
  5. 通过像[=32=这样的方式并行迭代两个文档,通过保留步骤 2 中的原始内容来替换漂亮打印会破坏格式的内容(例如带有 CSS white-space: pre-wrap 的元素) ]
for (int i = 0; i < elementsToBeFixed.size(); i++) 
  elementsToBeFixed.get(i).replaceWith(originalElements.get(i));

结论:这很丑陋,因为之前已经解析+清理的同一个文档需要再重新解析两次,即我们总共有 3 Jsoup.parse(..) 次调用。但是 - 它有效。 :-/

不过,我仍在等待更好的答案。