1 pièce(s) jointe(s)
[Xerces] Récuperer la valeur d'un nœud avec SAX2
Bonjour les geeks :D
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 :D
l'objectif du logiciel ce de faire un creaturelike en polygone mdr :mrgreen:Pièce jointe 158375
fichier xml de données :
Code:
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:
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:
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:
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 ?