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()配置
仅将
现需解决:
- 如何解析包含
的文档? - 这是XHTML的问题还是JTidy的问题?
- 若为JTidy的问题,有哪些替代工具?
- 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,能完美保留
等标签,API简洁易用,还支持DOM操作、CSS选择器查询,是Java领域处理HTML的主流工具。 - 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
相关产品推荐
相关产品推荐

