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

JTidy为何移除XML中的<video>元素?如何处理含该标签的文档?

问题:JTidy处理含

使用JTidy处理包含

import org.w3c.dom.Node;
import org.w3c.tidy.Tidy;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import static java.nio.charset.StandardCharsets.UTF_8;

public class Test {
  public static void main (String[] args) throws Exception {
    // Set up a JTidy instance
    Tidy tidy = new Tidy();
    tidy.setInputEncoding("UTF8");

    // The following make no difference to the output
    // whether they are present or not, or whether the
    // parameters are changed from true to false or vice versa
    tidy.setQuiet(true);
    tidy.setShowWarnings(false);
    tidy.setXHTML(true);
    tidy.setDropEmptyParas(false);
    tidy.setTrimEmptyElements(false);

    // Process XHTML from a string
    String xml = "<div>\n"
               + "  Video goes here:<br/>\n"
               + "  <video width='640' height='480'>\n"
               + "   <source src='foo.mp4' type='video/mp4'/>\n"
               + "  </video>\n"
               + "</div>";

    byte[] bytes = xml.getBytes(UTF_8);
    InputStream in = new ByteArrayInputStream(bytes);
    Node node = tidy.parseDOM(in,null).getDocumentElement();

    // Display the resulting Node as a sanity check
    tidy.pprint(node,System.out);
  }
}

运行后输出结果:

<div>Video goes here:<br />   </div>

尝试过以下操作均无效:

  • 设置tidy.setXHTML(false)
  • 添加<!DOCTYPE html>声明
  • 移除所有tidy.setXXX()配置

仅将

现需解决:

  1. 如何解析包含
  2. 这是XHTML的问题还是JTidy的问题?
  3. 若为JTidy的问题,有哪些替代工具?
  4. JTidy是否存在可修改的允许标签表?是否需要添加所有HTML5新标签?

解决方案与问题分析

问题根源:JTidy对HTML5标签的支持缺失

这是JTidy的问题,和XHTML本身无关——XHTML 1.0确实不包含HTML5的

针对JTidy的临时解决办法:扩展允许的标签表

JTidy支持自定义标签规则,你可以手动添加HTML5标签的定义,步骤如下:
在代码中动态为

// 为video标签添加属性与规则
tidy.getConfiguration().addAttribute("video", "width");
tidy.getConfiguration().addAttribute("video", "height");
tidy.getConfiguration().addTag("video", (short) 0, true, true, false, false, false, false, false);
// 为source标签添加规则
tidy.getConfiguration().addTag("source", (short) 0, true, false, false, false, false, false, false);

不过这种方式需要手动添加所有用到的HTML5新标签(如

更彻底的替代方案:换用支持HTML5的解析工具

如果不想折腾JTidy,直接换用对HTML5支持更好的工具是更省心的选择,推荐几个常用的:

  • jsoup:专门针对HTML解析的Java库,原生支持HTML5,能完美保留
  • HtmlUnit:不仅能解析HTML,还模拟浏览器环境,支持JavaScript渲染,适合处理动态页面场景,对HTML5标签支持完善。
  • NekoHTML:老牌HTML解析器,支持HTML5,可将HTML转换为XML/DOM结构,适合需要DOM操作的场景。

jsoup解析示例(完美保留

用jsoup替代JTidy的代码示例:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class TestJsoup {
    public static void main(String[] args) {
        String xml = "<div>\n"
                   + "  Video goes here:<br/>\n"
                   + "  <video width='640' height='480'>\n"
                   + "   <source src='foo.mp4' type='video/mp4'/>\n"
                   + "  </video>\n"
                   + "</div>";
        
        Document doc = Jsoup.parse(xml);
        System.out.println(doc.html());
    }
}

输出结果会完整保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:02:32