记一次Java生成HTML格式文件遇到的问题

一、问题描述

在Jsoup生成的HTML中,自闭合标签(如<link><meta>等)会根据HTML的标准格式进行输出,有时会省略自闭合的斜杠。这虽然不会影响浏览器的解析,但在一些特殊场景下会导致解析失败,例如epub格式文件。

原文件内容:

<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>这是一个标题</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link href="stylesheet.css" rel="stylesheet" type="text/css" />
  <link href="page_styles.css" rel="stylesheet" type="text/css" />
</head>

</html>

Jsoup生成的内容

<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title>这是一个新的标题</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href="stylesheet.css" rel="stylesheet" type="text/css">
    <link href="page_styles.css" rel="stylesheet" type="text/css">
</head>

</html>

可以看到<link><meta>标签的自闭合斜杠被省略了。

二、解决方法

可以使用Jsoup的OutputSettings类来控制输出格式,实现方式如下:

public static void main(String[] args) {
        String html = "<?xml version='1.0' encoding='utf-8'?>\n" +
                "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
                "\n" +
                "<head>\n" +
                "  <title>这是一个标题</title>\n" +
                "  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" +
                "  <link href=\"stylesheet.css\" rel=\"stylesheet\" type=\"text/css\" />\n" +
                "  <link href=\"page_styles.css\" rel=\"stylesheet\" type=\"text/css\" />\n" +
                "</head>\n" +
                "\n" +
                "</html>";

        Document doc = Jsoup.parse(html);

        // 替换 <title> 标签内容
        Element title = doc.selectFirst("title");
        if (title != null) {
            title.text("这是一个新的标题");
        }

        // 设置输出格式
        OutputSettings settings = new OutputSettings();
        settings.syntax(OutputSettings.Syntax.xml);
        doc.outputSettings(settings);

        System.out.println(doc.toString());
    }

在以上示例中,通过设置OutputSettingsSyntax.xml,我们确保自闭合标签在输出时保留斜杠。运行这个程序将输出:

<!--?xml version='1.0' encoding='utf-8'?-->
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <title>这是一个新的标题</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link href="stylesheet.css" rel="stylesheet" type="text/css" />
    <link href="page_styles.css" rel="stylesheet" type="text/css" />
</head>

<body></body>

</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值