Validierung anhand eines Schemas mit JAXB

Ich habe viel zu lange nach Lösungen für dieses Problem gesucht, um Hilfe zu suchen.

Ich habe ein XML-Schema, das ich mit xjc verwendet habe, um meine JAXB-Bindung zu erstellen. Dies funktioniert gut, wenn das XML gut geformt ist. Leider beschwert es sich auch nicht, wenn das XML nicht wohlgeformt ist. Ich kann nicht herausfinden, wie eine ordnungsgemäße vollständige Überprüfung des Schemas durchgeführt wird, wenn ich versuche, eine XML-Datei zu dekomprimieren.

Ich habe es geschafft, einen ValidationEventCollector zum Behandeln von Ereignissen zu verwenden, der bei XML-Analysefehlern wie nicht übereinstimmenden Tags funktioniert, aber keine Ereignisse auslöst, wenn ein Tag erforderlich ist, aber vollständig fehlt.

Soweit ich gesehen habe, kann die Validierung gegen ein Schema durchgeführt werden, aber Sie müssen den Pfad zum Schema kennen, um es an die setSchema () -Methode übergeben zu können. Das Problem, das ich habe, ist, dass der Pfad zum Schema im XML-Header gespeichert ist und ich zur Laufzeit nicht weiß, wo sich das Schema befinden wird. Deshalb ist es in der XML-Datei gespeichert:

<?xml version="1.0" encoding="utf-8"?>
<DDSSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/a/big/long/path/to/a/schema/file/DDSSettings.xsd">
<Field1>1</Field1>
<Field2>-1</Field2>

...usw

In jedem Beispiel, das ich sehe, wird setValidating (true) verwendet, das jetzt veraltet ist. Daher wird eine Ausnahme ausgelöst.

Dies ist der Java-Code, den ich bisher habe und der anscheinend nur eine XML-Validierung und keine Schema-Validierung durchführt:

try {
    JAXBContext jc = new JAXBContext() {
        private final JAXBContext jaxbContext = JAXBContext.newInstance("blah");

        @Override
        public Unmarshaller createUnmarshaller() throws JAXBException {
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            ValidationEventCollector vec = new ValidationEventCollector() {
                @Override
                public boolean handleEvent(ValidationEvent event) throws RuntimeException {
                    ValidationEventLocator vel = event.getLocator();
                    if (event.getSeverity() == event.ERROR || event.getSeverity() == event.FATAL_ERROR) {
                        String error = "XML Validation Exception:  " + event.getMessage() + " at row: " + vel.getLineNumber() + " column: " + vel.getColumnNumber();
                        System.out.println(error);
                    }
                    m_unmarshallingOk = false;
                    return false;
                }
            };
            unmarshaller.setEventHandler(vec);

            return unmarshaller;
        }

        @Override
        public Marshaller createMarshaller() throws JAXBException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        @SuppressWarnings("deprecation")
        public Validator createValidator() throws JAXBException {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    m_ddsSettings = (com.ultra.DDSSettings)unmarshaller.unmarshal(new File(xmlfileName));
} catch (UnmarshalException ex) {
    Logger.getLogger(UniversalDomainParticipant.class.getName()).log(
    Level.SEVERE,
    null, ex);
} catch (JAXBException ex) {
    Logger.getLogger(UniversalDomainParticipant.class.getName()).log(
    Level.SEVERE,
    null, ex);
}

Was ist der richtige Weg, um diese Validierung durchzuführen? Ich hatte erwartet, dass es eine validate () -Methode für die JAXB-generierten Klassen gibt, aber ich denke, das wäre für Java zu einfach.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage