Jsoup设置Element属性时&被二次转义问题求助
解决Jsoup设置属性值时的二次转义问题
问题根源
调用element.attr()时,Jsoup会自动转义属性值中的特殊字符(包括&)。你先把>替换成>,设置时&又被转成&,最终就变成了>。
解决方案
方案一:调整转义逻辑(推荐)
不需要手动转义&,只需要把<和>替换为标准HTML实体<和>。Jsoup在输出HTML时会自动将&转义为&,最终得到你想要的&lt;和&gt;。
修改转义方法:
private String escapeSpecificHtmlChars(final String input) { if (StringUtils.isBlank(input)) { return input; } // 替换为标准HTML实体,Jsoup输出时会自动转义&为& return input.replace(">", ">") .replace("<", "<"); }
原循环代码无需改动,设置属性后最终输出的属性值会是&gt;test value&gt;,符合需求。
方案二:直接使用Literal属性(强制保留原样)
如果你必须保留已处理好的&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
相关产品推荐
相关产品推荐

