代码之家  ›  专栏  ›  技术社区  ›  Alex F

使用Boost属性树更新XML文件

  •  7
  • Alex F  · 技术社区  · 14 年前

    我有以下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 回复  |  直到 14 年前
        1
  •  10
  •   J. Calleja    14 年前

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

    dataTree = tree.get_child("Data");
    

    分配给 “孩子”的副本。因此,下一行指的是副本,而不是您的层次结构。你应该写:

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