Как разобрать xhtml, игнорируя объявление DOCTYPE, используя анализатор DOM - PullRequest
4 голосов
/ 15 апреля 2010

Я сталкиваюсь с проблемой разбора xhtml при объявлении DOCTYPE с использованием синтаксического анализатора DOM.

Ошибка: java.io.IOException: сервер возвратил код ответа HTTP: 503 для URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd%20

Объявление: DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

Есть ли способ синтаксического анализа xhtml в объекте Document, игнорируя объявление DOCTYPE.

Ответы [ 4 ]

4 голосов
/ 30 июля 2010

Решение, которое работает для меня, заключается в предоставлении DocumentBuilder поддельного резольвера, который возвращает пустой поток. Здесь есть хорошее объяснение (посмотрите последнее сообщение от kdgregory)

http://forums.sun.com/thread.jspa?threadID=5362097

вот решение kdgregory:

documentBuilder.setEntityResolver(new EntityResolver()
        {
            public InputSource resolveEntity(String publicId, String systemId)
                throws SAXException, IOException
            {
                return new InputSource(new StringReader(""));
            }
        });
1 голос
/ 27 июля 2010

Самое простое, что нужно сделать, это установить validating = false в вашем DocumentBuilderFactory.Если вы хотите выполнить проверку, загрузите DTD и используйте локальную копию.Как прокомментировал Рэйчел выше, это обсуждается на Консорциуме WWW.

Короче говоря, поскольку DocumentBuilderFactory по умолчанию загружает DTD каждый раз, когда он проверяет, W3 получал удар каждый раз, когда типичныйПрограммист попытался разобрать файл XHTML в Java.Они не могут позволить себе так много трафика, поэтому они отвечают с ошибкой.

1 голос
/ 15 апреля 2010

Для синтаксического анализатора требуется для загрузки DTD, но вы можете обойти его, установив отдельный атрибут в строке <?xml... ?>.

Обратите внимание, что эта конкретная ошибка, скорее всего, вызвана путаницей между определениями схемы XML и URL-адресами DTD. Подробнее см. http://www.w3schools.com/xhtml/xhtml_dtd.asp. Правильный:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
0 голосов
/ 18 сентября 2016

Вместо поддельного распознавателя, следующий фрагмент кода указывает парсеру действительно игнорировать внешнее DTD из объявления DOCTYPE:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

(...)

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
f.setValidating(false);
f.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder builder = f.newDocumentBuilder();
Document document = builder.parse( ... )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...