Обновление XML-файла с помощью Повышения property_tree

У меня есть следующий 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. Действительно ли возможно обновить дерево свойства, не удаляя/добавляя дочерние узлы?

7
задан Alex F 21 July 2010 в 12:24
поделиться

1 ответ

Ваш код почти правильный, это правильный способ обновления дочернего узла.

Однако есть небольшая ошибка. Когда вы вводите:

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);
10
ответ дан 7 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: