Classe pour manipuler des XML

Classe pour manipuler des XML - C++ - Programmation

Marsh Posté le 25-06-2003 à 17:28:56    

Salut,
 
alors voilà mon problème:
 
je dois manipuler trois types de XML
 
(Ex: http://oppc.free.fr/divers/contenu.xml
http://oppc.free.fr/divers/coucou3.xml
http://oppc.free.fr/divers/grebas.xml )
 
J'ai donc créé une classe qui me permette de naviguer dans le XML et de récupérer une valeur, un attribut, le nombre de noeuds enfants, et bien sûr de modifier ce XML.
 
En gros, je remplis une liste avec la suite des noeuds enfants sur lesquels je veux me diriger ( ex: 0,1,0,2 => 1er noeud enfant, puis 2ème, puis 1er, puis 3ème) puis quand je veux une valeur, je lance une fonction Get qui me récupère ce que je veux... (Ex: Get("toto" ) pour récupérer la valeur de l'attribut toto)
 
Le problème est que si je fais une erreur de frappe, ben ça merde lamentablement.
 
Donc je voulais savoir ce que vous me conseilliez:
 

  • utiliser une lib spéciale (si la "complexité" de mes XML est suffisante)
  • autre chose :D


Pour autre chose, voici ce qu'il est ressorti d'une discussion avec l'un d'entre vous:
 

  • Travailler avec des enum regroupant les noeuds possibles
  • Utiliser des arbres et map pour recréer la structure des XML


Vous en pensez quoi?
 
Merci d'avance!


---------------
Another .Net Blog
Reply

Marsh Posté le 25-06-2003 à 17:28:56   

Reply

Marsh Posté le 25-06-2003 à 17:32:10    

Y eu un sujet y a qq temsp de ca, mais sinon
 
TinyXML, Expat pour lib simple ou le poid lourd Xerces-C++

Reply

Marsh Posté le 25-06-2003 à 17:53:51    

Non, c'est pas ça que je demandais...
 
J'utilise la lib XML de Borland pour ça...
 
Ce que je veux, c'est éviter de taper tout le temps les mêmes choses et de créer une classe pour simplifier tout ça...
 
Ex: XML->Push(1) à la place de _di_IXMLNode Node = Parent->ChildNodes->GetNode(1);
 
Mais ce qui me pose un cas de conscience, c'est pour la récupération d'un attribut...
 
Prenons le noeud suivant:
 

Citation :

<T3R Nom="Tir a 3 points reussi" Couleur="8421376" />


 
Si je veux récupérer la valeur de l'attribut Nom, pour l'instant je fais
 

Code :
  1. XML->Get("Nom" );


 
Mais imaginons que je ne me rende pas compte que j'ai tapé:
 

Code :
  1. XML->Get("nom" );


 
Ben là ça marche pas parce que nom n'est pas un attribut...
 
Donc ce que je voulais savoir, c'est comment résoudre ça...
 
Moi j'avais pensé à un enum pour chaque niveau de mon XML.
 
Par exemple pour le premier niveau de ce XML:
http://oppc.free.fr/divers/contenu.xml
 
J'ai soit Joueurs, soit Equipes, soit IndexCD
 
Je les met dans un enum qui represente le premier niveau, et je fais:
 

Code :
  1. XML->Get(Classe::Joueurs)


 
Comme ça ça permet de mieux gérer les erreurs et exceptions...
 
Ou bien on m'avait également parlé de créer un arbre + maps pour chaque XML qui serait une représentation de chaque structure de XML, ce qui empêcherait (normalement, pour ce que je m'y connais en maps et arbres) une erreur de ce type...
 
J'espère avoir été plus clair...


---------------
Another .Net Blog
Reply

Marsh Posté le 25-06-2003 à 20:33:22    

>> Ben là ça marche pas parce que nom n'est pas un attribut...
 
Pas compris ...
 
Pour le reste, il y a le xpath http://www.w3.org/TR/xpath.html qui te permet de rechercher une ou plusieurs nodes dans un document xml.
 
Plus qq exemples http://www.zvon.org/xxl/XPathTutor [...] mples.html

Reply

Marsh Posté le 25-06-2003 à 22:35:05    

le nom de l'attribut est "Nom".
 
Or si je fais Get("nom" ), il me trouve pas l'atrribut à cause d'une faute de frappe...
 
Donc ce que je recherche, c'est un système me permettant de limiter au maximum les erreurs de ce type grâce à une liste de mots clés indiquant le noeud ou l'attribut à récupérer...


---------------
Another .Net Blog
Reply

Marsh Posté le 25-06-2003 à 22:36:23    

Je viens de trouver qqch qui pourrait m'être utile: les multimap
 

Code :
  1. typedef multimap<AnsiString, AnsiString> Int2String;
  2. // Remplit une liste d?éléments pour ces maps :
  3. typedef list<pair<AnsiString, AnsiString> > lv;
  4. lv l;
  5. l.push_back(lv::value_type("Parent1", "Enfant1" ));
  6. l.push_back(lv::value_type("Parent1", "Enfant2" ));
  7. l.push_back(lv::value_type("Parent2", "Enfanta" ));
  8. l.push_back(lv::value_type("Parent2", "Enfantb" ));
  9. // Construit une map et l?initialise avec la liste :
  10. Int2String i2s(l.begin(), l.end());
  11. pair<Int2String::iterator, Int2String::iterator> p = i2s.equal_range("Parent1" );
  12. for (Int2String::iterator i = p.first; i != p.second; ++i)
  13.         ShowMessage(i->first + " : " + i->second);


 
Donc je pourrais peut-être remplir une multimap avec en mots-clés tous les noeuds du XML ayant des attributs, puis le nom des attributs en deuxième paramètre...
 
Vous en pensez quoi?


Message édité par haazheel le 25-06-2003 à 22:47:36

---------------
Another .Net Blog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed