0

我刚刚发现了 boost::property_tree,这似乎是我问题的完美答案。我编写了一个小测试程序来从 xml 文件中提取特定数据。我已使用文档中提供的示例作为指南。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>

编码:

        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;
        } 

注意:我正在尝试提取值(ABC 和内部值,如 A - string - 6 - ABC,对于每个 GROUP - 以及每组“行”,我将对其进行处理,然后以不同的格式输出)。请参阅代码中的注释以了解我尝试过的内容。
到目前为止,最好的结果是:(print() 中的内容:

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

我无法从多条记录中获取数据!请帮忙,给我一个建议 - 我做错了什么?
谢谢你。

4

1 回答 1

2

您在迭代中缺少一个级别。您需要遍历具有多个具有相同名称的子元素的元素。

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.
}

下树时酌情重复。

于 2012-05-21T23:37:21.113 回答