如何在boost property_tree前添加节点

时间:2017-06-05 10:11:56

标签: c++ boost

我有一个xml

<MyXML>
    <Tag2>2</Tag2>
    <Tag3>3</Tag2>
    <Tag4>4</Tag3>
</MyXML>

使用boost :: property_tree :: read_xml将其读入boost :: property_tree :: ptree xmlroot

现在,如果我按

添加新节点
xmlroot.add("MyXML.Tag1", "1");

此新节点将添加到现有标记的后面。在boost :: property_tree :: write_xml之后,我得到了

<MyXML>
    <Tag2>2</Tag2>
    <Tag3>3</Tag2>
    <Tag4>4</Tag3>
    <Tag1>1</Tag1>
</MyXML>

有没有办法在Tag2前插入新节点?

1 个答案:

答案 0 :(得分:1)

这是可能的,但它超出了getadd等标准访问器的范围,因此必须采用更长,更繁琐的迭代器方式。基本上,您需要为节点获取迭代器,并使用insertpush_front在所需位置插入新节点。

完整示例。:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <string>
#include <exception>
#include <iostream>
namespace pt = boost::property_tree;

int main()
{
    try
    {
        std::string xml_content =
"<MyXML> \
    <Tag2>2</Tag2> \
    <Tag3>3</Tag2> \
    <Tag4>4</Tag3> \
</MyXML>";
        std::stringstream xml (xml_content);
        pt::ptree tree;
        pt::read_xml (xml, tree);
        /* ~~~~ KEY STUFF ~~~~ */
        auto root = tree.find("MyXML");
        root->second.push_front({"NewTag", decltype(tree)("1")});
        /* ~~~~ KEY STUFF ~~~~ */
        pt::write_xml (std::cout, tree);
    }
    catch (std::exception &e)
    {
        std::cout << "Error: " << e.what() << "\n";
    }
    return 0;
}

关键的东西解释说:

    auto root = tree.find("MyXML");
    root->second.push_front({"NewTag", decltype(tree)("1")});

好的,所以第一行是没脑子的,我们需要让我们的工作&#34;节点

第二行使用push_front,它在调用者的前面插入一个新节点。但是调用者位于迭代器的second字段,这是find("MyXML")的结果。

然后push_front需要一对密钥和self_type。我使用了对象的大括号初始化,以及键的字符串文字。创建匹配类型的新节点有点棘手,因为使用值的构造函数被标记为显式。所以,必须使用它的类型。我使用decltype的{​​{1}}获得了它。

如果可以简化任何事情,我很高兴地欢迎所有改进。