Walidacja schematu XSD

Było już tutaj o parsowaniu xml o tworzeniu wizualizacja xml poprzez transformatę xsl ale po co nam to wszystko jeśli nie posiadamy poprawnego xml. Jeśli jest on niezgodny ze schemą xsd. Oczywiście istnieje wiele walidatorów online ale nie zawsze mamy do nich dostęp. Jednym z rozwiązań jest napisanie własnego walidatora. Przy wykorzystaniu javovego api dotyczącego walidacji, jest to prostsze niż się wydaje na pierwszy rzut oka.

import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class MyValidator {

    public static void main(String[] args) throws SAXException, IOException {

        // 1
        SchemaFactory factory =
            SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

        // 2
        File schemaLocation = new File("/path/to/my/schema.xsd");
        Schema schema = factory.newSchema(schemaLocation);

        // 3
        Validator validator = schema.newValidator();

        // 4
        Source source = new StreamSource(args[0]);

        // 5
        try {
            validator.validate(source);
            System.out.println(args[0] + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }

    }

}

Mniej niż 10 linijek głównego kodu robi wrażenie ale co tu się dzieje kolejno.

  1. Utworzenie fabryki dla konkretnej schemy, domyślnie dostarczone są:
    • XMLConstants.W3C_XML_SCHEMA_NS_URI: http://www.w3.org/2001/XMLSchema
    • XMLConstants.RELAXNG_NS_URI: http://relaxng.org/ns/structure/1.0
    • XMLConstants.XML_DTD_NS_URI: http://www.w3.org/TR/REC-xml
  2. Załadowanie konkretnej schemy xsd i jej kompilacja.
  3. Utworzenie walidatora ze skompilowanej schemy.
  4. Załadowanie xml, który ma zostać sprawdzony.
  5. Przeprowadzenie walidacji. Jeśli xml jest niezgodny ze schema, to zostanie rzucony wyjątek gdzie będzie można się dowiedzieć dlaczego plik jest nie poprawny.

Oparte na tym wpisie