在运行时加载模式进行XML验证,失败取决于模式顺序。

6

我在尝试进行XML验证。运行时我得到一个模式列表(可能包装在JAR中)。验证的结果取决于我提供模式的顺序。

这是我的做法:

  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根元素相对应的模式开头,则此方法将失败。这个问题有解决办法吗?还是我做错了什么?


你能把模式和XML发布到某个地方吗? - davidfmatheson
很遗憾,这是不可能的。我可以说这是一组模式,包括根模式和第二个模式,允许用不同的标签替换第一个模式的主体。 - John B
2个回答

5

我在这个链接中遇到了HTTP 404错误,请提供一些额外的细节信息好吗? - John B
另外,我需要加载2个模式(每个模式导入其他的模式)。如果按正确顺序加载,则一切正常。否则,会出现问题。这两个模式具有不同的目标名称空间。 - John B
尝试搜索它而不是将其用作URL。这是一个JAXP选项名称,而不是URL。(好吧,有些浏览器通过合并地址栏和搜索栏使这变得困难。通过访问google.com以旧方式进行)。 - Michael Kay
当我尝试在工厂上设置上述功能时,我收到以下错误信息:SAXNotRecognizedException: Feature "http://apache.org/xml/features/validation/schema/handle-multiple-imports" is not recognized - John B
也许你正在使用 JDK 版本的 Xerces 而不是 Apache 版本?但很抱歉,我已经指出了正确的方向,但我不能再提供更多支持我的竞争对手的产品! - Michael Kay
SchemaFactory的类是:com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory,所以这是Apache,对吧?使用它(使用xml-apis的2.0.2版本),我仍然会得到上述功能的SAXNotRecognizedException - John B

0
首先,您必须通过调用registerErrorHandler()方法在XML阅读器上设置org.xml.sax.ErrorHandler对象的实例。您可能会收到警告,这将为您提供有关问题的线索。
其次,您必须知道您正在使用哪个xml库。在您的代码中调用schemaFactory.getClass().getName()并打印它。一旦您知道库,您可以参考其文档,以确定它是否支持打开/关闭多个模式导入功能。

类是com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory - John B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接