我正在根据架构验证XML文档。尝试使用以下代码验证某些更复杂的文档/方案时,总是会失败:
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setNamespaceAware(true);
dbfac.setIgnoringElementContentWhitespace(true);
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.parse("sampleResponse.xml");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));
Schema schema = schemaFactory.newSchema(schemaSource);
Validator validator = schema.newValidator();
Source source = new DOMSource(doc);
// Set a custom error handler that simple re-throws every exception
validator.setErrorHandler(new ValidationErrorHandler());
validator.validate(source);
问题是这一行:
Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));
如果我将模式作为文件读取,则可以使用:
Source schemaSource = new StreamSource(new File("somepath/SampleResponse.xsd"));
当我直接从类路径中获取架构时,为什么验证不起作用?
(在Windows 7 64位上使用Java 1.6)
失败时出现异常消息: Could not validate against schema SampleResponse.xsd. Nested exception: src-resolve: Cannot resolve the name 'oa:Attachments' to a(n) 'element declaration' component.
将文件传递给StreamSource时,InputStream设置为文件的内容,而且systemId设置为文件的URL。这样可以解析架构中的相对URI。如果您的架构具有任何相对URL,则绝对是您的问题。为了在从类路径读取架构时使这些相对URL可解析,您需要实现EntityResolver。如果您不使用相对URI,则systemId为null可能还会产生其他更细微的影响。我建议使用构造函数
StreamSource(InputStream inputStream, String systemId)
尝试将systemId设置为:null,包含架构的File,其他文件,一个不存在的File。这可能会提示您Validator对systemId的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句