Oct 7, 2009

XSD validation με τη βοήθεια του Xerces

Επειδή χρειάστηκε πρόσφατα να χρησιμοποιήσω τη βιβλιοθήκη του Xerces (http://xerces.apache.org/xerces-j/ ) για XSD validation ενός XML κειμένου και διαπίστωσα πως υπάρχουν διάφορες, διάσπαρτες προσπάθειες γι' αυτό στο δίκτυο, οπότε ας καταθέσω και το δικό μου παράδειγμα (example):


/**
* Validate a XML document against a XSD using Xerces.
* @param filename is the URI of the document to validate. For instance:
* file:///tmp/td.xml
* @param schemaLocation is the URI of the XSD. For instance file:///tmp/td.xsd
* @throws Exception in case of validation error.
*/
public static void validateDocument(String filename,
String schemaLocation) throws Exception {
/**
* Define an embedded handler for validation errors.
*/
class Validator extends DefaultHandler {
private boolean validationError = false;
private SAXParseException saxParseException = null;

public void error(SAXParseException exception) throws SAXException {
validationError = true;
saxParseException = exception;
}

public void fatalError(SAXParseException exception) throws SAXException {
validationError = true;
saxParseException = exception;
}

public void warning(SAXParseException exception) throws SAXException {
;
}
}

XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setFeature("http://xml.org/sax/features/validation", true);
parser.setFeature("http://apache.org/xml/features/validation/schema",
true);
// Use external-schemaLocation for an XSD defining a namespace or external-noNamespaceSchemaLocation
// for those not defining it.
parser.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
schemaLocation);
Validator handler = new Validator();
parser.setErrorHandler(handler);
parser.parse(filename);
System.out.println("VALIDATION ERROR occured: " + handler.validationError);
if (handler.validationError) {
throw handler.saxParseException;
}
}

No comments: