Как скопировать поддерево из Boost.PropertyTree

0

У меня есть boost::property_tree::ptree. Мне нужно дерево с удалением некоторых элементов с определенным именем тега. Например, xml для источника ptree выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<document>
  <B atr="one" atr1="something">
    <to_remove attr="two">10</to_remove>
  </B>
  <to_remove>
    <C>value</C>
    <D>other value</D>
  </to_remove>
  <E>nothing</E>
</document>

И я хотел бы получить ptree с xml следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<document>
  <B atr="one" atr1="something" />
  <E>nothing</E>
</document>

Как написать функцию, которая генерирует новый ptree с удаленными узлами <to_remove>?

Теги:
boost
boost-propertytree

2 ответа

1
Лучший ответ

Значение value_type ptree является std :: pair <const Key, self_type>, поэтому вы можете итерировать дерево и удалять соответствующие узлы. Ниже приведен образец.

void remove(ptree &pt){
using namespace boost::property_tree;
    for (auto p = pt.begin(); p != pt.end();){
        if (p->first == "to_remove"){
            p = pt.erase(p);
        }
        else{
            remove(p->second);
            ++p;
        }
    }
}
0

ОБНОВЛЕНИЕ Заменен мой ответ из-за комментария: я бы рекомендовал вместо этого использовать правильную библиотеку XML.

Я считаю, что Boost PropertyTree использует модифицированный RapidXml внутри (но это деталь реализации, поэтому я не уверен, что буду зависеть от него). Здесь я использую PugiXML, который представляет собой современную, не-проверяющую XML-библиотеку:

#include <pugixml.hpp>
#include <iostream>

int main()
{
    pugi::xml_document doc;
    doc.load_file("input.txt");

    for (auto& to_remove : doc.select_nodes("descendant-or-self::to_remove/.."))
        while (to_remove.node().remove_child("to_remove"));

    doc.save(std::cout);
}

Печать

<?xml version="1.0"?>
<document>
    <B atr="one" atr1="something" />
    <E>nothing</E>
</document>
  • 0
    Спасибо. Тем не менее, это решение не подходит, потому что оно вряд ли определяется конкретной структурой XML.
  • 0
    @ Свет, ну, у меня нет терпения, чтобы показать вам, как именно катиться с деревом свойств, я полагаю, вы тоже можете прочитать документы. Я обновил свой ответ, чтобы показать вам, что я буду делать вместо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню