2009-06-15 9 views
6

Próbuję analizować dokument HTML z doctype deklarowanej używać z DTD przejściowy następująco:DTD Błąd podczas parsowania pobierz dokument XHTML w Xóm

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

Kiedy zrobić Builder.build na dokumencie, pojawia się następujący wyjątek:

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) 

Jeśli usunąć deklaracja typu dokumentu, parsuje dobrze. Mogę pomyślnie pobrać dtd z mojej przeglądarki, która mówi mi, że adres URL jest ważny. Nie chcę usuwać deklaracji typu dokumentu. Czy istnieje sposób, aby powiedzieć konstruktorowi, aby nie pobierał pakietu dtd, ani nie dostarczał go pod za pomocą alternatywnego dtd?

+0

Czy parsowania HTML „na dziko” czy też tworzenia/kontrolę nad stronami jesteś parsowania? – lucas

+0

Mam kontrolę nad plikiem HTML, który parsuję, więc przynajmniej mogę usunąć deklarację doctype. Ale staram się trzymać dobrych praktyk i zachować deklarację doctype. – Bala

Odpowiedz

3

Szybkie spojrzenie na javadoc dla Builder, domyślam się, że mógłbyś dostarczyć EntityResolver przez konstruktora, który bierze XMLReader. Unikałbym, jeśli to możliwe, przesyłania plików do analizy parsera z Internetu.

+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

Dlaczego 503 działo się: http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic – Bala

+1

Zamiast wyłączać DTD, pobrałem go i dodałem do mojego oprogramowania jako zasób osadzony; tak więc, gdy parser tego chce, podaję moją lokalną/pobraną/zapisaną w pamięci podręcznej kopię DTD, zamiast odbierać ją z Internetu. Wydaje mi się to lepsze niż całkowite wyłączenie przetwarzania DTD. – ChrisW

7

To rozwiązuje 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); 
Powiązane problemy