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 :

Erreur pour valider une DTD [DOM]


Sujet :

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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Erreur pour valider une DTD
    Bonjour,

    est ce que quelqu'un peut me dire si j'ai fais une erreur dans mon code:
    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
     
    private String IsValide(String monfichier){
     
          try {
            DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
            fact.setValidating(true);
            DocumentBuilder built = fact.newDocumentBuilder();
            FileInputStream input = new FileInputStream(monfichier);
            Document doc = built.parse(input, null);
          }
          catch (Exception e) {
            return e;
          }
          return "ok";
    }
    En fait, quand je parse mon fichier xml, il me dit bien que mon fichier n'est pas bien formé.
    Par contre, lorsque je test mon xml avec la DTD correspondante, il ne me renvoie pas d'exeption alors que quand je teste avec le logiciel CookTop, j'ai bien une erreur.
    Peut etre que j'ai oublié une ligne de code ou bien que je ne met pas ma DTD au bon endroit!
    merci de votre aide.





    [Modéré par Didier]
    Ajout de tag dans le titre
    Ajout de balises code pour la lisibilité
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre habitué Avatar de phoebe
    Inscrit en
    Août 2003
    Messages
    289
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 289
    Points : 143
    Points
    143
    Par défaut
    pour commencer utilise les balises Code et fais nous voir ton XML et ta DTD[/b]

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Désolé pour les quote... sorry

    donc voici mon xml

    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
     
     
    <?xml version="1.0" standalone="no"?>
     
    <!DOCTYPE RACINE SYSTEM "monDTD.dtd">
     
     
    <RACINE>
    	<SERVICE NAME="controlerATest" NUMEROTEST="bouchon">
    		<PARAMETRE>
    			<OBJET TYPE="java.lang.String" CONSTRUCTEUR="String">2019</OBJET>
    		</PARAMETRE>
    		<RETOUR>
    			<OBJET TYPE="java.lang.Boolean" NAME="controleOk" CONSTRUCTEUR="Boolean">
    				<OBJET TYPE="java.lang.String" NAME="valeurBooleen" CONSTRUCTEUR="String">true</OBJET>
    			</OBJET>
    		</RETOUR>
    	</SERVICE>
    </RACINE>
    et voici ma DTD:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    <!ELEMENT RACINE ( SERVICE+ ) >
    <!ELEMENT SERVICE ( PARAMETRE, RETOUR ) >
    <!ELEMENT PARAMETRE ( OBJET+ ) >
    <!ELEMENT RETOUR ( OBJET? ) >
    <!ELEMENT OBJET ( #PCDATA | OBJET )* >
     
    <!ATTLIST OBJET CONSTRUCTEUR NMTOKEN #REQUIRED >
    <!ATTLIST OBJET NAME NMTOKEN #REQUIRED >
    <!ATTLIST OBJET TYPE NMTOKEN #REQUIRED >
    <!ATTLIST SERVICE NAME NMTOKEN #REQUIRED >
    <!ATTLIST SERVICE NUMEROTEST NMTOKEN #REQUIRED >
    en fait j'ai avancé dans mon problème, j'ai la trace suivante à l'execution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    .Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
     
    set, which is probably not what is desired.  Parser will use a default
     
    ErrorHandler to print the first 10 errors.  Please call
     
    the 'setErrorHandler' method to fix this.
     
    Error: URI=file:I:/IM/Integration_Metier_Commun/SettingFiles/data/bouchons/BouchonControlerATest.xml Line=9: Attribute "NAME" is required and must be specified for element type "OBJET".
    J'aimerais catcher l'erreur dans une exception.
    merci de votre aide

  4. #4
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour,

    Ben il est pas content parce que tu n'as pas mis d'attribut NAME à ta
    balise OBJET.

    <!ATTLIST OBJET NAME NMTOKEN #REQUIRED >

  5. #5
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    re

    Euh, je crois que j'ai répondu à côté de la plaque.

    Tu peux récupérer en définissant un ErrorHandler.
    Je n'ai jamais utilisé DOM. Il faut que tu regardes l'interface ErrorHandler
    et que tu trouves une méthodes setErrorHandler.

    Regarde la Javadoc.[/code]

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    oui ça je le sais j'ai fais expres d'enlever la balise NAME!
    en fait ce que je voudrais c'est récupérer l'erreur dans une exception or actuellement elle est juste afficher dans ma sortie.

    est ce que je dois implémenter une classe avec une méthode setErrorHandler et qui hérite de ErrorHandler?

  7. #7
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    re,


    Pas besoin d'implémenter :

    abstract void setErrorHandler(ErrorHandler eh)
    Specify the ErrorHandler to be used to report errors present in the XML document to be parsed.
    Dans DocumentBuilder.
    Par contre tu dois bien créer un classe qui implément ErrorHandler.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    aurais-tu un exemple stp!
    je ne vois pas trop comment je dois organiser mes classes pour faire le traitement.
    merci

  9. #9
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    re,

    bien sûr pas de probème

    classe qui doit traiter les erreurs :

    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
     
    import org.xml.sax.ErrorHandler;
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
     
     
    public class TraitementErreur implements ErrorHandler {
     
    	/* (non-Javadoc)
    	 * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
    	 */
    	public void warning(SAXParseException exception) throws SAXException {
    		// traitement des warnings
     
    	}
     
    	/* (non-Javadoc)
    	 * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
    	 */
    	public void error(SAXParseException exception) throws SAXException {
    		// traitement des erreurs
     
    	}
     
    	/* (non-Javadoc)
    	 * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
    	 */
    	public void fatalError(SAXParseException exception) throws SAXException {
    		// traitement des erreurs fatales.
     
    	}
     
    }

    et puis tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    built.setErrorHandler(new TraitementErreur());
    volià !

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    je te remercie je vais essayer avec ce que tu m'as donné.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bon j'ai implémenté comme tu m'as indiqué.

    j'ai le code suivant:

    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
     
        private String IsValide(String monfichier){
     
          try {
            DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
            fact.setValidating(true);
            fact.setIgnoringElementContentWhitespace(true);
            DocumentBuilder built = fact.newDocumentBuilder();
            built.setErrorHandler(new TraitementErreur());
            //FileInputStream input = new FileInputStream(monfichier);
            Document doc = built.parse(new File(monfichier));
          }
          catch (Exception e) {
            int i =0;
            return new String("error validation");
          }
          catch (Throwable a){
            int j=0;
          }
     
          return null;
     
        }
    Par contre je ne récupère toujours pas d'exception.
    Comment dois-je implémenter mes méthodes dans TraitementErreur?
    erf je désespère sur le xml...

  12. #12
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    re,

    dans chaque méthodes tu peux faire un


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exception.printStackTrace();
    comme ça tu verras ce qu'il t'envoies.

    En fait, quand le parser détecte une erreur il envoie une
    SAXParseException à une de tes méthodes de ErrorHandler.
    Après, toi t'en fais ce que tu veux. C'est presque pareil qu'un
    try{...} catch{...}.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    ok t'es un master.
    Bon juste une dernière question après je te laisse tranquille.
    Comment il sait qu'il a récupérer un warning, une erreur ou une fatale erreur? existe d'autres error pour le ErrorHandler?

    et enfin j'aimerais que les méthodes me renvoie une SAXException, les méthodes sont déjà throws SAXException mais les exceptions ne sont pas remonter.
    dois-je faire un throw Exception dans le code de mes méthodes?

    encore une fois merci beaucoup de ton aide.

    désolé si je débute.

    Allez bon we!

  14. #14
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    re,

    Je ne sais pas comment il décide.
    Il n'y à pas d'autre erreur dans le ErrorHandler.
    il faut au moins savoir q'une erreur fatale est une erreur blocante.
    Une telle erreur termine généralement le programme.


    Par contre je ne comprend pas ta question de remonter les erreurs.

    Si tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    throw new SAXException(exception.getMessage());
    dans tes méthodes d'erreur,
    je pense que tu obtiendras ce que tu désire.

    bon courage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [W3C] [W3C] Une seule erreur pour validation W3C !?
    Par bond70 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/02/2009, 08h58
  2. [DTD] Cherche une API JAVA pour parser une DTD
    Par nice dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 15/06/2006, 16h00
  3. [VBA-E] Erreur pour copier une feuille
    Par Persons dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/06/2006, 22h38
  4. [SAX] Erreur pour trouver la DTD d'un fichier XML parsé!
    Par gdawirs dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/01/2006, 15h28
  5. Réponses: 1
    Dernier message: 14/10/2005, 09h55

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