Может ли Xerces поддерживать XMLCatalogResolver ив то же время? - PullRequest
1 голос
/ 02 апреля 2012

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 становится единственным местом для разрешения сущностей после того, как оно добавлено, поэтому include больше не может работать.Eclipse OTOH успешно проверяет, используя тот же каталог, так что это должно быть возможно.

Есть ли способ обойти это или есть другие валидаторы на основе Java, которые поддерживают каталоги?

Спасибо, Доминик.

1 Ответ

1 голос
/ 06 апреля 2012

Я наконец решил эту проблему, переопределив 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, но, надеюсь, это поможет следующему, кто столкнется с этой проблемой.

...