使用Jsoup进行语法分析时,保持HTML布尔属性的原始形式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jsoup进行语法分析时,保持HTML布尔属性的原始形式相关的知识,希望对你有一定的参考价值。

使用Jsoup解析以下html时:

String html = "<iframe allowfullscreen></iframe>";
Document doc = Jsoup.parseBodyFragment(html);
System.out.println(doc.body().html());

我得到以下输出:

<iframe allowfullscreen=""></iframe>

即使它必须具有相同的含义(source),有没有办法告诉Jsoup保持布尔属性的原始形式(即输入中的那个,allowfullscreen而不是示例中的allowfullscreen="")?

答案

不幸的是,我不认为有一个简单的设置来控制它。如果有,你期望在Document.OutputSettings找到它。

正如我在评论中所说的那样,好消息是该属性的原始形式通过attr保留并可用,除了你不能区分allowfullscreenallowfullscreen=""之间的区别。

所以你可以自己序列化文档,模数不能分辨出这一点。或者,由于Jsoup是开源的,您可以为此添加一个Document.OutputSettings设置(并且可能在解析器中进行修改,以便您区分上述两种情况)并更新html和相关方法中的逻辑以尊重设置,最好是通过分叉the project,进行更改,对变更进行测试,以及执行拉取请求。 :-)不太可能是人们喜欢的答案,但关于操作系统的好处是你可以抓住你自己的痒并在此过程中改进项目。

另一答案

通过阅读Document.OutputSettings的javadoc,我认为Document.OutputSettings.Syntax.xml是你需要的:

Document doc = Jsoup.parseBodyFragment("<ol reversed><li>one</li></ol>");
doc.outputSettings().syntax(Syntax.xml);

System.out.println(doc.body().html());

打印:

<ol reversed="">
 <li>one</li>
</ol>

默认(我认为是Document.OutputSettings.Syntax.html)将是:

<ol reversed>
 <li>one</li>
</ol>

正如本问题What does it mean in HTML 5 when an attribute is a boolean attribute?中提到的HTML布尔属性,语义上这三种形式是相同的:

<ol reversed>
<ol reversed="">
<ol reversed="reversed">

(测试版JSaz的1.10.2

以上是关于使用Jsoup进行语法分析时,保持HTML布尔属性的原始形式的主要内容,如果未能解决你的问题,请参考以下文章

用jsoup解析HTML时报错;java.lang.noclassdeffounderror:org/jsoup/Jsoup

详解JSOUP的select选择器语法

布尔属性的语法是啥,例如一个选中的复选框,在 HTML 中?

jsoup 源码分析

使用 jsoup 对 HTML 文档进行解析和操作

如何使用 Jsoup 从 html 元素中删除所有内联样式和其他属性?