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

XML Discussion :

[SAX] Mauvaise syntaxe XML, declenchement des exceptions


Sujet :

XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut [SAX] Mauvaise syntaxe XML, declenchement des exceptions
    Bonjour a tous,

    J'ai d'abord cherché dans cette rubrique et je n'ai pas trouvé la réponse.
    Je parse (avec succès) un fichier XML et range le contenu dans une base de données. Je veux maintenant essayer mon programme dans le cas ou mon fichier XML n'est pas correct.

    Quelque part dans le XML j'ajoute volontairement l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...CPH</destination>
    <trip_distance>884</trip_distance
    <fleet>141,319,320,32...
    (balise "</trip_distance" pas fermée)

    seulement mon parsing (SAX) s'arrête alors et je ne passe par aucun point de débogage de mon programme.
    J'ai surchargé mes fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void fatalError(const SAXParseException&);
    void error(const SAXParseException&);
    void warning(const SAXParseException&);
    mais rien a faire, il ne se passe rien.

    Je voulais donc savoir si il y avait un mécanisme particulier oublié (fonction virtuelle spéciales a surcharger, sachant que j'ai fait le tour de la classe HandlerBase) ou alors si la solution unique était de passer par un fichier DTD ou autre pour faire valider la structure du XML ?

    Merci d'avance a toute tentative de réponse

    Colin

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Quelle bibliothèque utilises-tu ?

    MAT.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Salut,

    C'est Xerces (2-7-0-1 selon le path de mes dépendances), je n'ai pas d'autre choix (Pack de développement)

    Merci

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Il n'y a pas spécialement d'astuce à partir du moment où tu positionnes le error handler correctement.
    Une balise non fermée est a priori une erreur fatale et devrait se solder par une SAXParseException.

    Peut-être qu'un peu de code pourrait aider à voir le problème ?

    MAT.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Salut MAT,

    Voila ma classe Handler :
    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
     
    class myParseHandler : public HandlerBase
    {
    public :
    	myParseHandler();
     
    	void startDocument();
    	void endDocument();
    	void startElement(const XMLCh* const, AttributeList&);
    	void endElement(const XMLCh* const);
    	void characters(const XMLCh* const, const AMD_UInt32);
     
    	void fatalError(const SAXParseException&);
    	void error(const SAXParseException&);
    	void warning(const SAXParseException&);
     
     
    private:
    	DbInsert _insertorObject;
    	std::string _nodeName;
    	CalcData _currentData;
    	Char* _originTmp;
    };

    Il n'y a pas spécialement d'astuce à partir du moment où tu positionnes le error handler correctement.
    Ce sont les seules fonctions erreur que j'ai implémenté. Il y a peut être quelque chose a faire a un autre niveau ?

    En ce qui concerne le corps de characters, endElement etc... cela devrait etre bon car tout fonctionne comme prévu en cas de syntaxe xml correct.

    Colin

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Re,

    Je pense avoir oublié de catcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    catch (const XMLException& toCatch) {
       char* message = XMLString::transcode(toCatch.getMessage());
       TRC_INFO(APP,"Exception message is: "<< message );
       XMLString::release(&message);
       return -1;
    }
    au niveau de lancer le parsing

    A confirmer...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Hi !

    Non toujours pas, tout fonctionne dans mon programme, la seule ombre est que si une balise n'est pas fermée il continue a parser sans rien faire on dirait, et il finit sans message d'erreur, et sans terminer sa tache...

    Colin

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par colin.sauvanet Voir le message
    Ce sont les seules fonctions erreur que j'ai implémenté. Il y a peut être quelque chose a faire a un autre niveau ?
    En fait tu n'as même pas besoin de réimplémenter ces méthodes, leurs implémentations par défaut devraient suffire.
    Comment tu positionnes le handler ?

    MAT.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Salut Mat,

    Voila comment je positionne le Handler :

    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
     
    try {
        XMLPlatformUtils::Initialize();
    }
    catch (const xercesc::XMLException& toCatch) {
        TRC_INFO(APP, "XMLException catched - " );
        return 1;
    } 
    try{
        // SAX parser
        SAXParser parser;
     
        // SAX handler
        myParseHandler handler;
        parser.setDocumentHandler(&handler);
     
        // parse document, the BOM is full after
        parser.parse(argv[1]);
    }
    catch (...)	  { //error actions
    }
     
    XMLPlatformUtils::Terminate();
    Des options a specifier sur le handler / parser ?

    Merci de ton aide.

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ok, ça parait normal.
    Si ce n'est que tu catch( ... ) sans rien faire, mais tu dis dans un message précédent que tu avais essayé d'y mettre un log et que ça ne changeait rien...

    Je ne vois pas trop, mais en même temps je ne fais jamais de SAX.

    MAT.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Ouais c'est normal, j' ai un peu simplifié pour afficher, mais mes catch sont plus important que ça :
    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
     
              catch (const SQLException & e)	  {
    		  TRC_INFO(APP, "SQL exception caught: origin " << e.GetOrigin() << " code: "  << e.GetCode() << " subcode: " << e.GetSubCode() << " specific code: " << e.GetSpecificCode()<< " parameter: " << e.GetParameter());
    		  return 1;
    	  }
    	  catch (COC::AppException & e)	  {
    		  TRC_INFO(APP, e.what());
    		  return 1;
    	  }
    	  catch (const XMLException& toCatch) {
    		  char* message = XMLString::transcode(toCatch.getMessage());
    		  TRC_INFO(APP,"Exception message is: "<< message );
    		  XMLString::release(&message);
    		  return 1;
    	  }
    	  catch (const SAXParseException& toCatch) {
    		  char* message = XMLString::transcode(toCatch.getMessage());
    		  TRC_INFO(APP,"Exception message is: "<< message );
    		  XMLString::release(&message);
    		  return 1;
    	  }
    	  catch (...){
    		  TRC_INFO(APP,"unknow exception catched");
    		  return 1;
    	  }
    Je laisse le post ouvert pour le moment...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Bon voila, en fait c'est bon mais il faut explicitement déclarer le ErrorHandler, dans ce cas mes erreur se déclenchent correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            // SAX parser
    	SAXParser* parser = new SAXParser();
    	// SAX handler
    	myParseHandler* handler = new myParseHandler();
    	ErrorHandler* errHandler = (ErrorHandler*) handler;
    	parser->setDocumentHandler(handler);
    	parser->setErrorHandler(errHandler);
    avec bien sur dans mon myParseHandler la surcharge obligatoire des fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	void fatalError(const SAXParseException&);
    	void error(const SAXParseException&);
    	void warning(const SAXParseException&);
    	void resetErrors();
    et voila, dans ce cas je choppe mes erreur comme il faut et je peux obtenir des messages comme "Fatal Error: Expected end of tag 'avg_equiv_seats' at line: 1094"


    Merci pour ton aide MAT

    ++

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ah oui ok setDocumentHandler != setErrorHandler en fait...

    Et ça, ça ne fonctionne pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            // SAX parser
    	SAXParser* parser = new SAXParser();
    	// SAX handler
    	myParseHandler* handler = new myParseHandler();
    	parser->setDocumentHandler(handler);
    	parser->setErrorHandler(handler);
    MAT.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 15
    Points
    15
    Par défaut
    Yep ça marche aussi

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

Discussions similaires

  1. Gestion des exceptions d'une extraction xml
    Par greatmaster1971 dans le forum kettle/PDI
    Réponses: 2
    Dernier message: 08/09/2008, 13h14
  2. Réponses: 0
    Dernier message: 31/01/2008, 11h43
  3. [débutant] gestion des exceptions dans web.xml
    Par jgaslain dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 06/02/2007, 09h46
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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