web-dev-qa-db-fra.com

Comment valider xml contre xsd et obtenir les erreurs * ALL *?

J'ai un code standard comme ci-dessous pour valider xml contre xsd, mais il jette une exception à la première erreur et s'arrête. Comment valider xml, mais continuer sur les erreurs premières et suivantes et les obtenir toutes à la fin? Est-ce même possible?

public static void validate(File xml, InputStream xsd) {
    try {
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new StreamSource(xsd));
        Validator validator = schema.newValidator();
        StreamSource xmlFile = new StreamSource(xml);
        validator.validate(xmlFile);

    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
30
marioosh

Entre Validator validator = schema.newValidator(); et StreamSource xmlFile = new StreamSource(xml);, ajoutez ce fragment:

  final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
  validator.setErrorHandler(new ErrorHandler()
  {
    @Override
    public void warning(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }
  });

De cette façon, après validate(), vous aurez la liste complète des exceptions, mais si une erreur fatale se produit, l'analyse s'arrête ... 

EDIT: JavaDoc indique: L’application doit supposer que le document est inutilisable après que l’analyseur a appelé cette méthode et ne doit continuer (le cas échéant) que pour collecter des messages d’erreur supplémentaires: en fait, SAX les analyseurs sont libres de ne pas signaler d’autres événements une fois cette méthode invoquée. Donc, fatalError() peut ou non entraîner l’arrêt de l’analyse syntaxique.

55
Grzegorz Grzybek

merci pour le code. La partie qui me manque est celle où les erreurs sont imprimées sur la console? En ce moment rien ne se passe?!

C'est ce que j'ai eu:

        import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import Java.net.URL;
import Java.util.LinkedList;
import Java.util.List;
import Java.util.Scanner;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import Java.io.BufferedReader;
import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.FileReader;
//import Java.io.File; // if you use File
import Java.io.IOException;

public class ADT_XML_Validator {

    public static void main(String xml_pfad) throws IOException {




            try {
                SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
                Schema schema = factory.newSchema(new StreamSource("ADT_GEKID_v2.0.0.xsd"));
                Validator validator = schema.newValidator();

                final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
                validator.setErrorHandler(new ErrorHandler()
                {
                  @Override
                  public void warning(SAXParseException exception) throws SAXException
                  {

                    exceptions.add(exception);
                  }

                  @Override
                  public void fatalError(SAXParseException exception) throws SAXException
                  {
                    exceptions.add(exception);
                  }

                  @Override
                  public void error(SAXParseException exception) throws SAXException
                  {
                    exceptions.add(exception);
                  }
                });


                StreamSource xmlFile = new StreamSource(xml_pfad);
                validator.validate(xmlFile);


            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }



    }
}
0
Donselm