0

我正在尝试使用 Ant 的 XMLValidate 任务来根据 DTD 验证 XML 文档。问题不在于它不工作,而在于它工作得太好了。我的 DTD 包含一个具有 IDREF 类型的“@linkend”属性的外部参照元素。大多数这些参考 ID 在当前文档之外。因此,我的构建失败,因为解析器抱怨 IDREF 引用的 ID 不存在。那么,有什么方法可以根据 DTD 验证我的 XML 文档,但忽略这种类型的错误?

我尝试过的一些事情: 在 XMLValidate 上设置“宽松”选项使任务只检查文档的格式正确,而不是针对 DTD 的有效性。 Ant 手册中的 XMLValidate 任务列出了一些您可以设置的 JAXP 和 SAX 选项,但似乎没有一个适用。

这是我的代码:

 <target name="validate">
        <echo message="Validating ${input}"/>
        <xmlvalidate file="${input}" failonerror="yes"
            classname="org.apache.xml.resolver.tools.ResolvingXMLReader">
            <classpath refid="xslt.processor.classpath"/>
        </xmlvalidate>
 </target>

如您所见,我使用 ResolvingXMLReader 来根据公共标识符目录解析 DTD。但是,如果我直接使用嵌套的 xmlcatalog 元素指定 DTD,我会得到相同的行为。

4

2 回答 2

2

您的问题源于对 DTD 的两种解释之间的差异:您的和规范的:-)。IDREF 必须引用同一文档中的 id,而您的则引用跨文档的元素。

我的建议是创建您自己的 DTD 版本,为该属性指定 NMTOKEN 而不是 IDREF,并使用它来执行验证。这将确保内容是有效的 xml id 值。

于 2008-10-22T01:18:53.233 回答
0

不确定这是否有帮助,但你能试试这个解决方法吗?创建一个临时文件,合并所有 XML,然后进行验证。

于 2008-10-06T12:11:25.667 回答