Question

Je viens de découvrir Boost :: Property_tree, qui semble la réponse parfaite à mon problème.J'ai écrit un petit programme de test pour extraire des données spécifiques d'un fichier XML.J'ai utilisé l'exemple fourni dans la documentation comme guide. Le fichier XML: test.xml:

<section>
    <GROUP>
        <g_name>ABC</g_name>
        <fields>
            <row>
                <name>A</name>
                <datatype>string</datatype>
                <field_size>6</field_size>
                <value>ABC</value>
            </row>
            <row>
                <name>B</name>
                <datatype>integer</datatype>
                <field_size>5</field_size>
                <value>00107</value>
            </row>
            <row>
                <name>C</name>
                <datatype>string</datatype>
                <field_size>20</field_size>
                <value>LOTS OF LETTERS     </value>
            </row>
        </fields>
    </GROUP>
    <GROUP>
        <g_name>CDE</g_name>
        <fields>
            <row>
                <name>A</name>
                <datatype>string</datatype>
                <field_size>6</field_size>
                <value>CDE</value>
            </row>
            <row>
                <name>B</name>
                <datatype>integer</datatype>
                <field_size>5</field_size>
                <value>00100</value>
            </row>
            <row>
                <name>F</name>
                <datatype>integer</datatype>
                <field_size>4</field_size>
                <value>1970</value>
            </row>
        </fields>
    </GROUP>
</section>

Le code:

        using boost::property_tree::ptree;
        struct t_collection
        {
            ptree pt;
            void load(const std::string &filename);
            void print();
        };
        void t_collection::load(const std::string &filename)
        {
            read_xml(filename, pt);
        }
        void t_collection::print()
        {
                BOOST_FOREACH(ptree::value_type &v, pt.get_child("section.GROUP"))
BOOST_FOREACH(ptree::value_type &v, pt.get_child("section.GROUP"))
{
    printf("X: %s->", v.second.data().c_str());
    //prints X: ABC ->
    BOOST_FOREACH(ptree::value_type &w, pt.get_child("section.GROUP.fields.row"))
        printf("%s\n", w.second.data().c_str());
    //prints A, string, 6, ABC - that is good for first iteration but there should be 3 iterations here
}
//then prints X: and just "" and repeats the set from the first one 
        }
        int main()
        {
            try
            {
                t_collection t1;
                t1.load("test.xml");
                t1.print();
            }
            catch (std::exception &e)
            {
                std::cout << "Error: " << e.what() << "\n";
            }
            return 0;
        } 

Remarque: j'essaie d'extraire les valeurs (ABC et les valeurs intérieures, telles que la chaîne - 6 - ABC, pour chaque groupe - et chaque ensemble de "rangée", que je vais traiter puis sorties dans un autreformat).S'il vous plaît voir comment le code pour quelque chose que j'ai essayé.
Jusqu'à présent, le meilleur résultat était avec: (contenu à l'intérieur de l'impression ():

BOOST_FOREACH(ptree::value_type &z, pt.get_child("section"))
    //BOOST_FOREACH(ptree::value_type &v, pt.get_child("section.GROUP"))
        {
            printf("X: %s->", pt.get<std::string>("section.GROUP.g_mame", "default").c_str());
            //prints X: ABC ->
            BOOST_FOREACH(ptree::value_type &w, pt.get_child("section.GROUP.fields.row"))
            {
                printf("%s\n", pt.get<std::string>("section.GROUP.fields.row.name", "name").c_str());
                printf("%s\n", pt.get<std::string>("section.GROUP.fields.row.datatype", "type").c_str());
                printf("%s\n", pt.get<std::string>("section.GROUP.fields.row.field_size", "size").c_str());
                printf("%s\n", pt.get<std::string>("section.GROUP.fields.row.value", "value").c_str());
            }
        }
        //prints x: default->A, string, 6, ABC (3 times) then repeat identically

Je ne peux pas obtenir les données de plus d'un enregistrement!S'il vous plaît aider, donnez-moi une suggestion - qu'est-ce que je fais mal?
Merci.

Était-ce utile?

La solution

Vous manquez un niveau dans votre itération.Vous devez parcourir les éléments qui ont plusieurs enfants avec le même nom.

std::pair<ptree::const_assoc_iterator, ptree::const_assoc_iterator>
    r(pt.get_child("section").equal_range("GROUP"));

for (ptree::const_assoc_iterator i(r.first); i != r.second; ++i) {
    // Do something with each group.
}

Répétez la répétition selon laquelle vous descendez l'arborescence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top