如果模式可用,java将忽略DTD进行验证

如果模式可用,java将忽略DTD进行验证,java,xml,validation,xsd,dtd,Java,Xml,Validation,Xsd,Dtd,当文档具有可用的XSD模式时,是否可以忽略内部DTD进行验证 如果源文档中未指定架构,则应使用DTD进行验证 下面是我如何配置解析器的 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setNamespaceAware(true); factory.setFeature("http://apache.org/xml/featur

当文档具有可用的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实体,而模式引用用于针对W3CXML模式进行验证


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

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

DTD和模式重叠,但正如您所指出的,DTD还提供实体。您可以编写自己的EntityHandler,并将所有递归包含的DTD保持为本地。提高速度性能。是的,但我需要看看文档是否有XSD。如果没有,则应使用DTD进行验证。