Jsoup如何创建自定义自闭合标签并替换原有HTML标签
实现方案
核心思路
Jsoup默认会按HTML标准修正非原生标签的格式,所以需要先调整解析和输出的配置,再做标签匹配替换,保证自定义自闭合标签不会被转成双标签。
具体实现代码
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.parser.ParseSettings; import org.jsoup.parser.Parser; import org.jsoup.parser.Tag; import org.jsoup.select.Elements; public class CustomTagReplace { public static void main(String[] args) { // 你的原始HTML内容 String originHtml = "<body><inline id=\"inline-1\" /><p>测试段落</p><inline id=\"inline-2\" /></body>"; // 1. 初始化解析器,保留标签和属性的大小写,不做默认修正 Parser customParser = Parser.htmlParser(); customParser.settings(new ParseSettings(true, true)); Document doc = Jsoup.parse(originHtml, "", customParser); // 2. 筛选所有符合规则的<inline>标签 Elements inlineTags = doc.select("inline[id^=inline-]"); for (Element oldTag : inlineTags) { // 提取id中的数字部分 String numStr = oldTag.attr("id").replaceFirst("inline-", ""); // 3. 创建自定义自闭合标签 Tag newTag = Tag.valueOf("abc:123", doc.outputSettings().syntax()).selfClosing(); Element customElement = new Element(newTag, "").attr("input", numStr); // 替换原标签 oldTag.replaceWith(customElement); } // 4. 配置输出规则,强制保留自闭合格式 doc.outputSettings() .syntax(Document.OutputSettings.Syntax.xml) .prettyPrint(true); // 不需要格式化可以设为false // 输出结果 System.out.println(doc.html()); } }
注意事项
- 必须将输出语法设为
xml,如果用默认的HTML语法,Jsoup会把非HTML原生的自闭合标签自动转为开标签,导致格式错误 - 如果需要保留原
<inline>标签的其他属性,直接遍历oldTag.attributes()批量添加到新标签即可 - 如果自定义标签名是动态的,修改
Tag.valueOf()的第一个参数即可适配
内容的提问来源于stack exchange,提问作者Diego Gutierrez
相关产品推荐
相关产品推荐

