模式来自类路径时,Java XML验证不起作用

维克托·柳博斯拉夫斯基(Victor Lyuboslavsky):

我正在根据架构验证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.

约翰·沃茨(John Watts):

将文件传递给StreamSource时,InputStream设置为文件的内容,而且systemId设置为文件的URL。这样可以解析架构中的相对URI。如果您的架构具有任何相对URL,则绝对是您的问题。为了在从类路径读取架构时使这些相对URL可解析,您需要实现EntityResolver如果您不使用相对URI,则systemId为null可能还会产生其他更细微的影响。我建议使用构造函数

StreamSource(InputStream inputStream, String systemId)

尝试将systemId设置为:null,包含架构的File,其他文件,一个不存在的File。这可能会提示您Validator对systemId的操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章