Bonjour les geeks
tout est dans l'intitulé !!! je sais le faire avec dom mais sax ça ce un autre delire !! et comme les objets ont créés avec des clics de souris !!! la méthode sax me semble la plus appropriée .
merci pour la reponse
l'objectif du logiciel ce de faire un creaturelike en polygone mdr Nom : Creaturesalbianyearsboxshot.jpg
Affichages : 218
Taille : 24,5 Ko

fichier xml de données :
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
 
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <centaurien id="0">
        <identite nom="adam" sexe="0" age="18" conjoint="eve" gene="1"/>
        <famille>
            <parents pere="*" mere="*"/>
            <enfants>
                <enfant id="0">theodore</enfant>
                <enfant id="1">lima</enfant>
                <enfant id="2">zerdu</enfant>
            </enfants>
        </famille>
    </centaurien>
    <centaurien id="1">
        <identite nom="eve" sexe="2" age="17" conjoint="adam" gene="1"/>
        <famille>
            <parents pere="*" mere="*"/>
            <enfants>
                <enfant id="0">theodore</enfant>
                <enfant id="1">lima</enfant>
                <enfant id="2">zerdu</enfant>
            </enfants>
        </famille>
    </centaurien>
    <centaurien id="2">
        <identite nom="buddha" sexe="0" age="18" conjoint="shiva" gene="1"/>
        <famille>
            <parents pere="*" mere="*"/>
            <enfants>
                <enfant id="0">maria</enfant>
                <enfant id="1">lima</enfant>
                <enfant id="2">zerdu</enfant>
            </enfants>
        </famille>
    </centaurien>
    <centaurien id="3">
        <identite nom="shiva" sexe="1" age="17" conjoint="buddha" gene="1"/>
        <famille>
            <parents pere="*" mere="*"/>
            <enfants>
                <enfant id="0">maria</enfant>
                <enfant id="1">lima</enfant>
                <enfant id="2">zerdu</enfant>
            </enfants>
        </famille>
    </centaurien>
    <centaurien id="4">
        <identite nom="desire" sexe="0" age="12" conjoint="diablo" gene="2"/>
        <famille>
            <parents pere="seb" mere="lea"/>
            <enfants>
                <enfant id="0">nickao</enfant>
                <enfant id="1">lucy</enfant>
                <enfant id="2">nigu</enfant>
            </enfants>
        </famille>
    </centaurien>
    <centaurien id="5">
        <identite nom="diablo" sexe="0" age="12" conjoint="desire" gene="2"/>
        <famille>
            <parents pere="theodore" mere="maria"/>
            <enfants>
                <enfant id="0">nickao</enfant>
                <enfant id="1">lucy</enfant>
                <enfant id="2">nigu</enfant>
            </enfants>
        </famille>
    </centaurien>
        <centaurien id="5">
        <identite nom="theodore" sexe="0" age="12" conjoint="maria" gene="2"/>
        <famille>
            <parents pere="adam" mere="eve"/>
            <enfants>
                <enfant id="0">decibel</enfant>
                <enfant id="1">diablo</enfant>
                <enfant id="2">negatif</enfant>
            </enfants>
        </famille>
    </centaurien>
            <centaurien id="5">
        <identite nom="maria" sexe="1" age="12" conjoint="theodore" gene="2"/>
        <famille>
            <parents pere="buddha" mere="shiva"/>
            <enfants>
                <enfant id="0">decibel</enfant>
                <enfant id="1">diablo</enfant>
                <enfant id="2">negatif</enfant>
            </enfants>
        </famille>
    </centaurien>
</root>
classe metier Centaurien :
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
 
class Centaurien
{
    public:
        Centaurien(string nom,int n);
        virtual ~Centaurien();
        int choixSexe(int n);
        string getNom(){return nomCentaurien;}
        string getChars();
    protected:
    private:
    string nomCentaurien;
    string nomConjoints;
    string nomEnfants;
    int sexe;
    int age;
    int nbreCote;
 
};
 
Centaurien::Centaurien(string nom,int n) :nomCentaurien(nom),nbreCote(n)
{
}
int Centaurien::choixSexe(int n){
    int choix=n%3;
            switch(choix){
            case 0 : cout<<"male  : ";return 0;break;
        case 1 : cout<<"feminin  : ";return 1;break;
        case 2 : cout<<"androgyne  : ";return 2;break;} }
