代码之家  ›  专栏  ›  技术社区  ›  jdmichal

形成JAXP模式(javax.xml.validation.Schema)时出错

  •  0
  • jdmichal  · 技术社区  · 16 年前

    我们使用jaxb2.x从一个庞大的模式系统(42个XSD文件)生成数据对象。整个过程运行良好,没有问题。但他们不赞成(并从实现中删除)整个JAXB验证框架,取而代之的是JAXP验证框架(所有这些都位于 javax.xml.validation 包装。)

    javax.xml.validation.SchemaFactory

    import javax.xml.transform.Source;
    
    final java.util.ArrayList<Source> xsdSources =
        new java.util.ArrayList<Source>();
    /* POPULATE THE LIST WITH ALL THE XSDS IN DEPENDENCY ORDER.
       THAT IS, FILES WITH NO DEPENDENCIES APPEAR IN LOWER INDEX.
       I USE javax.xml.transform.stream.StreamSource, GIVING IT
       STREAMS FROM java.util.jar.JarFile#getInputStream(JarEntry). */
    
    final javax.xml.validation.SchemaFactory schemaFactory =
        javax.xml.validation.SchemaFactory.newInstance(
            javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
    schemaFactory.setErrorHandler(new SchemaErrorHandler());
    return schemaFactory.newSchema(xsdSources.toArray(new Source[]{}));
    

    xsds/import/foo/thing.xsd (<xsd:element name="thing">...</xsd:element>)
    xsds/import/foo/otherthing.xsd (<xsd:include schemaLocation="thing.xsd"/>)
    xsds/import/foo/all.xsd (<xsd:include schemaLocation="otherthing.xsd"/>)
    xsds/mystuff/main.xsd (<xsd:import namespace="foonamespace" schemaLocation="../import/foo/all.xsd/>)
    

    这个 main.xsd 文件中有这样的行,会抛出有关未知引用的错误:

    <xsd:element xmlns:foo="foonamespace" ref="foo:thing"/>
    

    org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'foo:thing' to a(n) 'element declaration' component.
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2537)
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2528)
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(XSDHandler.java:1472)
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDElementTraverser.traverseLocal(XSDElementTraverser.java:160)
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseLocalElements(XSDHandler.java:2049)
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:582)
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519)
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485)
        at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:210)
    

    主.xsd 以几乎完全相同的方式对其他文件执行类似的操作,并且它们都可以正常工作。你知道为什么这个会出错吗?

    1 回复  |  直到 16 年前
        1
  •  0
  •   Community CDub    7 年前

    从java.util.jar.JarFile#getInputStream(JarEntry)创建的源是否有一个基本URL,以便可以解析模式中的相对URL,并且所有模式都在同一个jar中?

    answer 另一个问题是关于如何使它在罐子里工作的细节。