2013-04-08 177 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。