2013-04-08 178 views
1

当文档的XSD模式可用时,可以忽略用于验证的内部DTD吗?如果模式可用,java忽略用于验证的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的内部引用。

+0

DTD和模式重叠,但如您所示,DTD另外提供实体。您可以编写自己的EntityHandler,并保留所有(递归包含的)DTD本地。提高速度性能。 – 2013-04-08 06:53:29

+0

是的,但我需要以某种方式查看文档是否具有XSD。如果不是,则应使用DTD进行验证。 – RabbitObject 2013-04-08 07:00:36

回答

0

确实有可能阻止DTD用于验证,但防止用于实体扩展(因此被读取)并不容易。如果你想阻止它被完全读取,并且如果你知道这不会导致实体扩展的问题,你可以为解析器提供一个EntityResolver来替代DTD。