【问题标题】:Jsoup clean title tag failureJsoup 清理标题标签失败
【发布时间】:2016-09-29 07:09:23
【问题描述】:

我正在使用 Jsoup 1.9.2 来处理和清理特定标签的一些 XML 输入。在此期间,我注意到 Jsoup 在被要求清理 title 标记时表现异常。具体来说,title 标记中的其他 XML 标记不会被删除,实际上会被它们的转义形式替换。

我为此创建了一个简短的单元测试,如下所示。测试失败,因为output 的值是CuCl<sub>2</sub>

@Test
public void stripXmlSubInTitle() {
    final String input = "<title>CuCl<sub>2</sub></title>";
    final String output = Jsoup.clean(input, Whitelist.none());
    assertEquals("CuCl2", output);
}

如果title 标记被替换为其他标记(例如,pdiv),则一切正常。任何解释和解决方法将不胜感激。

【问题讨论】:

标签: java html xml jsoup


【解决方案1】:

title 标记应在head 中使用(或在 HTML5 中的html)标记中使用。由于它用于显示 HTML 文档的标题,主要是在浏览器窗口/选项卡中,因此它不应该有子标签。

JSoup 对待它的方式与 pdiv 等实际内容标签不同,textarea 也是如此。

编辑:

你可以这样做:

public static void main(String[] args) {
    try {
        final String input = "<content><title>CuCl<sub>2</sub></title><othertag>blabla</othertag><title>title with no subtags</title></content>";
        Document document = Jsoup.parse(input);
        Elements titles = document.getElementsByTag("title");
        for (Element element : titles) {
            element.text(Jsoup.clean(element.ownText(), Whitelist.none()));
        }
        System.out.println(document.body().toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

那会返回:

<body>
 <content>
  <title>CuCl2</title>
  <othertag>
   blabla
  </othertag>
  <title>title with no subtags</title>
 </content>
</body>

根据您的需要,需要进行一些调整,例如

System.out.println(Jsoup.clean(document.body().toString(), Whitelist.none()));

那会返回:

CuCl2  blabla  title with no subtags

【讨论】:

  • 谢谢!不过,我的文档不是纯 HTML,它们是带有一些(顺便提一下)HTML 标签的 XML。您能推荐一种避免这种情况的方法(除了正则表达式替换)吗?我喜欢/需要 Jsoup 的白名单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2019-01-08
  • 2021-01-20
  • 1970-01-01
相关资源
最近更新 更多