我终于通过覆盖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 中默认情况下不会这样做,但希望这对遇到此问题的下一个人有所帮助。