0

在我的程序中,我正在生成一个 XML 文件,并且需要针对位于不同 URL 上的多个模式来验证该 XML 文件。它只需要一次针对所有模式验证该 XML 文件。

源片段:

// here source array contain the locations of schemas, located at diff servers.
Source[] source = {
        new StreamSource(
                new URL("http://localhost:8081/test1/testSchema1.xsd")
                        .openStream()),
        new StreamSource(
                new URL(
                        "http://ccr.internal.ericsson.com/test2/testSchema2.xsd")
                        .openStream()) };

try {
    // Compile the schema, which loaded from schemaFileLocation.
    Schema schemaGrammar = schemaFactory.newSchema(source);

    // Create a validator for schema.
    Validator configValidator = schemaGrammar.newValidator();

    // set error handler with validator.
    SchemaValidator schemaValidator = new SchemaValidator();
    configValidator
            .setErrorHandler(schemaValidator.new MessageHandler());

    // validate xml instance against the grammar.
    configValidator.validate(new StreamSource(new File("xmlFile.xml")));
    System.out.println("\n");
} catch (SAXException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

当我运行上面的代码片段时,我得到了这个错误:

org.xml.sax.SAXParseException:src-resolve:无法将名称“xn:SubNetwork”解析为(n)“元素声明”组件。在 org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org .apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError(Unknown Source) at org.apache.xerces.impl.xs.traversers.XSDHandler.getGlobalDecl(Unknown Source) at org.apache.xerces.impl.xs.traversers .XSDElementTraverser.traverseLocal(Unknown Source) at org.apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseLocal(Unknown Source) at org.apache.xerces.impl.xs.traversers.XSDAbstractParticleTraverser。

代码中的问题是什么?他们是否有任何其他方式来验证多个模式?

4

2 回答 2

1

关于这个主题有很多帖子,我也找不到令人满意的解决方案。这是它对我的工作方式。给 SchemaFactory 一个自定义资源解析器


    Source source = new StreamSource(this.getClass().getResourceAsStream("ebics.xsd"));
    LSResourceResolver resolver = new ResourceResolver(schemaFactory.getResourceResolver());
    schemaFactory.setResourceResolver(resolver);
    

并仅解析顶级架构。然后解析器可以(希望)解析嵌入的引用


public class ResourceResolver implements LSResourceResolver {
    private LSResourceResolver parent = null;
    private Set returnedResources = new HashSet();


    public ResourceResolver(LSResourceResolver r){
    parent = r;
    }

    private ResourceResolver() {
    }

    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
    LSInput input = new LSInputImpl();

    if (returnedResources.contains(systemId)) {
        return null;
    } else if (systemId.equals("ebics_hev.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_hev.xsd"));
    } else if (systemId.equals("ebics_keymgmt_request.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_keymgmt_request.xsd"));
    } else if (systemId.equals("ebics_keymgmt_response.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_keymgmt_response.xsd"));
    } else if (systemId.equals("ebics_orders.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_orders.xsd"));
    } else if (systemId.equals("ebics_request.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_request.xsd"));
    } else if (systemId.equals("ebics_response.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_response.xsd"));
    } else if (systemId.equals("ebics_signature.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_signature.xsd"));
    } else if (systemId.equals("ebics_types.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics_types.xsd"));
    } else if (systemId.equals("ebics.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("ebics.xsd"));
    } else if (systemId.equals("xmldsig-core-schema.xsd")) {
        input.setByteStream(this.getClass().getResourceAsStream("xmldsig-core-schema.xsd"));
    } else {
        return parent.resolveResource(type, namespaceURI, publicId, systemId, baseURI);
    }
    returnedResources.add(systemId);
    return input;
    }

}

这是 LSInputImpl


public class LSInputImpl implements LSInput
{

    public Reader getCharacterStream () {
        return null;
    }

    public void setCharacterStream ( Reader characterStream ) {}

    public InputStream getByteStream () {
        InputStream retval = null;
        if ( byteStream != null ) {
            retval = byteStream;
        }
        return retval;
    }

    public void setByteStream ( InputStream byteStream ) {
        this.byteStream = byteStream;
    }

    public String getStringData () {
        return null;
    }

    public void setStringData ( String stringData ) {}

    public String getSystemId () {
        return systemId;
    }

    public void setSystemId ( String systemId ) {
        this.systemId = systemId;
    }

    public String getPublicId () {
        return null;
    }

    public void setPublicId ( String publicId ) {}

    public String getBaseURI () {
        return null;
    }

    public void setBaseURI ( String baseURI ) {}

    public String getEncoding () {
        return null;
    }

    public void setEncoding ( String encoding ) {}

    public boolean getCertifiedText () {
        return false;
    }

    public void setCertifiedText ( boolean certifiedText ) {}


    private String systemId = null;
    private InputStream byteStream = null;
}

于 2011-02-09T13:35:40.557 回答
1

我有同样的问题。

我切换了模式的顺序。

首先我导入了所有子模式,最后我设置了主模式。

Source[] sources = new Source[] { new StreamSource(new InputStreamReader(SomeClass.class.getResourceAsStream("/com/foo/subschema1.xsd"), "UTF-8")), 
                              new StreamSource(new InputStreamReader(SomeClass.class.getResourceAsStream("/com/foo/subschema2.xsd"), "UTF-8")),
                              new StreamSource(new InputStreamReader(SomeClass.class.getResourceAsStream("/com/foo/subschema3.xsd"), "UTF-8")),
                              ...
                              new StreamSource(new InputStreamReader(SomeClass.class.getResourceAsStream("/com/foo/mainschema.xsd"), "UTF-8"))};
于 2013-12-18T09:09:20.220 回答