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 :

[Xerces-C++] Validation DTD


Sujet :

XML

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Xerces-C++] Validation DTD
    Bonjour,

    J'utilise Xerces-C++ pour lire des fichiers XML et maintenant je voudrais faire valider mes fichiers avec une DTD. Bon, là j'ai ma DTD, je l'ai testée avec le logiciel xmlspy (en lui donnant un fichier qui ne la respecte pas) ça marche nickel.

    Quand je suis passé à Xerces, j'ai lu sur la doc qu'il suffit d'activer l'option "fgSAX2CoreValidation" pour qu'il me fasse la validation. En gros le bout de code ressemble à ç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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    try
    {
    XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& toCatch)
    {
    char* message = XMLString::transcode(toCatch.getMessage());
    fprintf(stderr," erreur, le message d'exception est : %s \n", message);
    XMLString::release(&message);
    }
    SAX2XMLReader* monParser;
    if ( (monParser = XMLReaderFactory::createXMLReader()) == (SAX2XMLReader*) NULL)
    {
    fprintf(stderr," Erreur \n");
    exit(EXIT_FAILURE);
    }
    monParser->setFeature(XMLUni::fgSAX2CoreValidation, true);
     
    MySAX2Handler* mySAX2Handler = new MySAX2Handler(this);
     
    monParser->setContentHandler(mySAX2Handler);
    monParser->setErrorHandler(mySAX2Handler);
     
    try
    {
    monParser->parse(XMLFile);
    }
     
    catch (const XMLException& toCatch)
    {
    char* message = XMLString::transcode(toCatch.getMessage());
    fprintf(stderr, "erreur analyseur, le message d'exception est : %s \n", message);
    XMLString::release(&message);
    }
    catch (const SAXParseException& toCatch)
    {
    char* message = XMLString::transcode(toCatch.getMessage());
    fprintf(stderr, "erreur analyseur, le message d'exception est : %s \n", message);
    XMLString::release(&message);
    }
    catch (...)
    {
    fprintf(stderr, "exception innatendue\n");
    }
    La lecture des fichiers XML marche, par contre la validation DTD pas du tout . Est-ce que j'ai activé correctement la validation DTD ? sinon comment faire ?

    Merci d'avance pour votre aide.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Validation XML - DTD Xerces
    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
    // Entete du fichier
    #include <xercesc/util/NameIdPool.hpp>
    #include <xercesc/util/PlatformUtils.hpp>
    #include <xercesc/framework/XMLValidator.hpp>
    #include <xercesc/parsers/SAXParser.hpp>
    #include <xercesc/validators/DTD/DTDValidator.hpp>
    #include <xercesc/util/OutOfMemoryException.hpp>    
    #if defined(XERCES_NEW_IOSTREAMS)
    #include <iostream>
    #else
    #include <iostream.h>
    #endif
    #include <stdlib.h>
    #include <string.h>
     
     
    XERCES_CPP_NAMESPACE_USE 
     
    //Dans ton code
    // Initialize the XML4C system
        try
        {
             XMLPlatformUtils::Initialize();
        }
     
        catch (const XMLException& toCatch)
        {
    		MessageBox("Error during initialization! Message:\n");
        }
     
     
        SAXParser::ValSchemes    valScheme = SAXParser::Val_Auto;
     
        //
        //  Create a DTD validator to be used for our validation work. Then create
        //  a SAX parser object and pass it our validator. Then, according to what
        //  we were told on the command line, set it to validate or not. He owns
        //  the validator, so we have to allocate it.
        //
        int errorCount = 0;
        DTDValidator* valToUse = new DTDValidator;
        SAXParser* parser = new SAXParser(valToUse);
        parser->setValidationScheme(valScheme);
     
        //
        //  Get the starting time and kick off the parse of the indicated
        //  file. Catch any exceptions that might propogate out of it.
        //
        int errorCode = 0;
        try
        {
            parser->parse("Logiconf.xml");
            errorCount = parser->getErrorCount();
        }
        catch (const OutOfMemoryException&)
        {
            MessageBox("OutOfMemoryException");
            errorCode = 5;
        }
        catch (const XMLException& e)
        {
    		MessageBox("Error during parsing"); 
    		errorCode = 4;
        }
        if(errorCode) {
            XMLPlatformUtils::Terminate();
    		MessageBox("Error code");
        }
     
        if (!errorCount) {
    		MessageBox(" XML + DTD = OK :)");
    	}
    	else
    		MessageBox("Ca marche poooooooooooooooooooo");
     
    	 //
        //  Delete the parser itself.  Must be done prior to calling Terminate, below.
        //
        delete parser;
     
        // And call the termination method
        XMLPlatformUtils::Terminate();

Discussions similaires

  1. [DTD] java oracle validation DTD
    Par gojira dans le forum Valider
    Réponses: 2
    Dernier message: 30/06/2011, 17h37
  2. [XML]EntityResolver / Validation DTD fourni dans le jar
    Par Julaie95 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 30/12/2008, 23h37
  3. Xerces C++ : validation et DTD
    Par Patriarch24 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 09/08/2007, 18h15
  4. [debutant] erreur de validation DTD/schema
    Par loic_86 dans le forum Valider
    Réponses: 1
    Dernier message: 13/01/2006, 22h04
  5. [DOM] XML et validation DTD
    Par getupa dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 18/11/2005, 15h05

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