У меня есть следующий XML-файл:
<xml version="1.0" encoding="utf-8"?> <Data> <Parameter1>1</Parameter1> </Data>
Я хочу добавить новый узел: Parameter2 = "2" к Узлу данных. Этот код не работает, сохраненный файл все еще содержит только один параметр:
boost::property_tree::ptree tree; boost::property_tree::ptree dataTree; read_xml("test.xml", tree); dataTree = tree.get_child("Data"); dataTree.put("Parameter2", "2"); boost::property_tree::xml_writer_settings w(' ', 4); write_xml("test.xml", tree, std::locale(), w);
Если я добавляю эти две строки после dataTree.put, я получаю корректный результат:
tree.clear(); tree.add_child("Data", dataTree);
Мне не нравится это решение, потому что оно создает проблемы с более сложным деревом structutes. Действительно ли возможно обновить дерево свойства, не удаляя/добавляя дочерние узлы?
Ваш код почти правильный, это правильный способ обновления дочернего узла.
Однако есть небольшая ошибка. Когда вы вводите:
dataTree = tree.get_child("Data");
Вы присваиваете dataTree копию "ребенка". Таким образом, следующая строка относится к копии, а не к вашей иерархии. Вы должны написать:
boost::property_tree::ptree &dataTree = tree.get_child("Data");
Таким образом, вы получаете ссылку на дочернее дерево.
Полный пример:
using namespace boost::property_tree;
ptree tree;
read_xml("data.xml", tree);
ptree &dataTree = tree.get_child("Data");
dataTree.put("Parameter2", "2");
xml_writer_settings<char> w(' ', 4);
write_xml("test.xml", tree, std::locale(), w);