Вы должны иметь возможность реализовать пользовательский XMLResolver, который перенаправляет попытки извлечения внешних DTD в локальный ресурс (если ваш код анализирует только определенный тип документа, это часто является ресурсом класса прямо в JAR).
class CustomResolver implements javax.xml.stream.XMLResolver {
public Object resolveEntity(String publicID,
String systemID,
String baseURI,
String namespace)
throws XMLStreamException
{
if ("The public ID you expect".equals(publicID)) {
return getClass().getResourceAsStream("doc.dtd");
} else {
return null;
}
}
Обратите внимание, что некоторые документы содержат только "systemID", поэтому вам следует вернуться к проверке этого. Проблема с системным идентификатором заключается в том, что это должен быть «системный» URL-адрес, а не хорошо известный стабильный URI. На практике это часто используется, как если бы это был URI.
См. Метод setXMLResolver .