You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jsoup设置Element属性时&被二次转义问题求助

解决Jsoup设置属性值时的二次转义问题

问题根源

调用element.attr()时,Jsoup会自动转义属性值中的特殊字符(包括&)。你先把>替换成>,设置时&又被转成&,最终就变成了>。

解决方案

方案一:调整转义逻辑(推荐)

不需要手动转义&,只需要把<和>替换为标准HTML实体&lt;和&gt;。Jsoup在输出HTML时会自动将&转义为&amp;,最终得到你想要的&amp;lt;和&amp;gt;。

修改转义方法:

private String escapeSpecificHtmlChars(final String input) {
    if (StringUtils.isBlank(input)) {
        return input;
    }
    // 替换为标准HTML实体,Jsoup输出时会自动转义&为&amp;
    return input.replace(">", "&gt;")
            .replace("<", "&lt;");
}

原循环代码无需改动,设置属性后最终输出的属性值会是&amp;gt;test value&amp;gt;,符合需求。

方案二:直接使用Literal属性(强制保留原样)

如果你必须保留已处理好的&amp;gt;格式,可通过Jsoup的Attribute构造函数指定isLiteral=true,跳过自动转义逻辑:

修改循环中的属性设置代码:

Elements elements = htmlDocument.getAllElements();

// Process each element's attributes
for (Element element : elements) {
    // 先复制当前属性列表,避免遍历过程中修改导致异常
    List<Attribute> attrs = new ArrayList<>(element.attributes());
    for (Attribute attribute : attrs) {
        String originalValue = attribute.getValue();
        String escapedValue = escapeSpecificHtmlChars(originalValue);
        // 使用literal模式替换属性,禁止Jsoup转义
        element.attributes().put(new Attribute(attribute.getKey(), escapedValue, true));
    }
}

注:遍历属性时要先复制列表,避免在遍历原属性集合时修改导致并发修改异常。

内容的提问来源于stack exchange,提问作者Pallavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:53:13