假设您使用的是Xerces(或JDK的默认设置),是否尝试过在工厂将该功能设置为true:http
:
//apache.org/xml/features/validation/schema。关于架构,您还可以使用其他功能:http
:
//xerces.apache.org/xerces2-j/features.html
更新2(用于缓存):
实施
org.w3c.dom.ls.LSResourceResolver并
SchemaFactory使用
setResourceResolver方法设置该值。该解析器将从缓存中获取架构,或者从位置引用的任何地方获取架构。
更新3:
LSResourceresolver示例(我认为这对您来说是一个很好的起点):
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;}@Overridepublic 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) { // ok } } } return null;}}MyLSInput的实现真的很无聊:
class MyLSInput implements LSInput {private final URI url;public MyLSInput(URI url) { super(); this.url = url;}@Overridepublic Reader getCharacterStream() { return null;}@Overridepublic void setCharacterStream(Reader characterStream) {}@Overridepublic InputStream getByteStream() { return null;}@Overridepublic void setByteStream(InputStream byteStream) {}@Overridepublic String getStringData() { return null;}@Overridepublic void setStringData(String stringData) {}@Overridepublic String getSystemId() { return url.toASCIIString();}@Overridepublic void setSystemId(String systemId) {}@Overridepublic String getPublicId() { return null;}@Overridepublic void setPublicId(String publicId) {}@Overridepublic String getbaseURI() { return null;}@Overridepublic void setbaseURI(String baseURI) {}@Overridepublic String getEncoding() { return null;}@Overridepublic void setEncoding(String encoding) {}@Overridepublic boolean getCertifiedText() { return false;}@Overridepublic void setCertifiedText(boolean certifiedText) {}}


