2009-06-15 11 views
6

Sto cercando di analizzare un documento HTML con il DOCTYPE dichiarato di utilizzare la DTD transitoria come segue:!DTD errore di download durante l'analisi documento XHTML in XOM

< DOCTYPE HTML PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

Quando faccio Builder.build sul documento, ottengo la seguente eccezione:

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) 

Se rimuovo la dichiarazione del tipo di documento, viene analizzata correttamente. Posso scaricare correttamente il dtd dal mio browser, che mi dice che l'URL è valido. Non voglio rimuovere la dichiarazione del tipo di documento. È un modo dire al costruttore di non scaricare il dtd o fornirlo con un dtd alternativo?

+0

State parsing del codice HTML da 'selvaggio' o avete creato/avere il controllo sulle pagine che stai parsing? – lucas

+0

Ho il controllo sull'html che sto analizzando, quindi per lo meno posso rimuovere la dichiarazione doctype. Ma sto cercando di attenermi alle buone pratiche e mantenere la dichiarazione del doctype. – Bala

risposta

3

Dando uno sguardo veloce a javadoc per Builder, suppongo che potresti fornire un EntityResolver tramite il costruttore che prende uno XMLReader. Eviterei di lasciare che il parser scarichi i file da internet dove possibile.

+0

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

+7

Perché i 503 stavano accadendo: http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Bala

+1

Invece di disattivare il DTD, l'ho scaricato e aggiunto al mio software come risorsa incorporata; e quindi, quando il parser lo vuole, gli do la mia copia locale/scaricata/memorizzata nella cache della DTD, invece di ottenerla da internet. Questo è meglio penso che disabilitare completamente l'elaborazione DTD. – ChrisW

7

Questo risolve il problema:

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); 
Problemi correlati