我正在使用 JTidy 处理 XHTML 文档,现在我有一个包含
<video>
元素的文档,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);
}
}
对于上面代码中使用的示例 HTML 片段,输出的相关部分是这样的:
<div>Video goes here:<br /> </div>
我被告知(如下)
<video>
是一个HTML5标签,在XHTML中无效(?),所以我尝试使用tidy.setXHTML(false)
,它没有什么区别。我尝试在开头添加<!DOCTYPE html>
。我尝试删除所有 tidy.setXXX()
配置调用。这些东西(任何组合)都没有任何区别。唯一有效的方法是使用 <embed>
而不是 <video>
,但是 (a) 这已被弃用,(b) 在解析它之前,我必须将 <video>
标记替换为 <embed>
,以及 (c)它不具备 <video>
的所有功能。
那么,我该如何解析包含视频的文档呢?
这是一个 XHTML 问题,还是只是 JTidy 的问题,如果后者有我可以使用的替代方案?
或者是否有一个表格,其中包含我可以修补的 JTidy 允许的标签?
如果是这样,我是否需要将所有新的 HTML5 标签添加到此表中?
感谢您收到的任何建议...
好消息:我相信您只需要更新您正在使用的 JTidy 版本即可。
我在寻找 JTidy 时发现的第一个命中是旧的 SourceForge 站点,其中最新版本(r938)于 2009 年发布。有了该版本,我可以重现您的问题 - 所以我怀疑这就是您的版本正在使用。
但是,有一个 GitHub 存储库 是最新的(最后一次提交于 2024 年 6 月)。最新版本是 version 1.0.5,于 2023 年 9 月发布...并且使用您的确切代码,警告消失并且
<video>
标签被保留(有趣的是,无论您有 setXHTML(true)
还是 setXHTML(false)
) ).
所以基本上,更新到 1.0.5 就可以解决问题。