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

  1. #1
    Membre du Club
    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
    Points : 48
    Points
    48
    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
    Points : 13 017
    Points
    13 017
    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 chevronné
    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
    Points : 2 205
    Points
    2 205
    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
    Points : 13 017
    Points
    13 017
    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 chevronné
    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
    Points : 2 205
    Points
    2 205
    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
    Points : 4 846
    Points
    4 846
    Par défaut
    Ou sur un wrapper fait via XSD (le générateur, pas le schéma) + Xerces...

  7. #7
    Membre du Club
    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
    Points : 48
    Points
    48
    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

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Tu ne pourras désérialiser avec boost qu'un fichier préalablement sérialisé avec boost, que se soit une sérialisation en binaire, en texte ou en XML.
    Il n'y a pas de parser XML générique dans boost. Mais si tu "triches" en faisant croire à boost qu'un fichier XML a été sérialisé par ses soins, pourquoi pas.

  9. #9
    Membre du Club
    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
    Points : 48
    Points
    48
    Par défaut
    Ok, je vois. Je pense que je vais "tricher" alors.

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