Java XML 验证 : Unable to resolve definitions from local XSD files

标签 java xml validation xsd saml

我正在尝试验证 xml,但我正在尝试在没有互联网连接的情况下执行此操作。因此,我尝试下载我需要的所有 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)

最佳答案

由于您的架构引用位于类路径中,因此您必须向 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/”。

关于Java XML 验证 : Unable to resolve definitions from local XSD files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34058045/

相关文章:

java - 在 Android-Java 中读取数组时出现奇怪的行为

java - 将 XML 数据追加到 ArrayList

java - JAXB 接受重复标签

asp.net-mvc-3 - JQuery 验证和 MVC 3. 如何更改日期格式

java - 单击按钮时触发验证(Java swing)

java - 在 TextView 上绘制

java - Jersey - 来自资源的大量延迟调用服务方法

javascript - MovieMasher 实用脚本

validation - 如何在 Firebase 中运行服务器端代码?

java - 国会图书馆 Web 服务上的 Java 和 XPath 错误