IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Parser des fichiers XML avec boost


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut Parser des fichiers XML avec boost
    Bonjour,

    Je développe actuellement un programme C++ manipulant des fichiers XML. Je génère donc mes fichiers XML constitués des informations présentes dans mes objets C++.

    Je voudrais aussi pouvoir récupérer des infos d'autres fichiers XML afin de créer de nouvelles instances d'objets C++.

    Pour générer le XML j'utilise la librairie boost, et sa sérialization sous forme de fichier XML.

    J'ai pu voir sur un tutoriel developpez.com qu'il été possible d'inclure boost::archive:: xml_iarchive par opposition à boost:: archive:: xml_oarchive (utilisé pour la génération XML). Mais je n'ai trouvé aucun exemple sur le parsing avec boost à part avec un autre outil proposé par boost : le boost::spirit qui permet de définir des parseurs (mais là encore peu d'exemple).

    Alors Connaissez-vous un moyen de parser du XML avec boost (librairie déjà largement exploitée dans mon projet : thread, mutex,...) ? Quelques exemples simples ne seraient pas de refu.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    De ce que je comprends du tuto et de l'exemple de la doc boost, c'est quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <boost/archive/xml_iarchive.hpp>
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    #include <fstream>
    #include <vector>
     
    // classe à sérialiser
    class Test{
    public:
    	Test(){}
        Test(int i, std::string c, float f1, float f2){
            a=i;
            s=c;
            v.push_back(f1);
            v.push_back(f2);
        }
     
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version)
    {
         ar & BOOST_SERIALIZATION_NVP(a) &
    	 BOOST_SERIALIZATION_NVP(s) &
    	 BOOST_SERIALIZATION_NVP(v);
    }
        int a;
        std::string s;
        std::vector<float> v;
    };
     
     
    int main()
    {
       { // ecriture
          std::ofstream ofile("archive.xml");
          boost::archive::xml_oarchive oTextArchive(ofile);
          Test t(2, std::string("essai"), 2.0, 3.5);
          oTextArchive << BOOST_SERIALIZATION_NVP(t);    // sérialisation de t
       }
     
       {// lecture
          std::ifstream ifile("archive.xml");
          boost::archive::xml_iarchive iTextArchive(ifile);
          Test t2;
          iTextArchive >> BOOST_SERIALIZATION_NVP(t2);    // sérialisation de t
       }
     
       return 0;
    }
    En revanche, cela ne sert pas à 'parser' du XML mais à relire un objet sérialiser en XML avec Boost.

  3. #3
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    La doc de spirit (surtout en V2) est vraiment exhaustive et comprends notamment l'écriture d'un parser pour du "tinyxml" (un xml simplifié au max) qui pourrait t'aider .

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Goten Voir le message
    La doc de spirit (surtout en V2) est vraiment exhaustive et comprends notamment l'écriture d'un parser pour du "tinyxml" (un xml simplifié au max) qui pourrait t'aider .
    Pourquoi ne pas partir sur tinyXML alors...

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    +1, c'est juste un lapsus révélateur ... La doc de spirit montre un exemple permettant de parser un minixml xD. (simplifié quoi).
    Et ouai autant éviter de réinventer la roue, utilise tinyxml.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Ou sur un wrapper fait via XSD (le générateur, pas le schéma) + Xerces...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    J'ai réussi à appliquer le morceau de code du tuto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    //récupération des infos Action
    Action tRecupAction;
        std::ifstream ifile2("action.xml");
        boost::archive::xml_iarchive ia2(ifile2);
        ia2 >> BOOST_SERIALIZATION_NVP(tRecupAction);
    	std::cout << std::endl;	
    	std::cout <<  tRecupAction.pays << std::endl;
    	std::cout <<  tRecupAction.ville << std::endl;   
     
    		for(std::vector<int>::iterator itItem = (tRecupAction.date).begin(); 
    			itItem!=(tRecupAction.date).end(); itItem++)
    		{
    				std::cout << (*itItem) << std::endl;
    		}
    ma classe action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    // classe à sérialiser
    class Action{
     
    public:
    	std::string pays;
        std::string ville;
        std::vector<int> date;
     
    	Action(){}
        Action(std::string p, std::string v, int i1, int i2, int i3){
            pays=p;
            ville=v;
            date.push_back(i1);
            date.push_back(i2);
    		date.push_back(i3);
        }
     
    private:
     
    	friend class boost::serialization::access;
     
    	template<class Archive>
    	void serialize(Archive& ar, const unsigned int version)
    	{
         ar & BOOST_SERIALIZATION_NVP(pays) & 
    	 BOOST_SERIALIZATION_NVP(ville) & 
    	 BOOST_SERIALIZATION_NVP(date);        
    	}
    };
    mon fichier XML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE boost_serialization>
     
    <boost_serialization signature="serialization::archive" version="5">
      <action class_id="0" tracking_level="0" version="0">
        <pays>france</pays>
        <ville>paris</ville>
        <date>
          <count>3</count>
          <item_version>0</item_version>
          <item>25</item>
          <item>02</item>
    	  <item>2010</item>
        </date>
      </action>
    </boost_serialization>
    Le fichier XML est écrit par mes soins. Il est vrai que j'ai pris soin d'ajouter le doctype boost_serialization, et la balise anglobante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <boost_serialization signature="serialization::archive" version="5">
    Mais pour le reste le fichier XML est standard (il est d'ailleurs généré par du code Java et Jdom), donc boost sert bien de parser XML non ? Ou bien je ne saisi pas la nuance entre parser et déserializer....

    Merci pour vos réponses

Discussions similaires

  1. Parser un fichier xml avec des tag names contenant ":" !
    Par sofien dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/11/2010, 10h40
  2. [CXF et JAXB] Parser un fichier XML avec des namespaces
    Par cowa dans le forum Services Web
    Réponses: 0
    Dernier message: 26/02/2009, 14h30
  3. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  4. Serait il possible de parser des ficheirs xml avec c++ ,
    Par jlassira dans le forum Bibliothèques
    Réponses: 11
    Dernier message: 04/01/2006, 12h58
  5. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo