6

我正在尝试进行 xml 验证。我在运行时得到了一个模式列表(可能包装在一个罐子里)。根据我向 SchemaFactory 提供模式的顺序,验证通过或失败。

这是我正在做的事情:

  private void validateXml(String xml, List<URI> schemas){
        Source[] source = new StreamSource[schemas.size()];
        int i=0;
        for (URI f : schemas){
           source[i++] = new StreamSource(f.openStream());
        }

        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI);
        sf.setResourceResolver(new MyClassPathResourceResolver());

        Schema schema = schemaFactory.newSchema(source);
        Validator validator = schema.newValidator();
        validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes()));

同样,如果传递的模式集不以 xml 的根元素所引用的模式开头,则此操作将失败。有解决办法还是我做错了什么?

4

2 回答 2

5

默认情况下,如果 Xerces 已经有相同命名空间的模式文档,它将忽略模式文档。可以使用 factory 选项更改此行为

http://apache.org/xml/features/validation/schema/handle-multiple-imports

于 2012-08-07T20:16:25.997 回答
0

首先,您必须通过调用 registerErrorHandler() 方法在 XML 阅读器上设置 org.xml.sax.ErrorHandler 对象的实例。您可能会收到警告,为您提供有关问题的线索。

其次,您必须知道您使用的是哪个 xml 库。在您的代码中调用 schemaFactory.getClass().getName() 并打印它。了解库后,如果它支持打开/关闭多个模式导入的功能,则可以参考其文档。

于 2012-08-28T09:49:38.250 回答