Ошибка загрузки DTD при разборе документа XHTML в XOM - PullRequest
6 голосов
/ 16 июня 2009

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

<! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" «<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="nofollow noreferrer">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?

Ответы [ 2 ]

7 голосов
/ 26 января 2010

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

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);
3 голосов
/ 16 июня 2009

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

...