Проверка XMLSchema с файлом Catalog.xml для разрешения сущностей

У меня есть schema.xsd который включает и изменяет xhtml следующим образом:

<xs:redefine schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
...
</xs:redefine>

Теперь я написал валидатор, который

  • читает схему из XML-файла
  • использует CatalogManager для разрешения сущностей

он работает нормально, так как он не загружает файлы из сети, а находит xhtml11.xsd, как указано в моем catalog.xml файл.

public class XmlTemplateValidator implements TemplateValidator
{
    public List<SAXParseException> validate ( String xml ) throws Exception
    {
        Reader input = new StringReader(xml);
        InputSource inputSource = new InputSource(input);

        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setNamespaceAware(true);
        factory.setValidating(true);
        SAXParser parser = factory.newSAXParser();
        parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
        XMLReader reader = parser.getXMLReader();
        reader.setEntityResolver(new CatalogResolver());
        DefaultErrorHandler handler = new DefaultErrorHandler();
        reader.setErrorHandler(handler);
        reader.parse(inputSource);
        return handler.getSaxParseExceptions();
    }

}

Теперь я хочу точно такую ​​же вещь, но я хочу дать схему внутри моего валидатора (поэтому не позвольте автору сказать, в отношении какой схемы он должен проверяться, а скорее пусть валидатор решит, какую схему использовать.

public class NewXmlTemplateValidator implements TemplateValidator
{
    static final String schemaSource    = "schema.xsd";

    public List<SAXParseException> validate ( String xml ) throws Exception
    {
        Reader input = new StringReader(xml);
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        URL schemaUrl = getClass().getResource(schemaSource);
        Schema schema = factory.newSchema(schemaUrl);
        Validator validator = schema.newValidator();
        DefaultErrorHandler handler = new DefaultErrorHandler();
        validator.setErrorHandler(handler);
        Source source = new StreamSource(input);
        validator.validate(source);
        return handler.getSaxParseExceptions();
    }
}

Это работает, но он загружает все файлы xhtml из сети, что занимает довольно много времени и не то, что я хочу.

Поэтому я хочу проверить строку XML в соответствии с предопределенной схемой с правильным разрешением сущности с помощью определения catalog.xml.

Как я могу легко добавить CatalogResolver для второй настройки?

1 ответ

Решение

Добавьте XMLCatalogResolver во втором примере следующим образом:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL schemaUrl = getClass().getResource(schemaSource);
String catalog = getClass().getResource("/catalog.xml").getFile();
XMLCatalogResolver resolver = new XMLCatalogResolver(new String[] { catalog });
factory.setResourceResolver(resolver);
Другие вопросы по тегам