1

当文档具有可用的 XSD 架构时,是否可以忽略内部 DTD 进行验证?

如果源文档中没有指定模式,则应使用 DTD 进行验证。

这是我配置解析器的方式。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
factory.setFeature("http://apache.org/xml/features/validation/dynamic", true);

factory.setSchema(schemaFactory.newSchema());
builder.setErrorHandler(errorHandler);

我使用“动态”功能使解析器仅在指定 DTD 时才执行 DTD 验证。

我根本无法摆脱 DTD 验证,只有当源 XML 文档具有 XSD 架构时,我才需要忽略它。

有时,DTD 声明仅用于声明 DTD 实体,而模式引用用于针对 W3C XML 模式进行验证。

问题是 DTD 验证只能在解析时执行,在此之前我不知道文档是否具有对 DTD 或 XSD 的内部引用。

4

1 回答 1

0

当然可以防止 DTD 被用于验证,但要防止它被用于实体扩展(并因此被读取)并不容易。如果您想阻止它被完全读取,并且如果您知道这不会导致实体扩展出现问题,您可以为解析器提供一个 EntityResolver 来用一个虚拟对象替换 DTD。

于 2013-04-08T07:28:01.847 回答