我有以下 XML 文件:




我想添加一个新节点: Parameter2="2"到 Data 节点。这段代码不起作用,保存的文件仍然只包含一个参数:

boost::property_tree::ptree 树;
boost::property_tree::ptree 数据树;

read_xml("test.xml", 树);
dataTree = tree.get_child("数据");
dataTree.put("Parameter2", "2");

boost::property_tree::xml_writer_settings w(' ', 4);
write_xml("test.xml", tree, std::locale(), w);

如果我在 dataTree.put 之后添加这两行,我会得到正确的结果:

树。清除();
tree.add_child("数据", dataTree);

我不喜欢这个解决方案,因为它会产生更复杂的树结构问题。是否可以在不删除/添加子节点的情况下更新属性树?

最佳答案

您的代码几乎是正确的,这是更新子节点的正确方法。

但是,有一个小错误。当你输入:

dataTree = tree.get_child("Data");

您将“子项”的拷贝分配给 dataTree。因此,下一行指的是拷贝,而不是您的层次结构。你应该写:
boost::property_tree::ptree &dataTree = tree.get_child("Data");

因此,您获得了对 child 的引用。

完整的例子是:
  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-08 09:27