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.

10 réponses

Avatar
Gabriel Dos Reis
Olivier Azeau writes:

| J'ai l'impression de parler un peu dans le désert là...

Ah ?
Peut-être n'écoutes-tu pas ceux qui t'écoutes...

-- Gaby
Avatar
Gabriel Dos Reis
Olivier Azeau writes:

| J'ai l'impression de parler un peu dans le désert là...

Ah ?
Peut-être n'écoutes-tu pas ceux qui t'écoutent...

-- Gaby
Avatar
drkm
Olivier Azeau writes:

drkm wrote:

Olivier Azeau writes:

drkm wrote:

L'XML est facilement manipulable en d'autres langages que C++,
mais pas l'ASCII ?


C'est une façon de résumer la chose...


Peux-tu donner des exemples ? J'ai vraiment du mal à te croire
sur parole.


Mais des exemples de quoi ?


De langages où l'ASCII est difficilement manipulable (et où l'XML
l'est facilement).

--drkm




Avatar
Julien Blanc
drkm wrote:

Olivier Azeau writes:

Mais des exemples de quoi ?


De langages où l'ASCII est difficilement manipulable (et où l'XML
l'est facilement).


XSLT ;p.

julien


Avatar
drkm
Julien Blanc writes:

drkm wrote:

Olivier Azeau writes:

Mais des exemples de quoi ?


De langages où l'ASCII est difficilement manipulable (et où l'XML
l'est facilement).


XSLT ;p.


En effet :-). Il me semble avoir vu quelque part des essais
d'utilisation avec de l'ASCII. Mais ça, je ne m'y risquerais pas ...

--drkm



Avatar
Marc Boyer
drkm wrote:
Gabriel Dos Reis writes:
drkm writes:
| La question de la simplicité de la transformation est donc réglée.
^^^^^^^^^^^^^^^^^

voulais-tu dire « lisibilité » ?


Non. Ce n'était peut être pas clair. Je ne me souviens plus si
Olivier à expliqué ce qu'était XSLT en l'introduisant dans la
discussion.

Il s'agit d'un dialecte XML visant à représenter des règles de
transformation d'arbres XML. Lorsque l'on applique, au moyen d'un
processeur XSLT, un script XSLT constitué entre autre des deux modèles
qu'Olivier a donné, à un document comme :

<member name="m">
<complex real="0" imag="1"/>
</member>

on obtient la sortie :

m = #c(0 1)

En fait, avec ses modèles, on obtient plutôt (pas testé, plutôt un
peu au pif, mais ça devrait pas être loin) :


Ce qui m'ammènerait moi à dire qu'on à intéret à stocker ses
formats simples en ASCII, et le jour ou un besoin de transformation
d'arbre devient nécessaire, un petit coup de AWK nous fait
le XML, et puis on joue.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
kanze
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.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Matthieu Moy
drkm writes:

Olivier Azeau writes:

drkm wrote:

Olivier Azeau writes:

drkm wrote:

L'XML est facilement manipulable en d'autres langages que C++,
mais pas l'ASCII ?


C'est une façon de résumer la chose...


Peux-tu donner des exemples ? J'ai vraiment du mal à te croire
sur parole.


Mais des exemples de quoi ?


De langages où l'ASCII est difficilement manipulable (et où l'XML
l'est facilement).


La question n'est pas la manipulation de l'ASCII en général, mais la
manipulation d'un format particulier basé sur l'ASCII (problèmes
d'encodages a part, XML en est un).

En général, ton format sera plus facilement utilisable dans le
language dans lequel tu as commencé a coder, donc en C++ dans le cas
de ce thread. Avec XML, c'est vrai qu'on peut réutiliser une partie du
boulot fait dans un language dans un autre language, ce qui n'est pas
forcement vrai avec d'autres formats.

--
Matthieu





Avatar
drkm
Marc Boyer writes:

drkm wrote:

En fait, avec ses modèles, on obtient plutôt (pas testé, plutôt un
peu au pif, mais ça devrait pas être loin) :


Ce qui m'ammènerait moi à dire qu'on à intéret à stocker ses
formats simples en ASCII, et le jour ou un besoin de transformation
d'arbre devient nécessaire, un petit coup de AWK nous fait
le XML, et puis on joue.


Moi aussi. XSLT est très puissant dans son domaine, transformer un
arbre XML en un autre arbre XML. On peut l'utiliser pour de petits
formatages en ASCII, mais rien de très strict, ÀMHA.

--drkm


Avatar
drkm
writes:

drkm wrote:

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.


En fait, j'avais l'exemple précis des attributs ID en XML. J'ai
l'impression, sans jamais avoir vérifié, que des parseurs se servent
de cette technique pour générer des identifiants uniques. Le but
n'est pas de relire un void *, mais un identifiant string ou
numérique. Y a-t-il des contraintes à cette utilisation ?

Mais il est vrai que cela empêche par exemple de générer un ID dans
un processus différent de celui qui en a déjà créé (pour ajouter un ID
à un document existant, par exemple).

--drkm