2009-06-15 13 views
6

Ich versuche, ein HTML-Dokument mit dem Doctype die Übergangs-dtd erklärt zu analysieren wie folgt zu verwenden:DTD-Download-Fehler beim Parsen von XHTML-Dokument in XOM

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

Wenn ich Builder.build auf dem Dokument zu tun, erhalte ich die folgende Ausnahme:

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) 

Wenn ich entfernen Die Deklaration des Dateityps analysiert sie gut. Ich kann erfolgreich die dtd von meinem Browser herunterladen, die mir sagt, dass die URL gültig ist. Ich möchte die Deklaration des Dokumenttyps nicht entfernen. Ist dort ein Weg, sagen Sie dem Erbauer, die dtd nicht herunterzuladen oder es mit einer alternativen dtd zur Verfügung zu stellen?

+0

Sie sind HTML ‚von den wilden‘ Parsen oder haben Sie erstellen/haben die Kontrolle über die Seiten Sie Parsen? – lucas

+0

Ich habe Kontrolle über den HTML-Code, den ich analysiere, also kann ich zumindest die Doctype-Deklaration entfernen. Aber ich versuche, gute Praktiken beizubehalten und die Doctype-Deklaration beizubehalten. – Bala

Antwort

3

Mit einem Blick auf die Javadoc für Builder, ich denke, Sie könnten eine EntityResolver über den Konstruktor, der eine XMLReader dauert. Ich würde es vermeiden, den Parser Dateien aus dem Internet herunterladen zu lassen.

+0

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

+7

Warum die 503 geschahen: http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Bala

+1

Anstatt die DTD zu deaktivieren, habe ich sie heruntergeladen und sie als eingebettete Ressource in meine Software eingefügt. Wenn der Parser das will, gebe ich ihm meine lokale/heruntergeladene/zwischengespeicherte Kopie der DTD, anstatt sie aus dem Internet zu holen. Das ist besser, als die DTD-Verarbeitung komplett zu deaktivieren. – ChrisW

7

Dies löst das Problem:

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