您需要使用LSResourceResolver才能正常工作。请查看下面的示例代码。
验证方法:
// note that if your XML already declares the XSD to which it has to conform, then there's no need to declare the schemaName herevoid validate(String xml, String schemaName) throws Exception { documentBuilderFactory builderFactory = documentBuilderFactory.newInstance(); builderFactory.setNamespaceAware(true); documentBuilder parser = builderFactory .newdocumentBuilder(); // parse the XML into a document object document document = parser.parse(new StringInputStream(xml)); SchemaFactory factory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // associate the schema factory with the resource resolver, which is responsible for resolving the imported XSD's factory.setResourceResolver(new ResourceResolver()); // note that if your XML already declares the XSD to which it has to conform, then there's no need to create a validator from a Schema object Source schemaFile = new StreamSource(getClass().getClassLoader() .getResourceAsStream(schemaName)); Schema schema = factory.newSchema(schemaFile); Validator validator = schema.newValidator(); validator.validate(new DOMSource(document));}资源解析器实现:
public class ResourceResolver implements LSResourceResolver {public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { // note: in this sample, the XSD's are expected to be in the root of the classpath InputStream resourceAsStream = this.getClass().getClassLoader() .getResourceAsStream(systemId); return new Input(publicId, systemId, resourceAsStream);} }资源解析器返回的Input实现:
public class Input implements LSInput {private String publicId;private String systemId;public String getPublicId() { return publicId;}public void setPublicId(String publicId) { this.publicId = publicId;}public String getbaseURI() { return null;}public InputStream getByteStream() { return null;}public boolean getCertifiedText() { return false;}public Reader getCharacterStream() { return null;}public String getEncoding() { return null;}public String getStringData() { synchronized (inputStream) { try { byte[] input = new byte[inputStream.available()]; inputStream.read(input); String contents = new String(input); return contents; } catch (IOException e) { e.printStackTrace(); System.out.println("Exception " + e); return null; } }}public void setbaseURI(String baseURI) {}public void setByteStream(InputStream byteStream) {}public void setCertifiedText(boolean certifiedText) {}public void setCharacterStream(Reader characterStream) {}public void setEncoding(String encoding) {}public void setStringData(String stringData) {}public String getSystemId() { return systemId;}public void setSystemId(String systemId) { this.systemId = systemId;}public BufferedInputStream getInputStream() { return inputStream;}public void setInputStream(BufferedInputStream inputStream) { this.inputStream = inputStream;}private BufferedInputStream inputStream;public Input(String publicId, String sysId, InputStream input) { this.publicId = publicId; this.systemId = sysId; this.inputStream = new BufferedInputStream(input);}}


