Я наконец решил эту проблему, переопределив XMLCatalogResolver
и зарегистрировав различные вызовы, сделанные к методу resolveEntity()
. Я наблюдал 3 типа вызовов, только один из которых имел смысл разрешать с помощью каталога XML. Итак, я просто возвратил FileInputStream
напрямую для двух других типов вызовов.
Вот код, который я использовал внутри своего пользовательского XMLCatalogResolver
класса:
public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)
throws IOException
{
if(resourceIdentifier.getExpandedSystemId() != null)
{
return new XMLInputSource(resourceIdentifier.getPublicId(),
resourceIdentifier.getLiteralSystemId(),
resourceIdentifier.getBaseSystemId(),
new FileReader(getFile(resourceIdentifier.getExpandedSystemId())),
"UTF-8");
}
else if((resourceIdentifier.getBaseSystemId() != null) &&
(resourceIdentifier.getNamespace() == null))
{
return new XMLInputSource(resourceIdentifier.getPublicId(),
resourceIdentifier.getLiteralSystemId(),
resourceIdentifier.getBaseSystemId(),
new FileReader(getFile(resourceIdentifier.getBaseSystemId())),
"UTF-8");
}
else
{
return super.resolveEntity(resourceIdentifier);
}
}
private File getFile(String urlString) throws MalformedURLException
{
URL url = new URL(urlString);
return new File(url.toURI());
}
Я не уверен, почему это не будет сделано по умолчанию в Xerces, но, надеюсь, это поможет следующему, кто столкнется с этой проблемой.