【问题标题】:Java XML Validation: Unable to resolve definitions from local XSD filesJava XML 验证:无法从本地 XSD 文件解析定义
【发布时间】:2015-12-03 04:45:35
【问题描述】:

我正在尝试验证 xml,但我正在尝试在没有 Internet 连接的情况下进行验证。因此,我尝试下载我需要的所有 XSD 并将导入更改为本地文件,但它无法找到一些定义。奇怪的是,当我在 IntelliJ 中命令+单击有问题的行时,它会将我带到正确的本地 XSD。

我编写了一个演示问题的最小示例并将其发布在此处:https://github.com/spearskw/testXsd

这是我尝试运行它时得到的堆栈跟踪:

org.xml.sax.SAXParseException; systemId: file:/Users/kevin/repo/xsdTest/target/classes/schemas/saml-schema-protocol-2.0.xsd; lineNumber: 32; columnNumber: 56; src-resolve: Cannot resolve the name 'ds:Signature' to a(n) 'element declaration' component.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:4162)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:4145)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(XSDHandler.java:1678)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDElementTraverser.traverseLocal(XSDElementTraverser.java:170)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseLocalElements(XSDHandler.java:3618)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:633)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:617)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:575)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:541)
at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:255)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:638)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:670)
at testXsd.TestSchemaValidation.validateSaml(TestSchemaValidation.java:35)
at testXsd.TestSchemaValidation.main(TestSchemaValidation.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

【问题讨论】:

    标签: java xml validation xsd saml


    【解决方案1】:

    由于您的架构引用位于类路径中,因此您必须向 SchemaFactory 提供资源定位器:

    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            sf.setResourceResolver(new LocalSchemaLSResourceResolver());
    

    解析器是这样的:

    public static class LocalSchemaLSResourceResolver implements LSResourceResolver{
        private static final String CARPETA_XSD = "META-INF/xsd/";
    
        //@Override
        public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI)
        {
    
            try {
                LSInput input =  ((DOMImplementationLS)DOMImplementationRegistry.newInstance().getDOMImplementation("LS")).createLSInput();
                input.setByteStream(Thread.currentThread().getContextClassLoader().getResourceAsStream(CARPETA_XSD+systemId.replace("../","")));
    
                return input;
            }
            catch(Exception e)
            {
                throw ExceptionWrapper.wrap(e,"Imposible encontrar importacion type=%, namespace=%, publicId=%, systemId=%, baseURI=%", type,namespaceURI, publicId, systemId, baseURI);
            }
    
        }
    }
    

    在您的情况下,您必须将“META-INF/xsd”替换为“schemas/”。

    【讨论】:

    • 感谢您的建议!不过我试过了,但它似乎仍然不起作用 - 我遇到了同样的错误。
    • “schemas/”目录必须在你的类路径中,这样 ContextClassLoader 才能找到资源
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多