Partage
  • Partager sur Facebook
  • Partager sur Twitter

Parser xml en c++

problème avec les arbres et sous arbres

Sujet résolu
    9 août 2019 à 18:14:29

    Bonjour,

    Je travaille en C++ (débutant)) avec la classe ptree pour parser un fichiers xml.

    voici le fichier xml:

    <?xml version="1.0" encoding="utf-8" ?>
    <model id="xx">
    	<item>
    		<language>de_de</language>
    		<version>1.0.0</version>
    		<buildnumber>1907112036</buildnumber>
    		<url>https://</url> 
    		<filesize>278440</filesize>
    		<releaseNotesLink>5006914856ad3fd4595b44b2ab/ReleaseNote-de-de.html</releaseNotesLink>
    	</item>
    	<item>
    		<language>xx_xx</language>
    		<version>1.1.0</version>
    		<buildnumber>19061035</buildnumber>
    		<url>https:/06914856ad3fd4595b44b2ab/BrailleReader_v1.3.6.UPG</url> 
    		<filesize>2789440</filesize>
    		<releaseNotesLink>b0975006914856ad3fd4595b44b2ab/ReleaseNote.html</releaseNotesLink>
    	</item>
    </model>
    

    Voici mon code c++

    void debug_settings::load(const std::string &filename)
    {
        // Create empty property tree object
        pt::ptree tree, subtree;
    
        // Parse the XML into the property tree.
        pt::read_xml(filename, tree);
    
    
        BOOST_FOREACH(pt::ptree::value_type &v, tree.get_child("model"))
        {
        	subtree = v.second;
        	BOOST_FOREACH(pt::ptree::value_type &v2, subtree)
        	  {
        	    std::cout << v2.first << std::endl;
        	  }
            // The data function is used to access the data stored in a node.
    
        	m_modules.insert(v.second.data());
        }
    
    }
    int main()
    {
        try
        {
            debug_settings ds;
            ds.load("/home/yassinen/eclipse-workspace/testPtree/file.xml");
            std::cout << "Success\n";
        }
        catch (std::exception &e)
        {
            std::cout << "Error: " << e.what() << "\n";
        }
        return 0;
    }

    Problème : je n'arrive pas à afficher le contenu de "id", "language", "version" ...
    Voici le résultat actuel :

    id
    language
    version
    buildnumber
    url
    filesize
    releaseNotesLink
    language
    version
    buildnumber
    url
    filesize
    releaseNotesLink
    Success

    • Partager sur Facebook
    • Partager sur Twitter
    give to get :)
      9 août 2019 à 18:26:56

      Normal puisque c'est tout ce que tu affiche .. :
      std::cout << v2.first << std::endl; 

       Tu n'affiche que 'first' qui doit etre le nom de la balise ... essaie avec v2.second pour voir ..

      • Partager sur Facebook
      • Partager sur Twitter
        9 août 2019 à 19:08:23

        Salut Zérotisme,

        Je l'ai déja fait mais voici le résultat :

          BOOST_FOREACH(pt::ptree::value_type &v, tree.get_child("model"))
            {
            	subtree = v.second;
            	BOOST_FOREACH(pt::ptree::value_type &v2, subtree)
            	  {
            	    std::cout << v2.first << std::endl;
            	    std::cout << v2.second.get<std::string>(v2.first) << std::endl;
        
            	  }
                // The data function is used to access the data stored in a node.
            }

        Résultat de l’exécution :

        id
        Error: No such node (id)

        • Partager sur Facebook
        • Partager sur Twitter
        give to get :)
          9 août 2019 à 19:46:15

          pourquoi "
          v2.second.get<std::string>(v2.first);

           si v2.first  c'est le nom de la balise , v2.second devrait etre ce qu'elle contient non ? Quel est le type de v2.second ?

          De ce que je comprend tu a fait un "get(id)" .. si tu as access a des fonctions comme des getters , verify si ton v2.second n'a pas une fonction du genre "innerText" ou "value" ..

          • Partager sur Facebook
          • Partager sur Twitter
            9 août 2019 à 20:30:24

            Pour info, tu as un parseur xml presque complet et surtout header only, il parse et bien sûr, il permet de construire un xml. Son nom, rapidxml, parce qu'en plus d'être header only, côté performance, il envoie sévère... Le seul hic, c'est la prise en main, au début on galère un peu pour construire un arbre, c'est très bas niveau, c'est toujours délicat le bas niveau. Pour seconde info, il est utilisé dans boost::property_set, justement pour le stockage en fichier xml. Perso je l'ai un peu torturé, le bestiau me gère des xml de 50 Mo les doigts dans le nez ;p
            • Partager sur Facebook
            • Partager sur Twitter
            Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
              9 août 2019 à 20:47:34

              Je me souviens à une époque, j'avais fait un parseur de XML directement à la main from scratch. J'avais trouvé ça rigolo.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                9 août 2019 à 21:28:38

                Au boulot, on utilise souvent TinyXml en embarqué, c'est super facile à prendre en main, et on a jamais de gros volumes à traiter, donc ça le fait bien (en plus on a une totale maîtrise du format, tout est chiffré. Rapidxml, c'est plus chaud à gérer mais les perfs sont pas les mêmes... 

                @FVirtman tu devrais regarder lre code source de rapidxml, c'est assez chaud, mais très instructif ;)

                • Partager sur Facebook
                • Partager sur Twitter
                Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                  11 septembre 2019 à 17:45:36

                  Salut tout le monde,

                  Désolé de ma réponse tardive , j'ai résolu mon problème, le soucis venait du format xml.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  give to get :)

                  Parser xml en c++

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown