Как удалить узел из дерева? (boost, Boost.PropertyTree)

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 660
ОС: астралинукс

Как удалить узел из дерева? (boost, Boost.PropertyTree)

Сообщение жучара »

Друзья! Имею такое дерево:


x
-e
--k
-r
--d
-y
--z

Создаю я его так:

Код: Выделить всё

//foo.cpp
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace std;
namespace pt = boost::property_tree;

int main ()
{
    boost::property_tree::ptree step;
    
    step.put("x.e.k", "");
    step.put("x.r.d", "");
    step.put("x.y.z", "");

    pt::write_xml ("dst.xml", step);
    
    system ("xmllint -oldxml10 --shell dst.xml <<< du | head -n -1 | tail -n +2");

    return 0;
}
И мне хочется убрать из дерева узел, который по пути "x.r.d" (выделил красным)

Обратите внимание, для добавления узлов дерева я использую такой синтаксис:
https://www.boost.org/doc/libs/1_74_0/doc/html/boost/property_tree/basic_ptree.html#id-1_3_32_10_7_1_1_1_3_72-bb
template<typename Type> self_type & put(const path_type &, const Type &);
То есть добавляем путь к узлу одной строчкой. Чтобы убрать этот путь, достаточо было бы такого же синтаксиса, типа:
erase (const path_type &);
Всё было бы решено. Но, понятное дело, ничего такого нет, а чтобы всех запутать для удаления узлов вот чё придумали:

https://www.boost.org/doc/libs/1_74_0/doc/html/boost/property_tree/basic_ptree.html
iterator erase(iterator);
iterator erase(iterator, iterator);
size_type erase(const key_type &);
То есть удаляем либо по итератору, либо по-какому мифическому key_type. Да, но я-то работаю правильно, с простыми и понятными значениями path_type, которым почему-то не нашлось места при удалении узлов.

------------------------------------------------------------------------

Также нельзя найти через path_type значение iterator узла или key_type узла, чтобы потом через них удалить узел. Нет таких методов. Не знаю вот, что делать. Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 660
ОС: астралинукс

Re: Как удалить узел из дерева? (boost, Boost.PropertyTree)

Сообщение жучара »

Ну что, ребята, есть какие-нибудь идеи?
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 660
ОС: астралинукс

Re: Как удалить узел из дерева? (boost, Boost.PropertyTree)

Сообщение жучара »

Я даже уже научился получать поддерево из основного дерева:

Код: Выделить всё

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
using namespace std;
namespace pt = boost::property_tree;

int main ()
{
    boost::property_tree::ptree step;

    
    step.put("x", "");
    step.put("x.e", "");
    step.put("x.e.k", "");

    step.put("x.r", "");
    step.put("x.r.d", "");

    step.put("x.y.z.a.b", "");
    step.put("x.y.z.k.n.b", "");
    step.put("x.y.z.k.h.p", "");

    step.put("x.m.q.w.t", "");
    
    pt::write_xml ("dst.xml", step);
    
    system ("xmllint -oldxml10 --shell dst.xml <<< du | head -n -1 | tail -n +2");

    cout << "---------------------------------------------------" << endl;
    
    boost::property_tree::ptree qqq = step.get_child("x.y");
    
    pt::write_xml ("dst_2.xml", qqq);
    system ("xmllint -oldxml10 --shell dst_2.xml <<< du | head -n -1 | tail -n +2");
    return 0;
}

Shell

$ ./a.out
x
e
k
r
d
y
z
a
b
k
n
b
h
p
m
q
w
t
---------------------------------------------------
z
a
b
k
n
b
h
p
$
А смысл? Мне нужно научиться не смотреть на поддерево, а убирать его из основного.
Я просто читаю маны.
Спасибо сказали:

IMB
Сообщения: 2513
ОС: Debian

Re: Как удалить узел из дерева? (boost, Boost.PropertyTree)

Сообщение IMB »

Что Вы хотите услышать? Авторы библиотеки по неким соображениям не добавили ожидаемого Вами API, напишите им об этом или сделайте свои функции реализующие нужный Вам функционал на текущем API.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 660
ОС: астралинукс

Re: Как удалить узел из дерева? (boost, Boost.PropertyTree)

Сообщение жучара »

IMB писал(а):
30.11.2020 20:10
Что Вы хотите услышать?
помощь какую-никакую. Впрочем, подвижки есть. Вот так можно удалить узел:

Код: Выделить всё

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
using namespace std;
namespace pt = boost::property_tree;

int main ()
{
    boost::property_tree::ptree step;

    
    step.put("x", "");
    step.put("x.e", "");
    step.put("x.e.k", "");

    step.put("x.r", "");
    step.put("x.r.d", "");

    step.put("x.y.z.a.b", "");
    step.put("x.y.z.k.n.b", "");
    step.put("x.y.z.k.h.p", "");

    step.put("x.m.q.w.t", "");
    
    pt::write_xml ("dst.xml", step);
    
    system ("xmllint -oldxml10 --shell dst.xml <<< du | head -n -1 | tail -n +2");

    cout << "---------------------------------------------------" << endl;
    
    step.get_child ("x.y").erase ("z");

    pt::write_xml ("dst_3.xml", step);
    
    system ("xmllint -oldxml10 --shell dst_3.xml <<< du | head -n -1 | tail -n +2");
 

    return 0;
}

Shell

$ ./a.out
x
e
k
r
d
y
z
a
b
k
n
b
h
p
m
q
w
t
---------------------------------------------------
x
e
k
r
d
y
m
q
w
t
$
разбираемся дальше.
Я просто читаю маны.
Спасибо сказали: