2010-02-09 2 views
2

Я применяю xslt к файлу HTML (уже отфильтрованному и упорядоченному, чтобы его можно было анализировать как XML).Ошибка при доступе к w3.org при применении XSLT

Мой код выглядит следующим образом:

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
this.xslt = transformerFactory.newTransformer(xsltSource); 
xslt.transform(sanitizedXHTML, result); 

Однако я получаю сообщение об ошибке для каждого DOCTYPE нашел, как это:

ERROR: 'Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/html4/loose.dtd '

У меня нет проблем с доступом к DTDs из моего браузера.

У меня мало контроля над анализируемым HTML-кодом, и я не могу разорвать DOCTYPE, поскольку мне нужны они для сущностей.

Любая помощь приветствуется.

EDIT:

Я пытался отключить проверку DTD так:

private Source getSource(StreamSource sanitizedXHTML) throws ParsingException { 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    spf.setNamespaceAware(false); 
    spf.setValidating(false); // Turn off validation 

    XMLReader rdr; 

    try { 
     rdr = spf.newSAXParser().getXMLReader(); 
    } catch (SAXException e) { 
     throw new ParsingException(e); 
    } catch (ParserConfigurationException e) { 
     throw new ParsingException(e); 
    } 

    InputSource inputSrc = new InputSource(sanitizedXHTML.getInputStream()); 
    return new SAXSource(rdr, inputSrc); 
} 

, а затем просто назвав его ...

Source source = getSource(sanitizedXHTML); 
    xslt.transform(source, result); 

Ошибка сохраняется.

EDIT 2:

Написал разрешения сущности, и есть HTML 4.01 Transitional DTD на моем локальном диске. Тем не менее, я получаю эту ошибку прямо сейчас:

ERROR: 'The declaration for the entity "HTML.Version" must end with '>'.'

ОТД является как, скачанный с w3.org

ответ

2

У меня есть несколько предложений в качестве answer на соответствующий вопрос.

В частности, при анализе XML-документа вы можете отключить проверку DTD, чтобы предотвратить попытки анализатора DTD. В качестве альтернативы вы можете использовать свой собственный распознаватель сущности, чтобы вернуть локальную копию DTD вместо того, чтобы получать ее по сети.


Edit: Просто вызова setValidating(false) на SAX Parser Factory не может быть достаточно, чтобы предотвратить парсер загрузку внешнего DTD. Парсер может нуждаться в DTD для других целей, таких как определения сущностей. (Возможно, вы могли бы изменить свою фазу обработки/предварительной обработки HTML, чтобы заменить все ссылки на сущности эквивалентными ссылками на числовые символы, устраняя необходимость в DTD?)

Я не думаю, что есть standard SAX feature flag, который обеспечит, чтобы внешние Загрузка DTD полностью отключена, поэтому вам, возможно, придется использовать что-то конкретное для вашего синтаксического анализатора. Так что если вы используете Xerces, например, вы можете посмотреть Xerces-specific features и позвонить по телефону setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false), чтобы быть уверенным.

+0

Спасибо за совет, но проблема не устранена. Я только что отредактировал, как я пытался отключить проверку DTD. – Johnco

+0

Ваше редактирование сделало это! – Johnco

1

Предполагая, что вы хотите, чтобы DTD загрузился (для ваших объектов), вам нужно будет использовать распознаватель. Основная проблема, с которой вы сталкиваетесь, заключается в том, что W3C ограничивает доступ к URL-адресам для DTD по соображениям производительности (они не получают никакой производительности, если они этого не делают).

Теперь вы должны работать с локальной копией DTD и использовать каталог для обработки этого. Вы должны взглянуть на Apache Commons Resolver. Если вы не знаете, как использовать каталог, они хорошо документированы в Norm Walsh's article

Конечно, у вас возникнут проблемы, если вы выполните проверку. Это SGML DTD, и вы пытаетесь использовать его для XML. Это не сработает (возможно)

+0

Пробовал, получил ошибку при разборе локального DTD с диска. Проверьте мои изменения, пожалуйста. – Johnco

Смежные вопросы