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

时间:2018-10-22 15:16:51

标签: xhtml xerces

我从W3C recommendation复制了示例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.

2 个答案:

答案 0 :(得分:0)

我退出Xerces并改用xmllint。

xmllint适用于上述sample.xml。首先,您需要手动下载all schema files并将它们保存在保留sample.xml的位置。

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

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

xmllint花了32秒来验证sample.xml

在Ubuntu上的libxml 2.9.4和OS X Capitan的默认xmllint上使用xmllint进行了测试。

答案 1 :(得分:0)

删除示例中的以下两行

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

和Xerces将起作用。使用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。