Given that you are using Xerces (or the default JDK), did you try setting this function to true in factory: http://apache.org/xml/features/validation/schema . There are other functions that you can play with regards to schemes: http://xerces.apache.org/xerces2-j/features.html
UPDATE 2 (for caching):
Deploy org.w3c.dom.ls.LSResourceResolver and set it to SchemaFactory using the setResourceResolver method. This resolver will either get the circuit from the cache or retrieve it from where it relates.
UPDATE 3:
LSResourceresolver example (which I think would be a good starting point for you):
public class URLBasedResourceResolver implements LSResourceResolver { private static final Logger log = LoggerFactory .getLogger(URLBasedResourceResolver.class); private final URI base; private final Map<URI, String> nsmap; public URLBasedResourceResolver(URL base, Map<URI, String> nsmap) throws URISyntaxException { super(); this.base = base.toURI(); this.nsmap = nsmap; } @Override public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { if (log.isDebugEnabled()) { String msg = String .format("Resolve: type=%s, ns=%s, publicId=%s, systemId=%s, baseUri=%s.", type, namespaceURI, publicId, systemId, baseURI); log.debug(msg); } if (type.equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) { if (namespaceURI != null) { try { URI ns = new URI(namespaceURI); if (nsmap.containsKey(ns)) return new MyLSInput(base.resolve(nsmap.get(ns))); } catch (URISyntaxException e) {
The implementation of MyLSInput is really boring:
class MyLSInput implements LSInput { private final URI url; public MyLSInput(URI url) { super(); this.url = url; } @Override public Reader getCharacterStream() { return null; } @Override public void setCharacterStream(Reader characterStream) { } @Override public InputStream getByteStream() { return null; } @Override public void setByteStream(InputStream byteStream) { } @Override public String getStringData() { return null; } @Override public void setStringData(String stringData) { } @Override public String getSystemId() { return url.toASCIIString(); } @Override public void setSystemId(String systemId) { } @Override public String getPublicId() { return null; } @Override public void setPublicId(String publicId) { } @Override public String getBaseURI() { return null; } @Override public void setBaseURI(String baseURI) { } @Override public String getEncoding() { return null; } @Override public void setEncoding(String encoding) { } @Override public boolean getCertifiedText() { return false; } @Override public void setCertifiedText(boolean certifiedText) { } }
forty-two
source share