Ошибка загрузки DTD при разборе документа XHTML в XOM

Я пытаюсь разобрать HTML-документ с объявленным типом документа для использования переходного dtd следующим образом:

‹! DOCTYPE html PUBLIC" - // W3C // DTD XHTML 1.0 Transitional // EN "" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd "›

Когда я выполняю Builder.build для документа, я получаю следующее исключение:

  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)

Если я удалю объявление типа документа, он отлично разбирается. Я могу успешно загрузить dtd из своего браузера, который сообщает мне, что URL-адрес действителен. Я не хочу удалять объявление типа документа. Есть ли способ запретить сборщику загружать dtd или предоставить ему альтернативный dtd?


person Bala    schedule 15.06.2009    source источник
comment
Вы анализируете html из «дикой природы» или вы создавали / контролировали страницы, которые вы анализируете?   -  person lucas    schedule 16.06.2009
comment
У меня есть контроль над HTML-кодом, который я анализирую, поэтому, по крайней мере, я могу удалить объявление doctype. Но я стараюсь придерживаться хороших практик и сохранять декларацию doctype.   -  person Bala    schedule 16.06.2009


Ответы (2)


Быстрый просмотр документации javadoc для Builder, я думаю, вы могли бы предоставить EntityResolver через конструктор, который принимает XMLReader. Я бы по возможности не позволял парсеру загружать файлы из Интернета.

person McDowell    schedule 15.06.2009
comment
org.apache.xerces.parsers.SAXParser xmlReader = новый SAXParser (); xmlReader.setFeature (apache.org/xml/features/nonvalidating/load-external- dtd, ложь); Строитель xomBuilder = новый Строитель (xmlReader); - person Bala; 16.06.2009
comment
Почему происходили 503-е: w3.org/blog/systeam/2008/ 08.02 / w3c_s_excessive_dtd_traffic - person Bala; 16.06.2009
comment
Вместо того, чтобы отключить DTD, я загрузил его и добавил в свое программное обеспечение в качестве встроенного ресурса; и поэтому, когда синтаксический анализатор этого требует, я передаю ему свою локальную / загруженную / кэшированную копию DTD, вместо того, чтобы получать ее из Интернета. Я думаю, это лучше, чем полное отключение обработки DTD. - person ChrisW; 16.08.2009

Это решает проблему:

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);
person agori    schedule 26.01.2010