OVH Cloud OVH Cloud

XML en C++ : générer le xml et le parser

101 réponses
Avatar
noone
Bonjour,

je débute en C++ (j'ai fait un peu de C# avant)
L'avantage du C# était de pouvoir sérialiser facilement des objets c'est
à dire les stocker en XML.

Je ne sais pas trop comment m'y prendre en C++.

Quelle librairie utiliser (dans un projet utilisant déjà wxWidgets pour
l'interface graphique) ?

Pour les stocker je fais ceci :

// ===============================

#include <iostream> // pour cout
#include <fstream> // pour ofstream

using namespace std;

class Complexe {
public:
double x;
double y;

void Show()
{
cout << this->x << "+i*" << this->y << endl;
}
};

ostream & operator << (ostream & o,const Complexe & c)
{
return o
<< "<?xml version=\"1.0\"?>" << endl
<< "<Complexe" << " "
<< "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" << endl
<< "<Re>" << c.x << "</Re>" << endl
<< "<Im>" << c.y << "</Im>" << endl
<< "</Complexe>" << endl;
}


int main()
{
Complexe cplx;
cplx.x=1;
cplx.y=2;

cplx.Show();

ofstream ofs("cplx.xml");

ofs << cplx << endl;
cout << cplx << endl;
}

// ======================


C'est un peu lourd à gérer non ?

Donc en clair avez vous une technique pour générer du xml simplement (et
avec fiabilité) ?

Comment parser ensuite ce fichier XML ?

Merci d'avance de vos réponses.

1 réponse

7 8 9 10 11
Avatar
Olivier Azeau
wrote:
Olivier Azeau wrote:

wrote:

drkm wrote:




writes:





Seulement, je ne connais pas de façon à gérer ces
identificateurs de façon générique.






Un genre de :





std::ostringstream oss ;
oss << ( void * ) & lObjet ;
oss.string() ;





ne convient pas, pour ce genre de cas ?





Et comment tu récupères l'information lors de la lecture ?
Sur une machine avec une autre architecture de pointeur, par
exemple ?




Il n'est pas donné que je puisse lire la sortie d'un void*
sur une autre machine. Et si je réussis à le lire, qu'est-ce
que j'en fait -- les objets sont prèsque certainement à
d'autres adresses.




Je les mets dans un tableau associatif ? Avec éventuellement
une classe pointeur qui gère ça de façon transparente ? Si on
n'a pas de contrainte de persistance des identifiants et pas
trop de problèmes de performance, ça peut passer, non ?



Si le programme qui lit ne les traite que comme des chaînes de
caractères. Je suppose alors que c'est un générateur de chaîne
aléatoire comme un autre, avec l'avantage qu'il garantit que les
clés soient uniques automatiquement. Ceci dit, dans ce cas-là,
je n'en vois pas l'avantage sur ++nextId.


Moi non plus. D'ailleurs, dans les cas que je connais c'est ce
"++nextId" qui est utilisé...


Note que dans le cas de l'utilisation de void*, tu n'es pas
garantie qu'un autre programme puisse les lire comme void*. Et
qu'il faut s'occuper des séparateurs. Dans le contexte de XML,
on ferait « dest << '"' << (void*)&obj << '"' », mais dans des
protocols plus simple, on ne veut pas forcément avoir à gérer
les chaînes arbitraires délimitées par des ". Or, si je sais que
++nextId ne génèrerait jamais que [1-9][0-9]*, c'est loin d'être
le cas avec (void*)&obj.







7 8 9 10 11