2009-06-15 12 views
6

Je suis en train d'analyser un document HTML avec le doctype déclaré utiliser la DTD de transition comme suit:DTD erreur de téléchargement en analyse syntaxique de document XHTML dans XOM

< DOCTYPE html PUBLIC « - // W3C // DTD XHTML 1.0 Transitional // eN » "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

Quand je Builder.build sur le document, je reçois l'exception suivante:

java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1305) 
     at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
     at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) 
     at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source) 
     at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) 
     at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source) 
     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
     at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) 
     at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) 
     at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
     at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
     at nu.xom.Builder.build(Builder.java:1127) 
     at nu.xom.Builder.build(Builder.java:1019) 

Si je retire la déclaration de type doc, il analyse juste bien. Je peux télécharger avec succès le dtd de mon navigateur, qui me dit que le est valide. Je ne veux pas supprimer la déclaration de type doc. Est-ce que dit au constructeur de ne pas télécharger le dtd ou de lui fournir avec un autre dtd?

+0

Êtes-vous l'analyse syntaxique HTML de la nature »ou avez-vous créé/contrôle sur les ont pages que vous parsing? – lucas

+0

J'ai le contrôle sur le HTML que je suis l'analyse, donc à tout le moins, je peux supprimer la déclaration doctype. Mais j'essaie de rester fidèle aux bonnes pratiques et de conserver la déclaration doctype. – Bala

Répondre

3

En jetant un coup d'oeil sur le javadoc pour Builder, je suppose que vous pourriez fournir un EntityResolver via le constructeur qui prend un XMLReader. J'éviterais de laisser l'analyseur télécharger des fichiers sur Internet si possible.

+0

org.apache.xerces.parsers.SAXParser xmlReader = new SAXParser(); xmlReader.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); Builder xomBuilder = nouveau Builder (xmlReader); – Bala

+7

Pourquoi les 503 se produisaient: http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Bala

+1

Au lieu de désactiver la DTD, je l'ai téléchargée et l'ai ajoutée à mon logiciel en tant que ressource intégrée; et ainsi, quand l'analyseur le veut, je lui donne ma copie locale/téléchargée/en cache de la DTD, au lieu de l'obtenir sur Internet. C'est mieux je pense que de désactiver complètement le traitement DTD. – ChrisW

7

Cela résout le problème:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      factory.setValidating(false); 
      factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
      Document document = factory.newDocumentBuilder().parse(is); 
Questions connexes