【问题标题】:Validate XML with loading schemas at runtime, failure depending on schema order在运行时使用加载模式验证 XML,失败取决于模式顺序
【发布时间】:2012-08-07 18:55:21
【问题描述】:

我正在尝试进行 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 的根元素所引用的模式开头,则此操作将失败。有解决办法还是我做错了什么?

【问题讨论】:

  • 你能把架构和 XML 贴在某个地方吗?
  • @davidfmatheson 不幸的是,这是不可能的,我可以说它是一组模式,根模式和第二个模式,允许用不同的标签替换第一个模式的主体.

标签: java xml xml-validation


【解决方案1】:

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

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

【讨论】:

  • 我在此链接中收到 HTTP 404,您能否提供一些其他详细信息?
  • 另外,我需要加载 2 个模式(每个模式都导入附加模式)。如果我以正确的顺序加载这些,一切都很好。否则,没有快乐。这两种模式有不同的目标命名空间。
  • 尝试搜索它而不是将其用作 URL。这是一个 JAXP 选项名称而不是 URL。 (好吧,有些浏览器通过将地址栏和搜索栏结合起来使这变得困难。通过访问 google.com 以旧方式进行)。
  • 当我尝试在工厂设置上述功能时,我得到:SAXNotRecognizedException: Feature "http://apache.org/xml/features/validation/schema/handle-multiple-imports" is not recognized
  • 也许您使用的是 JDK 版本的 Xerces 而不是 Apache 版本?但是很抱歉,我已经为您指明了正确的方向,但我只能为竞争对手的产品提供支持!
【解决方案2】:

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

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

【讨论】:

  • 班级是com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多