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 :

Valider un XML avec un XSD


Sujet :

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

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut Valider un XML avec un XSD
    Bonjour,

    J'amerais valider un fichier xml à partir d'un fichier xsd.

    Pour cela, j'ai fais ceci :
    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
     
    public static void validate() {
    	try {
    		// parse an XML document into a DOM tree
    		DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    		Document document = parser.parse(new File("C://java/testXML/MonXML2.xml"));
     
    		// create a SchemaFactory capable of understanding WXS schemas
    		SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
     
    		// load a WXS schema, represented by a Schema instance
    		Source schemaFile = new StreamSource(new File("C://java/testXML/schema.xsd"));
    		 Schema schema = factory.newSchema(schemaFile);
     
    		// create a Validator instance, which can be used to validate an instance document
    		Validator validator = schema.newValidator();
     
    		 // validate the DOM tree
     
    		 validator.validate(new DOMSource(document));
     
    		 s_logger.debug("Validation OK ....");
     
    		} catch (SAXException e) {
    			s_logger.fatal(e.getMessage(), e);
    		} catch (ParserConfigurationException e) {
    			s_logger.fatal(e.getMessage(), e);
    		} catch (IOException e) {
    			s_logger.fatal(e.getMessage(), e);
    		}
    	}
    Voici le xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8"?>
     
    <birthdate>
        <month>January</month>
        <day>21</day>
        <year>1983</year>
    </birthdate>
    Et le 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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
     
      <xs:import namespace="http://www.w3.org/XML/1998/namespace"
            schemaLocation="http://www.w3.org/2001/xml.xsd" />
     
      <xs:element name="birthdate">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="month" type="xs:string" />
            <xs:element name="day" type="xs:int" />
            <xs:element name="year" type="xs:int" />
          </xs:sequence>  
        </xs:complexType>
      </xs:element>
     
    </xs:schema>
    J'obtiens l'erreur suivante :

    2008-03-10 16:33:37,078 [main] FATAL ch.idinfo.business.baseservices.medidata.DOMValidator - cvc-elt.1: Cannot find the declaration of element 'birthdate'.
    org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'birthdate'.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1887)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
    at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:273)
    at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:240)
    at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:186)
    at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:100)
    at javax.xml.validation.Validator.validate(Validator.java:127)
    at ch.idinfo.business.baseservices.medidata.DOMValidator.validate(DOMValidator.java:68)
    at ch.idinfo.business.baseservices.medidata.ExportInvoiceToXML.start(ExportInvoiceToXML.java:629)
    at ch.idinfo.business.baseservices.medidata.ExportInvoiceToXML.main(ExportInvoiceToXML.java:56)
    Je me demande de quoi peut provenir l'erreur car birthdate est bien déclaré.... Est-ce que ça vient à cause des namespace ?

    Qqun peut-il m'éclairer svp ?
    Merci d'avance

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Points : 6
    Points
    6
    Par défaut possible en ligne de commande avec xmllint
    Bonjour;
    pour valider un fichier "xml" avec un XSchema "xsd", tu peux utiliser une classe java comme tu le fais (j'apprends a la faire moi aussi, donc je ne peux rien t'apprendre sur ça).

    Mais tu peux aussi valider ton fichier en ligne de commande (par le terminal).
    pour cela , tu utilises Xmllint, comme suit:

    xmllint -schema ton_fichier.xsd ton_fichier.xml

    j'espère que ça te sera utile.

    Bon courage.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    J'ai essayer ce que tu m'a dis, mais j'obtiens l'erreur comme quoi xmllint n'est pas reconnu en tant que commande interne ou externe ....

    Faut-il faire qqch de spécial ?

    Merci pour ton aide

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Points : 459
    Points
    459
    Par défaut
    Dans le xsd tu peux retirer le <xs:import> il ne sert pas.

    Ensuite, je n'ai pas testé ton code mais tu peux faire bcp + simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Source schemaFile = factory.newSchema(new File("C:/java/testXML/schema.xsd"));
     
    Validator validator = schema.newValidator();
    validator.validate(new StreamSource(new FileInputStream("C:/java/testXML/MonXML2.xml")));
    Et comme l'intéret d'une validation c'est aussi d'avoir un compte rendu des erreurs, je te conseille d'utiliser ces 2 méthodes :

    factory.setErrorHandler(ErrorHandler errorHandler)
    et
    validator.setErrorHandler(ErrorHandler errorHandler)

    (il faut faire ton propre ErrorHandler)

Discussions similaires

  1. [Contributions] Comment valider un XML avec un XSD ?
    Par Community Management dans le forum Valider
    Réponses: 16
    Dernier message: 26/08/2015, 15h56
  2. [XML] Valider un XML avec un XSD en VB
    Par Amuny dans le forum VB.NET
    Réponses: 0
    Dernier message: 05/04/2012, 15h54
  3. TXSDVALIDATOR - Valider un XML avec un XSD
    Par tofepp dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 23/02/2012, 17h29
  4. Réponses: 4
    Dernier message: 15/11/2007, 10h44
  5. [XSD][JAVA] Valider un XML avec un XSD schéma
    Par vad dans le forum Valider
    Réponses: 1
    Dernier message: 17/08/2005, 11h47

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