Могут ли Xerces одновременно поддерживать XMLCatalogResolver и <xs: include />?
Xerces утверждает, что разрешает добавление поддержки XML Catalog в читатель следующим образом:
XMLCatalogResolver resolver = new XMLCatalogResolver();
resolver.setPreferPublic(true);
resolver.setCatalogList(catalogs);
XMLReader reader = XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
reader.setProperty("http://apache.org/xml/properties/internal/entity-resolver",
resolver);
Но как только я это сделаю, то любой <xs:include/>
теги в моих схемах больше не обрабатываются. Кажется, что XMLCatalogResolver
становится единственным доступным местом для разрешения сущностей после его добавления, поэтому включаемые функции больше не работают. Eclipse OTOH успешно проверяет, используя тот же каталог, поэтому это должно быть возможно.
Есть ли способ обойти это, или есть другие валидаторы на основе Java, которые поддерживают каталоги?
Спасибо, Доминик.
1 ответ
Я наконец решил это, переопределив 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, но, надеюсь, это поможет следующему человеку, столкнувшемуся с этой проблемой.