Увеличете дървото на свойствата: Премахнете възел

Как бихте премахнали възел от дървото на свойствата на boost xml?

Имам такъв документ:

<folders>
  <folder>some/folder</folder>
  <folder>some/folder</folder>
  <folder>some/folder</folder>
</folders>

Знам как да повторя и отпечатам всички папки, но как да премахна един от елементите и да запазя xml обратно?


person Rasmus Styrk    schedule 15.06.2012    source източник


Отговори (2)


Вероятно бих опитал:

boost::property_tree::ptree pt;

pt.erase(key);
person yosoy89    schedule 01.04.2013
comment
Това ще изтрие първия ключ, а не конкретен ключ .-- това е проблем, ако вашето дъщерно дърво съдържа повече от един ключ с едно и също име. - person Michał Leon; 12.08.2014

Е, направих го по следния начин:

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;
    }
}
person Rasmus Styrk    schedule 15.06.2012
comment
Не използвайте изключения за контрол на потока. - person Byzantian; 29.05.2014