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

у меня есть немного 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> узлы?

0

Решение

Тип_значения ptree — это std :: pair< Ключ const, 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;
}
}
}
1

Другие решения

ОБНОВИТЬ Заменил мой ответ из-за комментария: я бы рекомендовал вместо этого использовать правильную библиотеку 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

По вопросам рекламы [email protected]