В Java: проверка XML по нескольким схемам, расположенным на местах различий серверов - PullRequest
0 голосов
/ 17 августа 2010

В моей программе я создаю файл XML, и мне нужно проверить этот файл XML по нескольким схемам, расположенным по разным URL-адресам.Требуется проверить этот 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-resol: не удается разрешить имя 'xn: SubNetwork' в (n) компонент "объявление элемента".в org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException (неизвестный источник) в org.apache.xerces.util.ErrorHandlerWrapper.error (неизвестный источник) в org.apache.xerces.impl.XMLErrorReporter org.apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError (неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDHandler.getGlobalDecl (неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseLocal (Неизвестный источник) по адресу org.apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseLocal (Неизвестный источник) по адресу org.apache.xerces.impl.xs.traversers.XSDAbstractParticleTraverser.traverseSknown org).apache.xerces.impl.xs.traversers.XSDAbstractParticleTraverser.traverseChoice (Неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDComplexTypeTraverser.processComplexContent (Неизвестный источник) в org.apache.xervers.impl.XSDComplexTypeTraverser.traverseComplexTypeDecl (неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDComplexTypeTraverser.traverseLocal (Неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDElementTraverser.traverseNamedElement (Неизвестный источник) в org.apache.xerces.impl.xs.traversers.ocalStore(Неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDHandler.traverseLocalElements (Неизвестный источник) в org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema (Неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema (Неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar (Неизвестный источник) в org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar (Неизвестный источник) в org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema (неизвестный источник) по адресу com.work.test.generateErrorLog (SchemaValidator.java:197)

В чем проблема в коде?Есть ли какой-либо другой способ проверки нескольких схем?

Ответы [ 2 ]

1 голос
/ 18 декабря 2013

У меня была такая же проблема.

Я сменил порядок схем.

Сначала я импортировал все дочерние схемы, а в конце я установил основную схему.

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"))};
1 голос
/ 09 февраля 2011

Есть довольно много сообщений на эту тему, и я не мог найти удовлетворительное решение. Вот как это работает для меня. Дайте SchemaFactory собственный распознаватель ресурсов

<code>
    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;
}

...