boost property_tree在循环中添加节点

时间:2014-11-07 23:10:27

标签: c++ arrays xml boost boost-propertytree

在循环数组时如何向属性树添加节点?

这可能是一件简单的事情,但我只是不明白如何使用boost_property_tree。

我有一个值数组,我想要添加到属性树并将其输出为xml。如果我硬编码节点并手动将它们添加到根节点,它可以工作,但如果我尝试从循环内部执行它,则xml无效,只包含数组中的一个节点,并且没有任何xml节点终止。

这是一个可变长度的数据数组,因此无法对节点进行硬编码。做这样的事情根本行不通。我不明白为什么?

ptree listnode;
std::vector<data> dataarray= ...
for(auto data : dataarray)
{
    ptree node;
    ...

    listnode.add_child("value", node)
}
...

我想要的是这样的:

<list>
    <value active="true">12</value>
    <value active="true">44</value>
    <value active="true">23</value>
</list>

但是生成的xml看起来像这样:

<list>
    <value active="true">

它在第一个值节点之后停止。没有例外或任何事情,所以我假设我的property_tree无效或者xml_parser :: write_xml无法创建xml。

我很可能误解了如何使用boost :: property_tree。但实际上,输出列表必须非常简单?

1 个答案:

答案 0 :(得分:3)

<强> Live On Coliru

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

using namespace boost::property_tree;

int main() {
    ptree pt;

    auto& list = pt.add_child("list", ptree{});

    for (auto data : { 12, 44, 23 })
        list.add("value", data)
            .add("<xmlattr>.active", true);

    xml_parser::write_xml(std::cout, pt);
}

产生的XML:

<?xml version="1.0" encoding="utf-8"?>
<list>
    <value active="true">12</value>
    <value active="true">44</value>
    <value active="true">23</value>
</list>