当 w3.org 停止提供某些文件时,如何在命令行上使用Xerces验证XHTML?



我从W3C建议中复制了示例XHTML文件:

$ cat > sample.xml
<?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 version="-//W3C//DTD XHTML 1.1//EN"
xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/1999/xhtml
http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"
>
<head>
<title>Virtual Library</title>
</head>
<body>
<p>Moved to <a href="http://example.org/">example.org</a>.</p>
</body>
</html>

命令行工具sax.Counter不适用于示例:

$ java -classpath /usr/share/java/xercesImpl-2.11.0.jar:/usr/share/java/xercesSamples.jar sax.Counter -v -n -np -s -f sample.xml 
error: Parse error occurred - http://www.w3.org/TR/xhtml11/DTD/xhtml-datatypes-1.mod
java.io.FileNotFoundException: http://www.w3.org/TR/xhtml11/DTD/xhtml-datatypes-1.mod

因为缺少包含的文件之一:

$ wget http://www.w3.org/TR/xhtml11/DTD/xhtml-datatypes-1.mod
--2018-10-22 23:08:30--  http://www.w3.org/TR/xhtml11/DTD/xhtml-datatypes-1.mod
404 Not Found
2018-10-22 23:08:45 ERROR 404: Not Found.

删除示例中的以下两行

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

和薛塞斯将工作。使用 Java 11 和 libxerces 2.11.0:

$ export CLASSPATH=/usr/share/java/xercesImpl.jar:/usr/share/java/xercesSamples.jar
$ java sax.Counter -v -n -np -s -f sample.xml
sample.xml: 25176 ms (6 elems, 10 attrs, 0 spaces, 59 chars)

我很困惑为什么主dtd文件可用,而组件mod文件不可用。但至少 w3 已经将xsd文件的组件保持在线 - 直到有一天他们放弃它,转而使用一些更新的方法来验证 XML。

我退出了Xerces,改用xmllint。

XMLLINT适用于所述样品.xml。首先,您需要手动下载所有架构文件,并将它们保存在保存 sample.xml 的同一位置。

然后使用主 xsd 文件进行验证:

$ xmllint --schema xhtml11.xsd sample.xml --noout
sample.xml validates

XMLLINT 花了 32 秒来验证样本.xml

在 Ubuntu 上随 libxml 2.9.4 附带的 xmllint 以及 OS X Capitan 上的默认 xml lint 进行测试。

最新更新