Boost属性树:删除节点

Ras*_*yrk 5 c++ boost boost-propertytree

如何从boost xml属性树中删除节点?

我有一个这样的文件:

<folders>
  <folder>some/folder</folder>
  <folder>some/folder</folder>
  <folder>some/folder</folder>
</folders>
Run Code Online (Sandbox Code Playgroud)

我知道如何迭代和打印所有文件夹,但我如何删除其中一个项目并保存xml?

yos*_*y89 5

我可能会尝试:

boost::property_tree::ptree pt;

pt.erase(key);
Run Code Online (Sandbox Code Playgroud)

  • 这将删除第一个键,而不是特定键.--如果您的子树包含多个具有相同名称的键,则会出现问题. (5认同)

Ras*_*yrk 0

嗯,我是这样做的:

void Backups::removeGeneric(const std::string key, const std::string value)
{
    boost::property_tree::ptree pt;
    boost::property_tree::xml_parser::read_xml(Backups::getBackupFile(), pt);

    bool remove = true;

    try {
        pt.get_child(key);
    }
    catch(boost::exception &ex)
    {  
        std::cout << "There is nothing to remove." << std::endl;
        remove = false;
    }

    if(remove)
    {  
        bool exists = false;

        boost::property_tree::ptree newPt;

        BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child(key))
        {  
            if(v.second.data() != value)
                newPt.add("scheme", v.second.data());

            if(v.second.data() == value)
                exists = true;
        }

        if(exists)
        {  
            pt.put_child(key, newPt);
            boost::property_tree::xml_parser::write_xml(Backups::getBackupFile(), pt);

            std::cout << value << " was removed." << std::endl;
        }
        else
            std::cout << value << " is not added." << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不要使用异常来进行流量控制。 (3认同)