2009-06-15 8 views
6

Estoy tratando de analizar un documento HTML con el tipo de documento declarado utilizar el DTD de transición de la siguiente manera:!DTD error de descarga al analizar documento XHTML en XOM

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

Cuando hago Builder.build en el documento, me sale el siguiente excepción:

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 quito la declaración del tipo de documento, analiza muy bien. Puedo descargar con éxito el dtd de mi navegador, lo que me indica que la url es válida. No quiero eliminar la declaración del tipo de documento. ¿Hay alguna forma en que el indique al desarrollador que no descargue el dtd o que lo proporcione con un dtd alternativo?

+0

¿Está análisis de HTML a partir de 'la naturaleza' o qué creó/tienen control sobre las páginas que estés análisis sintáctico? – lucas

+0

Tengo control sobre el html que estoy analizando, por lo que al menos puedo eliminar la declaración del tipo de documento. Pero trato de seguir las buenas prácticas y conservar la declaración del tipo de documento. – Bala

Respuesta

3

Echando un vistazo rápido al javadoc para Builder, supongo que podría proporcionar un EntityResolver a través del constructor que toma un XMLReader. Evitaría que el analizador descargue archivos de Internet siempre que sea posible.

+0

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

+7

Por qué estaban ocurriendo los 503: http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Bala

+1

En lugar de deshabilitar el DTD, lo descargué y lo agregué a mi software como un recurso incrustado; y entonces, cuando el analizador lo quiere, le doy mi copia local/descargada/en caché de la DTD, en lugar de obtenerla de Internet. Creo que es mejor que deshabilitar por completo el procesamiento DTD. – ChrisW

7

Esto resuelve el 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); 
Cuestiones relacionadas