2

私はこのようなxmlを持っています

<examples>
<example>
<test name="img">testme</test>
<test name="img1">testme1</test>
<test name="img1">testme2</test>
</example>
<example>
<test name="text">testme</test>
<test name="text">testme1</test>
<test name="text">testme2</test>
</example>
</examples>

このコードを試してみましたが、最初のサンプルノードのみが抽出されます

ptree ptree;
        read_xml(doc_path, ptree);

        BOOST_FOREACH(ptree::value_type & value, ptree.get_child("examples.example")){
           cout<<value.second.get("<xmlattr>.name", "")<<endl;
           cout<<value.second.data()<<endl;

}

4

1 に答える 1

7

ptree.equal_range メソッドには、探している動作があります。注意してください、そこにはいくつかの C++11 があります。最新のコンパイラが必要です。

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <sstream>

const char xml[] = R"(<examples>
<example>
<test name="img">testme</test>
<test name="img1">testme1</test>
<test name="img1">testme2</test>
</example>
<example>
<test name="text">testme</test>
<test name="text">testme1</test>
<test name="text">testme2</test>
</example>
</examples>)";


int main(int argc, char **argv)
{

    boost::property_tree::ptree ptree;
    std::istringstream xml_str(xml);
    read_xml(xml_str, ptree);

    auto example_range = ptree.get_child("examples").equal_range("example");

    for( auto it = example_range.first; it != example_range.second; ++it )
    {
        auto test_range = it->second.equal_range("test");
        for( auto test_it = test_range.first; test_it != test_range.second; ++test_it )
        {
            std::cout << test_it->second.get("<xmlattr>.name","") <<std::endl;
            std::cout << test_it->second.data() << std::endl;
        }
    }

    return 0;
}
于 2013-03-22T07:15:57.457 に答える