jsoup 1.22.2 现已发布,对库进行了多项修复和改进。它使遍历 DOM 时编辑 DOM 的操作更加可预测,使用更新的元素和更佳的文本边界更新了默认的 HTML 标签定义,并提高了解析和 HTTP 传输的可靠性。此版本还修复了清理、流解析、XML 文档类型处理和 Android 打包方面的一些特殊情况。
改进
- 扩展并明确了
NodeTraversor在NodeVisitor.head()期间对就地 DOM 重写的支持。当前节点的编辑操作(如移除、替换和解包)现在能够以更可预测的方式恢复,同时遍历仍保持在原始根子树内。这使得编写 single-pass tree cleanup 和规范化访问器更加容易,例如在遍历 DOM 时展开展示元素或替换文本节点#2472
- 文档:明确了已配置的
Cleaner实例可在并发线程间复用,并且共享Safelist实例在使用过程中不应被修改。#2473
- 更新了当前 HTML 元素的默认 HTML TagSet:新增了 dialog、search、picture 和 slot 标签;将 ins、del、button、audio、video 和 canvas 默认设为内联(Tag#isInline(),与规范中的表述保持一致);并通过新的 Tag.TextBoundary 选项,为控件和嵌入对象添加了可读的 Element.text() 边界。此举改善了代码美观度,并防止规范化文本将相邻单词合并在一起。#2493
错误修复
- Android (R8/ProGuard):新增一条规则,当可选的
re2j依赖项不存在时将其忽略。 #2459
- 修复了 1.21.2 版本中的一个
NodeTraversor回归问题,该问题会导致在head()期间移除或替换当前节点时,可能会重新访问被替换的节点并导致无限循环。遍历文档现已明确说明当前遍历过程中会访问哪些插入的节点。#2472
- 在字符集嗅探过程中,即使调用
available()抛出IOException(如在 JDK 8 的HttpURLConnection中所见),解析操作也不会再失败。#2474
Cleaner在清理或验证文档时,不再将输入文档中的相对 URL 属性转换为绝对 URL。URL 规范化现在仅应用于清理后的输出,且Safelist.isSafeAttribute()方法不再产生副作用。#2475
- 当输入文档保留属性大小写时,
Cleaner不再复制强制属性。现在,在经过清理的输出中,不区分大小写的源属性将被强制属性替换。#2476
- 如果配置了按请求设置的 SOCKS 代理,jsoup 现在会避免使用 JDK HttpClient,因为 JDK 会无提示地忽略该代理并尝试直接连接。此类请求现将回退至支持 SOCKS 的旧版 HttpURLConnection 传输机制。#2468
- 若未声明字符集,且初始 5 KB 的字符集检测在流解析开始前已完全读取并关闭输入流,
Connection.Response.streamParser()和DataUtil.streamParser(Path, ...)可能会在处理小型输入时失败。 #2483
- 在 XML 模式下,包含内部子集的文档类型声明(例如
<!DOCTYPE root [<!ENTITY name "value">]>)现在能够正确地进行往返传输。子集仅作为原始文本保留;实体不会被展开,外部 DTD 也不会被加载。#2486
Build Changes
- 已将集成测试服务器从 Jetty 迁移到 Netty,能够持续支持最低 JDK 目标版本 (8)。#2491
更新说明:https://github.com/jhy/jsoup/releases/tag/jsoup-1.22.2