Centaurien::~Centaurien()
{
    //dtor
}
classe Parser :
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
 
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace xercesc;
 
class ParserSAX : public DefaultHandler
{
    public:
        ParserSAX();
        void startElement(const XMLCh *const uri,const XMLCh *const localname,
                          const XMLCh *const qname,const Attributes &attrs);
        void characters(const XMLCh *const chars,const unsigned int length);
        void fatalError(const SAXParseException&);
        virtual ~ParserSAX();
    protected:
    private:
 
};
 
ParserSAX::ParserSAX()
{
 
}
void ParserSAX::startElement(const XMLCh *const uri,const XMLCh *const localname,
                  const XMLCh *const qname,const Attributes &attrs){
    cout<<"--------------------------------------------------"<<endl;
    char* messUri=XMLString::transcode(uri);
    char* messLocalName=XMLString::transcode(localname);
    char* messQName=XMLString::transcode(qname);
    cout<<"Elem : "<<" LocalName : "<<messLocalName<<endl;
    XMLString::release(&messUri);XMLString::release(&messLocalName);XMLString::release(&messQName);
    for(int i=0;i<attrs.getLength();i++){
    char* messAttrNom=XMLString::transcode(attrs.getQName(i));
    char* messAttrVal=XMLString::transcode(attrs.getValue(i));
    cout<<"Attr : "<<messAttrNom<<" : "<<messAttrVal<<endl;
    XMLString::release(&messAttrNom);XMLString::release(&messAttrVal);
    }
}
void ParserSAX::characters(const XMLCh *const chars,const unsigned int length){
char* messChars=XMLString::transcode(chars);
cout<<"valeur Element : "<<messChars<<endl;XMLString::release(&messChars);
}
void ParserSAX::fatalError(const SAXParseException& exception){
    char* message = XMLString::transcode(exception.getMessage());
    cout << "Fatal Error: " << message
         << " at line: " << exception.getLineNumber()
         << endl;
}
ParserSAX::~ParserSAX()
{
    //dtor
}
fichier main :
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
 
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "Centaurien.h"
  #include <xercesc/sax2/SAX2XMLReader.hpp>
    #include <xercesc/sax2/XMLReaderFactory.hpp>
    #include <xercesc/sax2/DefaultHandler.hpp>
    #include <xercesc/util/XMLString.hpp>
 
    #if defined(XERCES_NEW_IOSTREAMS)
    #include <iostream>
    #else
    #include <iostream.h>
    #endif
#include "ParserSAX.h"
    XERCES_CPP_NAMESPACE_USE
int main(int argc, char *argv[])
{
 
 try {
            XMLPlatformUtils::Initialize();
        }
        catch (const XMLException& toCatch) {
            char* message = XMLString::transcode(toCatch.getMessage());
            cout << "Error during initialization! :\n";
            cout << "Exception message is: \n"
                 << message << "\n";
            XMLString::release(&message);
            return 1;
        }
 
        char* xmlFile = "famille.xml";
        SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
        parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
        parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional
 
        ParserSAX* defaultHandler = new ParserSAX();
        parser->setContentHandler(defaultHandler);
        parser->setErrorHandler(defaultHandler);
 
        try {
            parser->parse(xmlFile);
        }
        catch (const XMLException& toCatch) {
            char* message = XMLString::transcode(toCatch.getMessage());
            cout << "Exception message is: \n"
                 << message << "\n";
            XMLString::release(&message);
            return -1;
        }
        catch (const SAXParseException& toCatch) {
            char* message = XMLString::transcode(toCatch.getMessage());
            cout << "Exception message is: \n"
                 << message << "\n";
            XMLString::release(&message);
            return -1;
        }
        catch (...) {
            cout << "Unexpected Exception \n" ;
            return -1;
        }
        delete parser;
        delete defaultHandler;
    return 0;
}
ps : l'idée ce quand meme de recuperer les données du fichier xml pour les balancer dans opengl avec la classe metier

ps2 : elle sert à quoi cette classe SAX2XMLReader misà part lire le fichier xml ?