У меня есть 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 ко второй настройке?