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 :

Problème de validation XSD (bis)


Sujet :

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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 34
    Points
    34
    Par défaut Problème de validation XSD (bis)
    La discussion Problème de validation XSD, s'est terminée par le contournement du problème. Cette discussion est marqué RESOLU. Le problème, c'est que le problème original, lui, il n'a pas été résolu. Il a été contourné.

    J'ai ce problème et je ne peux pas le contourner de la façon décrite dans cette discussion d'origine. Quelqu'un a une idée de la source de ce problème?

    J'ai beau tourner le code de tous les bords et côtés, il semble parfaitement correct.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    C'est déprimant, personne n'a le début du commencement d'une explication?

    Entre temps, sur le système qui fonctionne, j'ai expérimenté des solutions alternatives et j'obtiens des résultats différents selon la méthode.

    Si je passe par un Validator le document ne passe pas et il est effectivement invalide.

    Si je passe par un parser DOM validant, le document est validé et considéré valide.

    Si je passe par un parser SAX validant, le document est validé et considéré valide.

    Si je passe par la fonction XMLVALIDATE de DB2 V9.5, le document est validé et considéré valide.

    Là, je m'interroge sérieusement sur la fiabilité des validateurs.

  3. #3
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Je ne comprends pas bien le problème ne voyant pas ton XSD et ton XML sur lesquels tu fais tes tests.
    Par contre l'entête de ton XML ne me plait pas, il devrait ressembler à ce genre de chose :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    <Config01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="leschema.xsd">

    J'ai toujours validé avec SAX :

    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
    		SAXBuilder builder = new SAXBuilder("com.sun.org.apache.xerces.internal.parsers.SAXParser");
    		builder.setValidation(true);
    		BestSaxChecker bsc = new BestSaxChecker();
    		builder.setErrorHandler(bsc);
    		builder.setFeature("http://apache.org/xml/features/validation/schema", true);
     
    		// command line should offer URIs or file names
    		try {
    			builder.build(xmlFile);
    			if (!bsc.validate()) { // Validation against the schema
    				throw new XmlValidationException(bsc.getErrorList());
    			}
    		} catch (JDOMException e) { // Indicates a well-formedness error
    			// ...
    		}
    Jamais le moindre problème, et mon XSD est bien plus compliqué que le tient.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  4. #4
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    Hello,
    J'ai essayé le programme en question, et il marche très bien chez moi, sans aucune erreur de validation...
    j'ai ensuite essayé de modifier le xml, et les erreurs sont bien détectées correctement.

    Testé avec java 1.6.05
    A+

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Manque de précision, il ne s'agit pas de mon programme dans le fil référé, ni de mon XSD et de mon XML.

    Je vais voir si je peux faire une version simplifiée extraite de mon programme et présenter le XML et XSD. Je dois préciser que le XSD contient une instruction d'inclusion, le schéma étant défini par deux fichiers XSD, l'un inclus dans l'autre par la directive include.

    Je vous reviens avec plus de détails. Le problème d'exécution lui, il survient lorsque je change de plateforme, je développe sous Linux et le système cible est un AIX. Sur le système cible, j'ai des problèmes d'éxecution tels que décrits.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 34
    Points
    34
    Par défaut Voici le code...
    Voici mon code 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
     
    import java.util.Properties;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.StringReader;
    import java.io.UnsupportedEncodingException;
     
    import javax.xml.XMLConstants;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
     
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.Schema;
    import javax.xml.validation.SchemaFactory;
    import javax.xml.validation.Validator;
     
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
     
    import org.w3c.dom.Document;
     
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    /**
     * 
     * @author Alambic Talon
     * @since 1.5
     * @version 1.0
     *
     */
    public class XMLTests {
     
    	private static Properties xmlProps = null;
    	private static Logger log = null;
    	private static Document docRequest = null;
    	private static String xmlRequest = null;
    	private static boolean estValide = false;
    	private static DefaultHandler dh = null;
     
    	/**
             * Constructor
             * 
             * @throws FileNotFoundException Cannot found the properties file
             * @throws IOException Cannot read properties file
             */
    	public XMLTests() throws FileNotFoundException, IOException {
    		String propertiesFile = new String(System.getProperty("XMLTests.prefs","XMLTests.properties"));
    		PropertyConfigurator.configure(propertiesFile);
    		log = Logger.getLogger(XMLTests.class);
    		xmlProps = new Properties();
     
    		log.info("Starting initialization of XMLTests class.");
    		try {
    			FileInputStream xmlPropsFile = new FileInputStream(propertiesFile);
    			xmlProps.load(xmlPropsFile);
    			xmlPropsFile.close();
    		}
    		catch (FileNotFoundException e) {
    			log.fatal("Cannot initialize the application, properties file does not exist.", e);
    			throw e;
    		}
    		catch (IOException e) {
    			log.fatal("Cannot initialize the application, properties file does not exist.", e);
    			throw e;
    		}
     
    		dh = new DefaultHandler(){
    			public void fatalError(SAXException e) {
    				log.fatal("Parsing error with SAX:\n", e);
    				estValide = false;
    			}
    			public void error(SAXException e) {
    				log.error("Parsing error with SAX:\n", e);
    				estValide = false;
    			}
    			public void warning(SAXException e) {
    				log.warn("Parsing warning with SAX:\n", e);
    				estValide = false;
    			}
    		};
     
    		log.info("XMLTests initialization completed.");
    	}
     
    	public void setRequest() {
    		/*
    		 * Read standard input and store the result in a string for use with
    		 * the remote method.
    		 */
    		log.debug("Lecture de la requête...");
    		StringBuffer request = null;
    		try {
    			String line = null;
    			request = new StringBuffer(4096);
    			BufferedReader in = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
    			while ( (line = in.readLine()) != null ) {
    				request.append(line).append('\n');
    			}
    			xmlRequest = request.toString();
    			log.debug("La requête a été lue avec succès.");
    		}
     
            catch(UnsupportedEncodingException e) {
    			log.fatal("Impossible de lire la requête, l'encodage n'est pas supporté:\n", e);
            }
     
    		catch(IOException e) {
    			log.fatal("Erreur d'entrée/sortie sur la lecture de la requête:\n",e);
    		}
    	}
     
    	public static String getRequest() {
    		return(xmlRequest);
    	}
     
    	public static String getSchemaFilename() {
    		return(xmlProps.getProperty("XMLTests.schema.filename"));
    	}
     
        private static void validationSAXImplicite(String xmlString, String schemaFilename) {
     
    		// Création du schéma
        	SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        	File schemaFile = new File(schemaFilename);
        	if ( schemaFile.exists() ) {
        		if ( schemaFile.canRead() ) {
        	    	Schema schema = null;
        	    	try {
        	    		schema = factory.newSchema(new StreamSource(schemaFile));
        	    	}
        	    	catch (SAXException ex) {
        	    		log.error("Impossible de créer le schéma à partir du fichier: " + schemaFilename + "\n", ex);
        	    	}
     
        	    	SAXParserFactory spf = SAXParserFactory.newInstance();
        	    	spf.setNamespaceAware(true);
        	    	spf.setValidating(true);
     
        	    	if ( schema != null ) {
        	    		spf.setSchema(schema);
     
        	    		try {
        	    			SAXParser sp = spf.newSAXParser();
        	    	    	estValide = true;
        	    			sp.parse(new InputSource(new StringReader(xmlString)), dh);
        	    			if ( estValide ) {
        	    				log.info("La requête est valide.");
        	    			} else {
        	    				log.error("La requête n'est pas valide.");
        	    			}
        	    		}
        	    		catch (ParserConfigurationException e) {
        	    			log.error("Impossible de définir la configuratio:\n", e);
        	    		}
        	    		catch (IOException e) {
        	    			log.error("Impossible de lire le schéma:\n", e);
        	    		}
        	    		catch (SAXException e) {
        	    			log.error("La requête est invalide:\n", e);
        	    		}
        	    	}
     
        		} else {
        			log.error("Le fichier schéma existe, mais n'est pas accessible en lecture.");
        		}
        	} else {
        		log.error("Le fichier schéma: " + schemaFilename + " n'existe pas.");
        	}
     
        }
     
        private static void validationDOMImplicite(String xmlString, String schemaFilename) {
        	final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
        	final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
        	final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
     
        	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        	dbf.setValidating(true);
        	dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
        	dbf.setAttribute(JAXP_SCHEMA_SOURCE, new File(schemaFilename));
        	try {
        		DocumentBuilder db = dbf.newDocumentBuilder();
    			db.setErrorHandler(dh);
        		estValide = true;
        		Document doc = db.parse(new InputSource(new StringReader(xmlString)));
    			if ( estValide ) {
    				log.info("La requête est valide.");
    			} else {
    				log.error("La requête n'est pas valide.");
    			}
        	}
        	catch (ParserConfigurationException e) {
        		log.error("Impossible de mettre en place la configuration:\n", e);
        	}
        	catch (IOException e) {
        		log.error("Incapable de lire le schema:\n", e);
        	}
        	catch (SAXException e) {
        		log.error("Requête invalide:\n", e);
        	}
     
        }
     
     
    	private static void validationDOMExplicite(String xmlString, String schemaFilename) {
     
    		// Création du schéma
        	SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        	File schemaFile = new File(schemaFilename);
        	if ( schemaFile.exists() ) {
        		if ( schemaFile.canRead() ) {
        	    	Validator validator = null;
        	    	try {
        	    		Schema schema = factory.newSchema(new StreamSource(schemaFile));
        	    		validator = schema.newValidator();
        	    	}
        	    	catch (SAXException ex) {
        	    		log.error("Impossible de créer le schéma à partir du fichier: " + schemaFilename + "\n", ex);
        	    	}
     
        	    	// Création du document DOM
        			DocumentBuilderFactory domBFact = DocumentBuilderFactory.newInstance();
        	    	try {
        	        	DocumentBuilder builder = domBFact.newDocumentBuilder();
        	    		docRequest = builder.parse(new InputSource(new StringReader(xmlString)));
        	    	}
        	    	catch (IOException e) {
        	    		log.fatal("Erreur dans la lecture de la requête:\n", e);
        	    	}
     
        	    	catch (ParserConfigurationException e) {
        	    		log.fatal("Impossible de créer le constructeur de documents:\n", e);
        	    	}
     
        	    	catch (SAXException e) {
        	    		log.fatal("Incapable de lire le document:\n", e);
        	    	}
     
        			try {
        				DOMSource domSource = new DOMSource(docRequest);
        				validator.validate(domSource);
        				log.info("La requête est valide.");
        			}
        			catch (SAXException e) {
        				log.error("La requête est invalide.\n", e);
        			}
        			catch (IOException e) {
        				log.error("Impossible de lire la requête.\n", e);
        			}
     
        		} else {
        			log.error("Le fichier schéma existe, mais n'est pas accessible en lecture.");
        		}
        	} else {
        		log.error("Le fichier schéma: " + schemaFilename + " n'existe pas.");
        	}
     
    	}
     
    /**
             * Instantiate the class, read the standard input character string which is the email
             * from sendmail, connect to the remote server and call the remote method with this 
             * string as the argument.
     
             * @param args None
             * 
             */
    	public static void main(String[] args) {
    		int exitCode = 0;
     
    		XMLTests xmlTests = null;
     
    		// Creates the object and see if everything initialize properly
    		try {
    			xmlTests = new XMLTests();
    			xmlTests.setRequest();
    		}
    		catch (FileNotFoundException e) {
    			log.fatal("Unable to initialize the application.", e);
    		}
     
    		catch (IOException e) {
    			log.fatal("Unable to initialize the application.", e);
    		}
     
    		catch (NullPointerException e) {
    			log.fatal("Unable to initialize the application.", e);
    		}
     
    		log.info("Validation DOM explicite.");
    		validationDOMExplicite(getRequest(), getSchemaFilename());
    		log.info("Validation DOM implicite.");
    		validationDOMImplicite(getRequest(), getSchemaFilename());
    		log.info("Validation SAX implicite.");
    		validationSAXImplicite(getRequest(), getSchemaFilename());
    		log.info("Fin des validations.");
     
    		System.exit(exitCode);
    	}
     
    }
    Voici les XSD:

    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
    <?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
    <xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:include schemaLocation="file:///home/moi/workspace/xsd/maptypes.xsd" />
     
      <xsd:element name="request">
        <xsd:complexType>
          <xsd:choice>
            <xsd:element name="notificationrequest" />
    	<xsd:element name="problemrequest" />
          </xsd:choice>
        </xsd:complexType>
      </xsd:element>
     
      <xsd:element name="notificationrequest">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="infrastructure" type="infrastructureType" minOccurs="1" maxOccurs="1" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
     
      <xsd:element name="problemrequest">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="infrastructure" type="infrastructureType" minOccurs="1" maxOccurs="1" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    Le XSD en inclusion:
    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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:simpleType name="stringType">
        <xsd:restriction base="xsd:string">
          <xsd:whiteSpace value="collapse" />
        </xsd:restriction>
      </xsd:simpleType>
      <xsd:complexType name="datetimestampType">
        <xsd:sequence>
          <xsd:element name="date" type="xsd:date" minOccurs="1" maxOccurs="1" />
          <xsd:element name="time" type="xsd:time" minOccurs="1" maxOccurs="1" />
        </xsd:sequence>
      </xsd:complexType>
      <xsd:complexType name="infrastructureType">
        <xsd:sequence>
          <xsd:element name="ds_version" type="stringType" minOccurs="1" maxOccurs="1" />
          <xsd:element name="agent_id" type="stringType" minOccurs="1" maxOccurs="1" />
          <xsd:element name="a_uniqueid" type="stringType" minOccurs="1" maxOccurs="1" />
          <xsd:element name="a_datetime" type="datetimestampType" minOccurs="1" maxOccurs="1" />
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
    Voici un exemple XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0"?>
    <notificationrequest>
      <infrastructure>
        <ds_version>1.0</ds_version>
        <a_datetime>
          <date>2007-05-14</date>
          <time>12:03:02</time>
        </a_datetime>
      </infrastructure>
    </notificationrequest>
    J'ai simplifié beaucoup en éliminant presque la totalité de la requête pour conserver un minimum. J'ai aussi testé en ajoutant les balises <request></request>, la seule chose que ça change, c'est le message d'erreur qui plante sur «Cannot find declaration of element 'request'».

    Et voici ce que me donner la sortie du programme:
    INFO - Starting initialization of XMLTests class.
    INFO - XMLTests initialization completed.
    DEBUG - Lecture de la requête...
    DEBUG - La requête a été lue avec succès.
    INFO - Validation DOM explicite.
    ERROR - La requête est invalide.

    org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'notificationrequest'.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
    at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
    at javax.xml.validation.Validator.validate(Validator.java:127)
    at ca.cids.map.email.XMLTests.validationDOMExplicite(XMLTests.java:253)
    at ca.cids.map.email.XMLTests.main(XMLTests.java:303)
    INFO - Validation DOM implicite.
    INFO - La requête est valide.
    INFO - Validation SAX implicite.
    INFO - La requête est valide.
    INFO - Fin des validations.
    Alors, quelqu'un a des idées? Moi je ne sais plus à quel Saint me vouer. Les validations ne devraient pas passer parce que tous les éléments requis ne sont pas là. Il manque ds_version, a_uniqueid et agent_id qui sont tous requis.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Bon, je découvre que le schéma n'est pas vraiment défini dans la méthode validationDOMImplicite(), lorsque je fais un getAttribute() j'obtiens bien le chemin d'accès du fichier, mais lorsque je tente d'obtenir l'objet Schema avec la méthode DocumentBuilder.getSchema(), j'obtiens un null. Donc, le document n'est validé par rapport à aucun schéma. Et comme il est en XML bien formé, il est donc valide de ce point de vue là.

    Maintenant, pourquoi le schéma n'est-il pas effectivement défini? Qu'est-ce que je fais de mal?

    Du côté de la validationSAXImplicite(), le schéma défini avec la méthode SAXParserFactory.setSchema() et celui obtenu via SAXParser.getSchema() correspondent.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    J'ai ajouté un essai avec une validation SAX implicite (donc validation à l'analyse) que j'ai pu faire fonctionner correctement et j'ai réussi à faire fonctionner la méthode validationDOMImplicite(String,String) en remplaçant le DefaultHandler dh passé à setErrorHandler et qui comporte bel et bien les méthodes requises par un ErrorHandler qui lui ne comporte uniquement que les trois méthodes requises error(), fatalError() et warning() et qui implante un ErrorHandler au lieu d'un DefaultHandler. Là, celle-là je ne la comprend pas. Il me semble que le DefaultHandler est supposé faire l'affaire puisqu'il comporte toutes les méthodes requises et même plus.

    Pour la méthode de validation avec SAX et à l'analyse, voici le bout de code correspondant:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
        private static void validationSAXImplicite(String xmlString, String schemaFilename) {
     
    		// Création du schéma
        	SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        	File schemaFile = new File(schemaFilename);
        	if ( schemaFile.exists() ) {
        		if ( schemaFile.canRead() ) {
        	    	Schema schema = null;
        	    	try {
        	    		schema = factory.newSchema(new StreamSource(schemaFile));
        	    	}
        	    	catch (SAXException ex) {
        	    		log.error("Impossible de créer le schéma à partir du fichier: " + schemaFilename + "\n", ex);
        	    	}
     
        	    	SAXParserFactory spf = SAXParserFactory.newInstance();
        	    	spf.setNamespaceAware(true);
        	    	spf.setValidating(true);
        	    	String feature = "http://apache.org/xml/features/validation/schema";
        	    	try {
        	    		spf.setFeature(feature, true);
        	    	}
        	    	catch (SAXNotRecognizedException e) {
        	    		log.error("La fonctionnalité: " + feature + " n'est pas reconnue.\n", e);
        	    	}
        	    	catch (SAXNotSupportedException e) {
        	    		log.error("La fonctionnalité: " + feature + " n'est pas supportée.\n", e);    	    		
        	    	}
        	    	catch (ParserConfigurationException e) {
        	    		log.error("Impossible de configurer l'analyseur syntaxique.\n", e);
        	    	}
     
        	    	if ( schema != null ) {
        	    		spf.setSchema(schema);
     
        	    		try {
        	    			SAXParser sp = spf.newSAXParser();
        	    			sp.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", "file://" + schemaFilename);
        	    	    	estValide = true;
            	    		Schema schema2 = null;
            	    		if ( (schema2 = sp.getSchema()) == null ) {
            	    			log.error("Le schéma n'est pas défini.");
            	    		} else {
            	    			if ( schema2.equals(schema) ) {
            	    				log.info("Le schéma est bien défini.");
            	    			} else {
            	    				log.warn("Le schéma défini n'est pas celui anticipé.");
            	    			}
            	    		}
     
     
        	    			sp.parse(new InputSource(new StringReader(xmlString)), dh);
        	    			if ( estValide ) {
        	    				log.info("La requête est valide.");
        	    			} else {
        	    				log.error("La requête n'est pas valide.");
        	    			}
        	    		}
        	    		catch (ParserConfigurationException e) {
        	    			log.error("Impossible de définir la configuratio:\n", e);
        	    		}
        	    		catch (IOException e) {
        	    			log.error("Impossible de lire le schéma:\n", e);
        	    		}
        	    		catch (SAXException e) {
        	    			log.error("La requête est invalide:\n", e);
        	    		}
        	    	} else {
        	    		log.warn("Le schéma n'existe pas ou n'est pas défini.");
        	    	}
     
        		} else {
        			log.error("Le fichier schéma existe, mais n'est pas accessible en lecture.");
        		}
        	} else {
        		log.error("Le fichier schéma: " + schemaFilename + " n'existe pas.");
        	}
     
        }
    Dans ce cas-ci, il y a quelque chose qui m'échappe. Puisque je fais une définition par le menu du schéma via SchemaFactory.newSchema(StreamSource) et qu'ensuite je fais un SAXParserFactory.setSchema(Schema) et bien entendu setValidating(true) et setNamespaceAware(true) quelle est la nécessité de faire un setFeature("http://apache.org/xml/features/validation/schema", true) qui est la même chose il me semble que setValidating(true) et un setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", "file://" + schemaFilename) qui est la même chose il me semble que de faire un setSchema().

    On dirait que quelqu'un a échappé l'API dans le mélangeur, non?

    J'espère que vous allez être un peu plus bavards, parce que jusqu'ici, je ne peux pas dire que ça se bouscule sur le portillon.

Discussions similaires

  1. [XSD] problème de validation XSD
    Par Janko dans le forum Valider
    Réponses: 3
    Dernier message: 17/06/2012, 15h27
  2. [XSD] Problème de validation XSD
    Par ploxien dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 17/04/2008, 00h10
  3. Réponses: 1
    Dernier message: 14/02/2007, 08h14
  4. [XSD] problème de validation
    Par anitshka dans le forum Valider
    Réponses: 1
    Dernier message: 23/11/2006, 12h38
  5. [DOM] Problème de validation XML par rapport à un Schéma XSD
    Par apisto dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 20/09/2006, 15h32

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