Boost属性树:如何使用xml文件获取子树的子节点

时间:2017-04-05 19:19:11

标签: c++ boost

我尝试使用Boost库(版本1.57.0.2)解析一个简单的xml文件,然后尝试访问链接字段值。

请在我的xml文件下面找到:

<?xml version="1.0" encoding="UTF-8"?>
<down>
    <food name="cream">
        <link name="123" />
        <link name="456" />
    </food>
    <tel name="ice">
        <link name="78" />
        <link name="90" />
    </tel>
</down>

我试着看看如何从网上获取孩子的孩子并做同样的事情,但我不明白为什么它不适用于我的代码。

我有以下错误:

error: 'const value_type {aka const struct std::pair<const std::__cxx11::basic_string<char>, boost::property_tree::basic_ptree<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >}' has no member named 'get_child'|

请在下面找到我的代码:

boost::property_tree::xml_parser::read_xml(path.xml, tree);

BOOST_FOREACH(const boost::property_tree::ptree::value_type &child_tree, tree.get_child("down"))
{
    std::string tree_balise = tree.first;

    if (tree_balise == "food")
    {
        BOOST_FOREACH(const boost::property_tree::ptree::value_type &child_of_child_tree, child_tree.get_child("food"))
        {
            std::cout << "I am in the child of child tree" << std::endl;
        }
    }
}

有人能告诉我为什么会出现这个错误吗? 我错过了什么吗?

感谢您的帮助。

三轮。

1 个答案:

答案 0 :(得分:1)

  1. 实际上boost::property_tree::ptree::value_typepair key_type(在您的情况下为std::string)和ptree。因此,在第二个FOREACH中,您必须使用child_tree.second,并且错误表明pair没有get_child成员函数。

  2. 在第二个FOREACH范围内,您已经进入&#34;食物&#34;子树。所以它没有&#34;食物&#34;子。

    BOOST_FOREACH( const ptree::value_type & child_tree, tree.get_child("down") )
    {
        std::string tree_balise = child_tree.first;
    
        if (tree_balise == "food")
        {
            BOOST_FOREACH( const ptree::value_type & child_of_child_tree, child_tree.second )
            {
                std::cout << "I am in the child of child tree " << child_of_child_tree.first << std::endl;
            }
        }
    }
    
  3. 另请注意,您可以直接获得&#34; down.food&#34;子树。

    BOOST_FOREACH( const ptree::value_type & child_tree, tree.get_child("down.food") )
    {
        std::cout << "I am in the child of child tree " << child_tree.first << std::endl;
    }