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:

| Gabriel Dos Reis wrote:
| > Olivier Azeau writes:
| > [...]
| > | >> A quoi sert "(;)", quelle information cela apporte-t-il
| > (machine +
| > | >> humain)? Si cela denote la semantique d'un complexe pour eviter
| > | >> d'appeler un chat un chat (i.e. prefixer par Complex),
| > | > Mais l'on recherche justement la manière d'appeler un chat. Selon
| > | > le type d'application, on peut utiliser (admettons que l'on veuille
| > | > fixer un membre m à j) :
| > | > m = #c(0 1) ;; pour reprendre la notation à CL
| > | > ou :
| > | > Member m ::= Complex 0 1
| > | > ou :
| > | > <member name="m">
| > | > <complex real="0" imag="1"/>
| > | > </member>
| > | >
| > | | Mais le principal avantage du XML c'est que si tu trouves que la
| > 1ère
| > | forme est plus lisible (question de goût), tu écris qqe chose comme ça
| > | :
| > | | <xsl:template match="//member">
| > | <xsl:value-of select="@name"/> = <xsl:apply-templates/>
| > | </xsl:template>
| > | <xsl:template match="//complex">
| > | #c(<xsl:value-of select="@real"/> <xsl:value-of select="@imag"/>)
| > | </xsl:template>
| > C'était lisible, donc on met plus de bruit, c'est ça ?
| > | Et tes données ne s'afficheront pas en XML mais avec ta notation
| > préférée.
| > je crois que ton newsreader te joue des tours sur le débat en cours.
| > La question n'est pas de faire avaler un format arbitraire à XML.
| >
|
| Il n'est pas question de faire avaler quoi que ce soit.
| Qui a parlé de faire avaler un format arbitraire à XML ? pas moi en tt cas.

# Et tes données ne s'afficheront pas en XML mais avec ta notation
# préférée.

| Je dis juste que si on critique la lisibilité de XML, il me semble
| honnête de préciser que s'il existe un format facile à rendre lisible
| en ASCII avec un effort minimum, c'est bien le XML.

Hein ?

m = #c(0 1)

versus

<xsl:template match="//member">
<xsl:value-of select="@name"/> = <xsl:apply-templates/>
</xsl:template>
<xsl:template match="//complex">
#c(<xsl:value-of select="@real"/> <xsl:value-of select="@imag"/>)
</xsl:template>

... Ou voulais-tu dire

il me semble honnête de préciser que s'il existe un format facile
à rendre illisible en ASCII avec un effort minimum, c'est bien le XML>

je suis entièrement d'accord : il est déjà illisible.

| La réciproque est généralement fausse : transformer de l'ASCII en XML,
| c'est galère.

Oh.

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:

| La question de la simplicité de la transformation est donc réglée.
^^^^^^^^^^^^^^^^^

voulais-tu dire « lisibilité » ?

-- Gaby
Avatar
drkm
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) :

m

#c(01)

--drkm

Avatar
Olivier Azeau
Loïc Joly wrote:
Et pour info, parmi les formats gérés, XML (enrichi par une sémantique
plus riche pour gérer les pointeurs) existe. Tout ça pour dire que ce
qui compte pour la facilité à coder, ce n'est pas le format de sortie,
mais uniquement la qualité de la bibliothèque de sérialisation.



Je ne crois pas avoir jamais dit qu'il fallait abandonner toute
simplicité de code C++ de serialisation au profit de plus grandes
possibilités sur le format d'échange.

Pour moi ce sont 2 problèmes orthogonaux et le meilleur choix ne peut
résulter que d'un compromis.
Je n'hésite pas à dire que manipuler du DOM en C++ c'est quelque chose
qui apporte souvent plus de problèmes que de solutions.
Mais, comme je l'ai déjà dit dans un autre message, avoir un format
d'échange difficilement manipulable hors C++ est également une source de
problèmes et dire qu'on n'a pas besoin d'XML à ce niveau là peut se
révéler tout aussi dangereux que de négliger le code de sérialisation.

Avatar
drkm
Olivier Azeau writes:

La question de la simplicité de la transformation est donc réglée.


Qu'est ce qui est réglé ?


La question de la simplicité de la transformation.

La simplicité du code C++ ou autre qu'il va falloir écrire pour
visualiser des données complexes sérialisées en ASCII ?
On peut tjr rêver...

PS : excuse moi de ne pas tester les fragments de codes qu'il m'arrive
d'écrire ici ou là, surtout quand il s'agit de donner une idée générale.
Ceci étant dit, au caratère espace près pour la séparation real/imag,


Ce qui n'est pas rien ...

Et modulo l'introduction de sauts à la ligne n'importe où dans la
génération d'un format texte orienté-lignes.

et
après vérification, le code fonctionne :

<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="text"/>
<xsl:template match="//member"><xsl:value-of select="@name"/> =
<xsl:apply-templates/></xsl:template>
<xsl:template match="//complex">#c(<xsl:value-of
select="@real"/>&#32;<xsl:value-of select="@imag"/>)</xsl:template>
</xsl:stylesheet>


Mais ce n'est pas du tout le code initial.

Il y a des règles à respecter si tu veux sortir du plain text au
moyen d'un script XSLT. Surtout au niveau des caractères blancs dont
fait partie le retour à la ligne. Et tu es tombé dedans en voulant
montrer la simplicité de la transformation du document XML vers le
fichier plain text correspondant, orienté-lignes.

Ahem.

--drkm


Avatar
drkm
Olivier Azeau writes:

Mais, comme je l'ai déjà dit dans un autre message, avoir un format
d'échange difficilement manipulable hors C++


Tu parles d'ASCII ?!?

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

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

Je vois que ma remarque tombe à plat ;-(
Ne te fatigue pas avec XSLT, la transformation d'un XML n'était pas le
point de ma remarque.

-- Gaby
Avatar
Gabriel Dos Reis
Olivier Azeau writes:

| drkm wrote:
| > Il y a des règles à respecter si tu veux sortir du plain text au
| > moyen d'un script XSLT. Surtout au niveau des caractères blancs dont
| > fait partie le retour à la ligne. Et tu es tombé dedans en voulant
| > montrer la simplicité de la transformation du document XML vers le
| > fichier plain text correspondant, orienté-lignes.
|
| Mais une simplicité, ce n'est jamais quelque chose d'absolu.

N'est-ce pas ?

-- Gaby
Avatar
drkm
Olivier Azeau writes:

drkm wrote:

Olivier Azeau writes:

Mais, comme je l'ai déjà dit dans un autre message, avoir un format
d'échange difficilement manipulable hors C++


Tu parles d'ASCII ?!?


ASCII, binaire, peu importe.


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

--drkm



Avatar
drkm
Olivier Azeau writes:

drkm wrote:

Olivier Azeau writes:

drkm wrote:

Olivier Azeau writes:

Mais, comme je l'ai déjà dit dans un autre message, avoir un format
d'échange difficilement manipulable hors C++


Tu parles d'ASCII ?!?


ASCII, binaire, peu importe.


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.

--drkm