IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

[XML Schema]Validation sans mettre le xsd dans le xml


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [XML Schema]Validation sans mettre le xsd dans le xml
    Bonjour,

    J'ai parcouru pendant pas mal de temps les forums tutoriaux et autres documents du site mais je n'arrive toujours pas à arriver à mes fins...

    Peut-être que quelqu'un pourra m'aider?

    Voilà ma problématique : je voudrais pouvoir valider à l'exécution de mon programme Java des fichiers XML par rapport à des fichiers XSD. Petite difficulté : les fichiers XML ne renseignent pas le schema qu'ils sont censés respecter.

    J'ai essayé pas mal de trucs (EntityResolver, les attributs et propriétés de SAX, ...) mais rien ne me permet d'arriver à mon but...

    J'utilise Xerces comme parser, pour info.

    Je mets ci dessous un bout de mon code mais il est sans doute erroné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    javax.xml.parsers.SAXParser parseur = fabrique.newSAXParser();
    parseur.setProperty(               "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
    "http://www.toto.com/grs/xml/sip305");
     
    File fichier = new File("C:/temp/SIP305.xml");
    DefaultHandler handler = new DefaultHandler();
    parseur.parse(fichier, handler);
    Si quelqu'un peut m'apporter son aide ce serait super!!! Car cela fait 2 jours que je suis sur le problème et la lassitude commence à me gagner...

    Merci d'avance

  2. #2
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Je remonte ce thread car il m'interesse.

    Avec xmlint, je peux valider mon xml sans déclarer mon doc xsd. Est i l possible d'en faire autant avec JAVA?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    import org.xml.sax.ErrorHandler; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.SAXParseException;
     
    public class BillyErrorHandler implements ErrorHandler { 
     
    	public void error(SAXParseException sex) throws SAXException {
    		System.err.println("\tErreur Ligne " + sex.getLineNumber()); 
    		System.err.println("\t   -> Erreur : " + sex.getMessage()); 
    	} 
     
    	public void fatalError(SAXParseException sex) throws SAXException {
    		System.err.println("\tErreur Fatale Ligne " + sex.getLineNumber()); 
    		System.err.println("\t   -> Erreur : " + sex.getMessage()); 
     	} 
     
     	public void warning(SAXParseException sex) throws SAXException {
     		System.out.println("\tAvertissement Ligne " + sex.getLineNumber()); 
     		System.out.println("\t   -> Erreur : " + sex.getMessage()); 
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    import java.io.File;
    import javax.xml.parsers.*;
    import javax.xml.XMLConstants;
    import javax.xml.validation.Schema;
    import javax.xml.validation.SchemaFactory;
     
    public class ValiderAvecSchema {
     
    	public void valider(String xsdFileName, String xmlFileName) {
    		try {
    			SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    			sf.setErrorHandler(new BillyErrorHandler());
    			Schema xsd = sf.newSchema(new File(xsdFileName));
     
    			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    			dbf.setNamespaceAware(true);
    			dbf.setSchema(xsd);
     
    			DocumentBuilder db = dbf.newDocumentBuilder();
    			db.setErrorHandler(new BillyErrorHandler());
    			db.parse(xmlFileName);
     
    		    System.out.println("\tCe document est valide.");
     
    		} catch (Exception err) {
                //err.printStackTrace();
                //System.out.println("&&&Erreur lors de la validation du document XML: " + err.getMessage());
            }  
    	}
    }

    Quand je mets un xml avec son schema, cela fonctionne, dans l'autre cas, je tombe sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	Erreur Ligne 3
    	   -> Erreur : cvc-elt.1: Cannot find the declaration of element 'FAT'.
    	Erreur Ligne 3
    	   -> Erreur : cvc-elt.1: Cannot find the declaration of element 'FAT'.
    	Ce document est valide.
    De plus, il y a eu une erreur et une exception levée. Pourquoi ai je "Ce document est valide" ???


    Merci pour vos infos!

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Points : 446
    Points
    446
    Par défaut
    Citation Envoyé par billynirvana
    De plus, il y a eu une erreur et une exception levée. Pourquoi ai je "Ce document est valide" ???
    Le message apparait tout simplement parce que la ligne de code est exécutée.
    Si tu ne veux pas qu'elle s'affiche, il te positionner un marqueur dans ton ErrorHandler et faire un test dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    import org.xml.sax.ErrorHandler; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.SAXParseException;
     
    public class BillyErrorHandler implements ErrorHandler { 
     
            private boolean valid = true;
     
            public boolean isValid() { return valid; }
     
    	public void error(SAXParseException sex) throws SAXException {
                    valid = false;
    		System.err.println("\tErreur Ligne " + sex.getLineNumber()); 
    		System.err.println("\t   -> Erreur : " + sex.getMessage()); 
    	} 
     
    	public void fatalError(SAXParseException sex) throws SAXException {
                    valid = false;
    		System.err.println("\tErreur Fatale Ligne " + sex.getLineNumber()); 
    		System.err.println("\t   -> Erreur : " + sex.getMessage()); 
     	} 
     
     	public void warning(SAXParseException sex) throws SAXException {
                    valid = false;
     		System.out.println("\tAvertissement Ligne " + sex.getLineNumber()); 
     		System.out.println("\t   -> Erreur : " + sex.getMessage()); 
    	}
    }



    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class ValiderAvecSchema {
      private BillyErrorHandler billyErrorHandler = new BillyErrorHandler();
     
      public void valider(String xsdFileName, String xmlFileName) {
         ...
         if (billyErrorHandler.isValid()){
           System.out.println("\tCe document est valide.");
         } else {
           System.out.println("\tCe document n'est pas valide.");
         }
    A+
    Il est agréable d'avoir le choix. La difficulté est alors de faire le bon (ou le moins pire).

Discussions similaires

  1. [XSD] [XML Schemas] Valider un Objet sur base du schéma
    Par Invité dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 27/03/2009, 14h10
  2. pb pour définir '&' dans un XML Schema
    Par MrJadis dans le forum Valider
    Réponses: 2
    Dernier message: 26/01/2009, 19h17
  3. [XSD]Ou peut-on déclarer une grammaire XSD dans un XML?
    Par Jayceblaster dans le forum Valider
    Réponses: 1
    Dernier message: 21/08/2006, 01h12
  4. [XSD] Où apprendre XML Schéma ?
    Par Fildz dans le forum Valider
    Réponses: 3
    Dernier message: 03/08/2006, 09h39
  5. [XML Schema] validation bizarre...
    Par srenaudo dans le forum Valider
    Réponses: 1
    Dernier message: 28/03/2006, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo