~/home of geeks

XMLBeans & dynamische Schemavalidierung

· 299 Wörter · 2 Minute(n) Lesedauer

In letzter Zeit arbeite ich sehr viel mit der sehr guten XMLBeans API von Apache. Anbei ein kleines Programm, welches ein SchemaTypeLoader Objekt aus einer XSD Datei erzeugt und diese zum Validieren einer XML Datei benutzt.

Diese Klasse kann als Basis für ein Programm benutzt werden, welches die XSD Definitionen dynamisch aus einer Datei oder einer Datenbank lädt um damit verschiedene XML Dokumente zu validieren.

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;

public class DynamicSchemaValidator {

    /**
     * Aufruf: <br/>
     * arg[0] XSD-Datei
     * arg[1] XML-Datei
     *
     * @param args
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Enter at least two arguments: " +
                    "xsd file and xml file to validate.");
            System.exit(0);
        }
        SchemaTypeLoader schemaTypeLoader =
                loadSchema(new File(args[0]));
        checkXml(schemaTypeLoader, new File(args[1]));
    }

    public static void checkXml(SchemaTypeLoader schemaTypeLoader,
                                File xmlFile) {
        System.out.println("checking xml file " + xmlFile);
        List errors = new ArrayList();
        try {
            XmlObject xo = schemaTypeLoader.parse(xmlFile, null,
                    new XmlOptions().
                            setLoadLineNumbers().setErrorListener(errors));
            if (xo.validate(new XmlOptions().
                    setLoadLineNumbers().setErrorListener(errors))) {
                System.out.println("VALID");
            } else System.out.println("NOT valid");
            if (errors.size() > 0) printXmlErrors(errors);
        } catch (XmlException e) {
            if (errors.size() >= 0) errors.add(e);
            printXmlErrors(errors);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SchemaTypeLoader loadSchema(File schemaFile) {
        System.out.println("loading schema " + schemaFile);
        List errors = new ArrayList();
        XmlObject schema;
        SchemaTypeLoader schemaTypeLoader = null;
        try {
            schema = XmlObject.Factory.parse(schemaFile,
                    new XmlOptions()
                            .setLoadLineNumbers().setLoadMessageDigest()
                            .setErrorListener(errors));
            if (errors.size() > 0) {
                printXmlErrors(errors);
                System.exit(-1);
            }

            XmlOptions schemaOptions = new XmlOptions().
                    setErrorListener(errors).setLoadLineNumbers();
            XmlObject[] schemas = {schema};
            schemaTypeLoader = XmlBeans.compileXsd(
                    schemas, schemaTypeLoader, schemaOptions);
        } catch (XmlException e) {
            if (errors.size() <= 0) errors.add(e);
            printXmlErrors(errors);
            System.exit(-1);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        return schemaTypeLoader;
    }

    public static void printXmlErrors(List errors) {
        System.out.println("XML Errors:");
        for (int i = 0; i < errors.size(); i++)
            System.out.println(errors.get(i).toString());
    }
}