Mariusz Prowaźnik

o programowaniu w Javie, Scali i Clojure.


Walidacja XML po XML Schema w Javie

Jest wiele sposobów w Javie, aby sprawdzić poprawność dokumentu XML pod kątem zgodności z XML. Schema. Jeden z nich zaprezentuję poniżej, wykorzystując biblioteki javax.xml.

Założyłem, że XML Schema będzie trzymana w pliku, a XML do walidacji przekazywany jako parametr typu String. Zatem klasa będzie takiej postaci:

public SchemaValidator{
           private static final String XSD_FILE = "someSchema.xsd"; 
           public boolean validate(String xml) throws ValidationException{
           //implementacja
          }
}
ValidationException to wyjątek który powinniśmy stworzyć sami, rozszerzając klasę Exception. Posłuży on do opakowania wyjątków związanych np z brakiem dostępu do pliku z XML Schema.

Czas na implementację metody validate. Na początek tworzymy SchemaFactory, oraz Schema:
SchemaFactory factory = 
       SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL resource = this.getClass().getClassLoader().getResource(XSD_FILE);
Schema schema;
try {
         schema = factory.newSchema(new File(resource.toURI()));
} catch (Exception e) {
         throw new ValidationException(e);
}

Należy zwrócić uwagę na linijkę:
URL resource = this.getClass().getClassLoader().getResource(XSD_FILE)

Plik schema powinien być wcześniej umieszczony w folderze src/main/resourcesWykonanie tego kodu powoduje pobranie go jako zasób. Można to zrobić oczywiście w inny sposób - w XSD_FILE zamieścić ścieżkę pliku (np  src/main/resources/someSchema.xsd) i wtedy zmienić parametry wywołania newSchema na
schema = factory.newSchema(new File(XSD_FILE));
Kolejnym krokiem jest:
Validator validator = schema.newValidator();
       Source source = new StreamSource(new ByteArrayInputStream(xml.getBytes()));

Konstruktor klasy StreamSource przyjmuje parametr typu InputStream, a dysponujemy xml'em String'u. Użycie metody getBytes() i stworzenie obiektu  ByteArrayInputStream rozwiązuje ten problem.

Na koniec walidujemy source. Jeśli xml się nie zwaliduje, wyrzucony zostanie wyjątek SAXException.
try {
   validator.validate(source);
   System.out.println("XML Validation: OK");
  } catch (SAXException ex) {
   System.out.println("XML is not valid "+ex.getMessage());
   return false;
  } catch (IOException e) {
   throw new ValidationException(e);
  }
  
  return true;

Brak komentarzy :

Prześlij komentarz