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 :

Extraire d'un fichier XML un attribut objet


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 Extraire d'un fichier XML un attribut objet
    Bonjour,

    Après avoir fait les tutoriels sur boost archive, et boost serialization, il s'avère qu'en pratique, les difficultés sont plus importantes.

    J'ai le fichier Xml suivant :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE boost_serialization>
     
     
     
    <boost_serialization signature="serialization::archive" version="5">
     
      <itineraire>
     
        <nbCheckpoint>12</nbCheckpoint>
     
        <checkpoint>
     
          <pointX>2296.0</pointX>
     
          <pointY>3476.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>2356.0</pointX>
     
          <pointY>3212.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>2008.0</pointX>
     
          <pointY>2804.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>1708.0</pointX>
     
          <pointY>2624.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>1332.0</pointX>
     
          <pointY>2780.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>1444.0</pointX>
     
          <pointY>2440.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>1444.0</pointX>
     
          <pointY>2160.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>1804.0</pointX>
     
          <pointY>2212.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>2336.0</pointX>
     
          <pointY>2348.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>2160.0</pointX>
     
          <pointY>1940.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>2064.0</pointX>
     
          <pointY>840.0</pointY>
     
        </checkpoint>
     
        <checkpoint>
     
          <pointX>2396.0</pointX>
     
          <pointY>688.0</pointY>
     
        </checkpoint>
     
      </itineraire>
     
    </boost_serialization>
    Je souhaite donc extraire de ce fichier un itinéraire. Voici comment s'articulent les classes sensées extraire un Itinéraire de mon fichier XML :

    La classe Itinéraire (le .h) :

    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
     
    #ifndef ITINERAIRE_H
    #define ITINERAIRE_H
    #include "PointItineraire.h"
     
    class Itineraire {
    	private :
     
    		friend class boost::serialization::access;
     
    		template<class Archive>
    		void serialize(Archive& ar, const unsigned int version)
    		{
    			ar & BOOST_SERIALIZATION_NVP(checkpoint);
    		}
    	public :
    		std::vector<PointItineraire> checkpoint;
    		// Constructeur/destructeur
    		/**
                     *  Constructeur de la classe
                     */
    		Itineraire();
     
    		/**
                     *  Destructeur de la classe
                     */
    		~Itineraire();		
    };
     
    #endif
    Ma classe PointItinéraire (le .h) :

    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
     
    #ifndef POINTITINERAIRE_H
    #define POINTITINERAIRE_H
    // archives Boost
    #include <boost/archive/xml_oarchive.hpp>
    // archives Boost
    #include <boost/archive/xml_oarchive.hpp>
    #include <boost/archive/xml_iarchive.hpp>
    // pour la sérialisation de std::vector
    #include <boost/serialization/vector.hpp>
    class PointItineraire {
    	public :
     
    		double pointX;
    		double pointY;
     
    		// Constructeur/destructeur
    		/**
                     *  Constructeur de la classe
                     */
    		PointItineraire();
     
    		/**
                     *  Destructeur de la classe
                     */
    		~PointItineraire();		
     
    	private :	
    		friend class boost::serialization::access;
     
    		template<class Archive>
    		void serialize(Archive& ar, const unsigned int version)
    		{
    		 ar & BOOST_SERIALIZATION_NVP(pointX) & 
    		 BOOST_SERIALIZATION_NVP(pointY);        
    		}
    };
     
    #endif
    Et pour finir, la classe qui appelle la génération :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    // le .h
    #ifndef ITINERAIREXMLPARSING_H
    #define ITINERAIREXMLPARSING_H
    #include "Itineraire.h"
     
     
    class ItineraireXMLParsing {
    	private :
    		std::string m_sadresseFichierAParser;
    		Itineraire itineraire;
    	public :
     
    		// Constructeur/destructeur
    		/**
                     *  Constructeur de la classe
                     */
    		ItineraireXMLParsing(std::string adresseFichierAParser);
     
    		/**
                     *  Destructeur de la classe
                     */
    		~ItineraireXMLParsing();		
    		void extraireInformationFichier();
    };
     
    #endif
     
    // le .c
     
    #include "ItineraireXMLParsing.h"
    #include <fstream>
    #include <sstream>
     
    // Constructeur/destructeur
    /**
     *  Constructeur de la classe
     */
    ItineraireXMLParsing::ItineraireXMLParsing(std::string adresseFichierAParser)
    {
    	m_sadresseFichierAParser = adresseFichierAParser;
    }
     
    /**
     *  Destructeur de la classe
     */
    ItineraireXMLParsing::~ItineraireXMLParsing(){}	
     
    void ItineraireXMLParsing::extraireInformationFichier()
    {
    	//récupération des infos Itineraire
     
    	//constructeur de ifile avec un char* en paramètre
        std::ifstream ifile(m_sadresseFichierAParser.c_str());
        boost::archive::xml_iarchive ia(ifile);
        ia >> BOOST_SERIALIZATION_NVP(itineraire);
    }
    Mais rien ne se passe après "ia >> BOOST_SERIALIZATION_NVP(itineraire);". Le problème vient certainement du fait que mon objet itinéraire contient en attribut un vector de pointItinéraire, et qu'il ne sait pas comment récupérer les informations de ces points dans le xml. Mais je ne sais pas comment lui indiquer cela, les tutoriels sont simplistes, et axés sur l'extraction de données de bases.

  2. #2
    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
    Tout simplement (dites moi si je me trompe), j'ai l'impression que boost::serialization ne gère pas les répétitions de balises dans du code XML :

    Aussi bien lorsqu'on a quelque chose suivant la structure,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      <baliseA>
        // info de type simple ou composé d'autres balises
      </balisaA>
      <BaliseA>
        // info de type simple ou composée d'autres balises
      </BaliseA>   
    .
    .
    .
    Qu'une arborescence comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <baliseA>
      <baliseB>
        <baliseC>156</baliseC>
      </balisaB>
    </baliseA>
    Il faut forcément dans une sous balise de A une balise (ou plusieurs balises différentes) refermant une valeur de type de base (ou vector avec une balise "count", "item_version" et "item).

  3. #3
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    boost::serialization n'est pas une lib xml attention. Elle ne lira que les ficheirs qu'elle a serialisée elle même.

Discussions similaires

  1. Extraire une liste d'objets d'un fichier XML avec JAXP
    Par autran dans le forum Codes sources à télécharger
    Réponses: 2
    Dernier message: 23/08/2015, 16h11
  2. [Débutant] Création d'un fichier XML et attributs xmlns
    Par DeVaK dans le forum Linq
    Réponses: 7
    Dernier message: 30/04/2013, 11h56
  3. Copier un fichier XML dans un objet
    Par metraon dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 23/01/2013, 00h52
  4. extraire données depuis fichier xml
    Par seeif dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 10/07/2009, 10h18
  5. [SimpleXML] Générer un fichier XML depuis un objet
    Par CactO_o's dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/07/2008, 11h17

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