【发布时间】:2020-06-24 14:21:38
【问题描述】:
W3C recommended list of doctype declarations 表示 XHTML 1.1 的以下文档类型:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
这与A List Apart、Wiley Dummies site 等推荐的系统 ID 相同。它是模块化 XHTML 1.1 DTD 的标准系统 ID 之一。
不幸的是,这个模块化 DTD 引用了其他 XML 实体,其中一些已被 W3C 从其站点中删除,完全破坏了解析。
您可以在 Java 11 中对此进行测试。从以下 XHTML 1.1 文件开始:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>XHTML 1.1 Skeleton</title>
</head>
<body>
</body>
</html>
尝试使用标准的内置 Java 解析器对其进行解析:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
final Document document;
try (InputStream inputStream = new BufferedInputStream(getClass().getResourceAsStream("xhtml-1.1-test.xhtml"))) {
document = documentBuilder.parse(inputStream);
}
解析将失败,为http://www.w3.org/TR/xhtml11/DTD/xhtml-datatypes-1.mod 抛出一个java.io.FileNotFoundException。显然 W3C 已经从其网站上完全删除了这个实体。
如果改为使用http://www.w3.org/MarkUp/DTD/xhtml11.dtd(在XHTML 1.1 specification DTD 中出现注释),则解析正常完成(尽管大约需要10 分钟)。
为什么 W3C 在 http://www.w3.org/TR/xhtml11/DTD/ 集合中提供的实体不足,从而破坏了使用标准系统 ID 进行 XHTML 1.1 解析?为什么不是http://www.w3.org/MarkUp/DTD/ 提供的所有模块都可用?我应该联系 W3C 的谁来解决这个问题? (为什么这些实体的 HTTP 访问需要这么长时间?)
【问题讨论】:
-
您会考虑拨打DocumentBuilder.setEntityResolver 一个可接受的解决方法吗?
-
我不是在寻求解决方法。我已经有了自己的实体解析器的解决方法;见stackoverflow.com/q/60568284/421049。我想说的是,W3C 已经破坏了整个 XHTML 1.1 解析基础结构,该基础结构已经存在了大约 20 年。 W3C 需要将适当的实体资源重新上线,并且需要更快地为它们提供服务。否则,他们正在破坏所谓的符合标准的数据。我们如何向 W3C 报告并解决此问题?
-
这听起来不错,直到我在页面上看到:“WHATWG 邮件列表不再有效。”
-
另外,这不是 W3C 的问题吗?与 WHATWG 相比,W3C 不还是一个完全独立的实体吗?