mercoledì 23 maggio 2012

Parser STAX e validazione XSD con Woodstox e MSV

Woodstox è un parser particolarmente efficiente che implementa l'interfaccia StAX... un candidato ideale quindi per l'elaborazione di documenti XML di dimensioni considerevoli.

Una caratteristica interessante di questo parser è la sua capacità di interfacciare il Sun Multi-Schema Validator (di seguito MSV) per la validazione dell'XML tramite diverse tipologie di Schema, ad esempio DTD, XML Schema e RELAX NG.

Per la validazione è necessario ricorrere a una estensione specifica di Woodstox che è al di fuori dell'interfaccia StAX. Tuttavia l'utilizzo di questa estensione è abbastanza limitata e non compromette in modo eccessivo la migrazione a altri parser StAX (eliminando la validazione ove questi non la supportino).

Di seguito è descritto un esempio di utilizzo di Woodstox con MSV per effettuare la validazione con XML Schema.

Dopo la creazione dell'istanza del parser tramite la factory XMLInputFactory, si effettua il cast dell'oggetto XMLStreamReader ottenuto (che fa parte dello standard StAX) all'interfaccia XMLStreamReader2 (che è invece specifica di Woodstox) e si associa tramite il metodo validateAgainst() l'istanza dello XMLValidationSchema (ottenuto da un factory XMLValidationSchemaFactory definita in MSV).

Per catturare gli errori di validazione è possibile definire uno specifico ValidationProblemHandler invocando il metodo setter opportuno sull'istanza di XMLStreamReader2. L'handler potrà gestire i problemi di validazione registrandoli in una collection oppure potrà lanciare una eccezione di tipo XMLValidationProblem che sarà restituito al client del parser durante l'elaborazione degli eventi.

Il parser e le librerie MSV possono essere scaricate a partire da questo link.

File inFile = ... // documento
File xsdFile = ... // XML schema 


XMLInputFactory staxFactory = XMLInputFactory.newInstance();       
XMLStreamReader streamReader = staxFactory.createXMLStreamReader(new FileInputStream(inFile));
       
XMLValidationSchemaFactory schemaFactory = XMLValidationSchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
       
XMLValidationSchema schemaGrammar = schemaFactory.createSchema(xsdFile);
 
XMLStreamReader2 sr2 = ((XMLStreamReader2)streamReader);
       
final List<XMLValidationProblem> listOfProblems = new ArrayList<XMLValidationProblem>();
       
if (schemaGrammar!=null) {
  sr2.validateAgainst(schemaGrammar);
  sr2.setValidationProblemHandler(new ValidationProblemHandler(){
     public void reportProblem(XMLValidationProblem problem) throws XMLValidationException {
       listOfProblems.add(problem);
     }
  });
}


// usa lo stream Reader
// streamReader.next();

Nessun commento:

Posta un commento