Отключение валидации DOM XML Parser
От: Maxleikin  
Дата: 20.02.08 10:33
Оценка:
Всем доброго времени!

Проблема: Реализован Java DOM XML Parser. Он натравливается на web.xml, содержащий DOCTYPE ссылку на внешний DTD файл. При реализации парсера указано setValidating(false) однако он все равно пытается лезть за DTD и выдает ошибку Connection timed out.
Если кто сталкивался, подскажите плз, как запретить проверять DTD.
Re: Отключение валидации DOM XML Parser
От: Blazkowicz Россия  
Дата: 20.02.08 10:57
Оценка:
Здравствуйте, Maxleikin, Вы писали:

M>Проблема: Реализован Java DOM XML Parser. Он натравливается на web.xml, содержащий DOCTYPE ссылку на внешний DTD файл. При реализации парсера указано setValidating(false) однако он все равно пытается лезть за DTD и выдает ошибку Connection timed out.

M>Если кто сталкивался, подскажите плз, как запретить проверять DTD.
Попробуй ещё
setFeature
Не помню только что именно там для DTD надо писать.
Посмотри ещё EntityResolver. Установив свой по идее можно перехватить обращение к DTD ресурсу.
Re[2]: Отключение валидации DOM XML Parser
От: C0s Россия  
Дата: 20.02.08 12:01
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>setFeature

B>Не помню только что именно там для DTD надо писать.

я где-то месяца четыре назад бился всю ночь над этой задачей. надо было к утру иметь работающий вариант.
имени фичи я так и не нашёл (речь идёт о парсере, входящем в стандартную поставку java5, который используется jaxb'ом), хотя обгуглился и обчитался по самое не хочу

буду рад, если всё-таки найдётся "правильное" имя

B>Посмотри ещё EntityResolver. Установив свой по идее можно перехватить обращение к DTD ресурсу.


именно так и победил эту штуку — у себя закэшировал содержимое dtdшки (загружается как ресурс), а в entity resolver'е его ловко подсовывал.
т.е. валидация по DTD не была отключена в этом варианте, просто сам DTD загружался "не откуда-то", а подсовывался мной

по большому счёту, эта проблема потом рассосалась сама собой, т.к. на стороне, генерирующей xml достаточно было перестать ссылаться на DTD (при этом на моей стороне используется валидация схемой)
Re[3]: Отключение валидации DOM XML Parser
От: Blazkowicz Россия  
Дата: 20.02.08 12:05
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>я где-то месяца четыре назад бился всю ночь над этой задачей. надо было к утру иметь работающий вариант.

C0s>имени фичи я так и не нашёл (речь идёт о парсере, входящем в стандартную поставку java5, который используется jaxb'ом), хотя обгуглился и обчитался по самое не хочу
C0s>буду рад, если всё-таки найдётся "правильное" имя

Если есть stacktrace ошибки, то это максимум минут на 30 поисков по исходникам J2SE.
Re[4]: Отключение валидации DOM XML Parser
От: C0s Россия  
Дата: 20.02.08 12:09
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Если есть stacktrace ошибки, то это максимум минут на 30 поисков по исходникам J2SE.


дело не в стектрейсе. естественно, исходники поднимались, просто сейчас я уже плохо помню, что именно не получалось.
вроде как, не вышло именно найти имя фичи, которая бы привела к отмене валидации.
т.е. что-то валилось на моменте установки фичи типа с ошибкой "не знаю такой фичи", а что-то проглатывалось, но не приводило к ожидаемому результату
Re[5]: Отключение валидации DOM XML Parser
От: Blazkowicz Россия  
Дата: 20.02.08 12:16
Оценка: 3 (1)
Здравствуйте, C0s, Вы писали:

C0s>дело не в стектрейсе. естественно, исходники поднимались, просто сейчас я уже плохо помню, что именно не получалось.

C0s>вроде как, не вышло именно найти имя фичи, которая бы привела к отмене валидации.
C0s>т.е. что-то валилось на моменте установки фичи типа с ошибкой "не знаю такой фичи", а что-то проглатывалось, но не приводило к ожидаемому результату

Неполенился, посмотрел. Обнаружил:
com.sun.org.apache.xerces.internal.impl.Constants

    public static final String VALIDATION_FEATURE = "validation";
    public static final String IS_STANDALONE_FEATURE = "is-standalone";
    public static final String RESOLVE_DTD_URIS_FEATURE = "resolve-dtd-uris";
    public static final String LOAD_DTD_GRAMMAR_FEATURE = "nonvalidating/load-dtd-grammar";
    public static final String LOAD_EXTERNAL_DTD_FEATURE = "nonvalidating/load-external-dtd";


Но, надо ещё разбиратся что там в DOM используется, а что нет.
Без stacktrace сканировать где же этот DTD запрашивается, как-то не особо интересно.
Re[6]: Отключение валидации DOM XML Parser
От: C0s Россия  
Дата: 20.02.08 12:18
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Но, надо ещё разбиратся что там в DOM используется, а что нет.


спс, если будет время, я вернусь-таки к тому куску, может, что-то и накопается
Re[7]: Отключение валидации DOM XML Parser
От: Maxleikin  
Дата: 20.02.08 13:18
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, Blazkowicz, Вы писали:


B>>Но, надо ещё разбиратся что там в DOM используется, а что нет.


C0s>спс, если будет время, я вернусь-таки к тому куску, может, что-то и накопается


Уффф, заработало.
Вот код:

Document doc = null;

try
{
DOMParser dp = new DOMParser();
dp.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
InputSource ip = new InputSource(is);
dp.parse(ip);
doc = dp.getDocument();
if (doc != null)
{
processDomTree(doc);
}
}
catch (Exception e)
{
System.err.println("Sorry, an error occurred: " + e);
}

Все участвовавшим в обсуждении огромное спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.