为什么 JTidy 从 XML 中删除 <video> 元素?

问题描述 投票:0回答:1

我正在使用 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 标签添加到此表中?

感谢您收到的任何建议...

java xml xhtml jtidy
1个回答
0
投票

好消息:我相信您只需要更新您正在使用的 JTidy 版本即可。

我在寻找 JTidy 时发现的第一个命中是旧的 SourceForge 站点,其中最新版本(r938)于 2009 年发布。有了该版本,我可以重现您的问题 - 所以我怀疑这就是您的版本正在使用。

但是,有一个 GitHub 存储库 是最新的(最后一次提交于 2024 年 6 月)。最新版本是 version 1.0.5,于 2023 年 9 月发布...并且使用您的确切代码,警告消失并且

<video>
标签被保留(有趣的是,无论您有
setXHTML(true)
还是
setXHTML(false)
) ).

所以基本上,更新到 1.0.5 就可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.