Как включить DTD в файл XML, который будет загружен с помощью getResourceAsStream ()? - PullRequest
1 голос
/ 26 ноября 2008

У меня есть XML-файл ('videofaq.xml'), который определяет DTD с использованием следующего DOCTYPE

<!DOCTYPE video-faq SYSTEM "videofaq.dtd">

Я загружаю файл из classpath (фактически из JAR) во время инициализации сервлета, используя:

getClass().getResourceAsStream("videofaq.xml")

XML найден правильно, но для DTD в том же пакете Xerces выдает мне исключение FileNotFoundException и отображает путь к сценарию запуска Tomcat с добавлением «videofaq.dtd» в конце. Какие советы, если таковые имеются, я могу передать Xerces, чтобы он правильно загружал DTD?

Ответы [ 4 ]

1 голос
/ 28 ноября 2008

Будет работать пользовательский EntityResolver, но вы можете избежать создания пользовательского класса, установив SystemID, чтобы процессор мог «находить» относительные пути.

http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5

Предоставляя системный идентификатор как Параметр StreamSource, вы говоря процессору XSLT, где ищите commonFooter.xslt. Без этот параметр, вы можете столкнуться с ошибка, когда процессор не может разрешить этот URI. Простое решение заключается в вызвать метод setSystemId () как следующим образом:

// construct a Source that reads from an InputStream
Source mySrc = new StreamSource(anInputStream);
// specify a system ID (a String) so the 
// Source can resolve relative URLs
// that are encountered in XSLT stylesheets
mySrc.setSystemId(aSystemId);
1 голос
/ 26 ноября 2008

Когда вы делаете

getClass().getResourceAsStream("videofaq.xml")

Это не xerces, который вы вызываете, и поэтому, когда вы передаете поток xerces, он не может знать, откуда загружается файл. Он загружает его из корневого пути приложения (который вы описали).

Простым решением было бы указать полный путь в вашем XML-файле к dtd.

Кроме того, xerces, кажется, пробует несколько мест. Поэтому вам следует взглянуть на механизм кэширования грамматики или средства распознавания сущностей (которые используются в таком порядке, я думаю).

Документ грамматики Xerces: http://xerces.apache.org/xerces2-j/faq-grammars.html

Особенности Xerces use-entity-resolver2: http://xerces.apache.org/xerces2-j/features.html

0 голосов
/ 26 ноября 2008

В общем, пытайтесь использовать перегрузки метода, которые принимают URL (обычно в виде строки с именем параметра, например, «systemId») при указании ввода для синтаксического анализатора XML. Это позволяет анализатору разрешать относительные ссылки для вас и предоставлять лучшие сообщения об ошибках.

Итак, в вашем случае найдите DTD в том же пакете с videofaq.xml и передайте результат String getClass().getResource("videofaq.xml") в анализатор XML.

0 голосов
/ 26 ноября 2008

При использовании SAX вы можете указать свой собственный EntityResolver, который затем загружает ресурс любым способом.

...