Обновление XML-файла с помощью Boost property_tree - PullRequest
7 голосов
/ 21 июля 2010

У меня есть следующий 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);

Мне не нравится это решение, потому что оно создает проблемы с более сложными древовидными структурами. Можно ли обновить дерево свойств без удаления / добавления дочерних узлов?

1 Ответ

10 голосов
/ 22 июля 2010

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

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

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);
...