Yes, you just need to implement the LSResourceResolver class that can read the schema addresses you specify:
protected void validateDomResult(DOMResult domResult, String schemaFile) throws SAXException, IOException, Exception {
Schema schema = createSchema(schemaFile);
javax.xml.validation.Validator validator = schema.newValidator();
ErrorHandler mySchemaErrorHandler = new LoggingErrorHandler();
validator.setErrorHandler(mySchemaErrorHandler);
DOMSource domSource = new DOMSource(domResult.getNode());
validator.validate(domSource);
if (((LoggingErrorHandler) mySchemaErrorHandler).isError()) {
throw new Exception("Validation Error");
}
}
protected Schema createSchema(String baseSchemaFilePath) throws Exception {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
LSResourceResolver resourceResolver = (LSResourceResolver) new LocalSchemaLSResourceResolver();
factory.setResourceResolver(resourceResolver);
Schema schema = factory.newSchema(new File(baseSchemaFilePath));
return schema;
}
LSResourceResolver, xsd :
public class LocalSchemaLSResourceResolver implements LSResourceResolver{
protected final Log logger = LogFactory.getLog(getClass());
public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
LSInput input = new DOMInputImpl();
try {
FileInputStream fis = new FileInputStream(new File("classpath:xsd/" + systemId));
input.setByteStream(fis);
return input;
} catch (FileNotFoundException ex) {
logger.error("File Not found", ex);
return null;
}
}
}